* src/vm/global.h (ACC_CLASS_REFLECT_MASK): Added.
authoredwin <none@none>
Mon, 24 Apr 2006 17:16:45 +0000 (17:16 +0000)
committeredwin <none@none>
Mon, 24 Apr 2006 17:16:45 +0000 (17:16 +0000)
(ACC_CLASS_HAS_POINTERS): Likewise.
(vim boilerplate): Added.

* src/vm/loader.c (load_field): Set ACC_CLASS_HAS_POINTERS flag.

* src/vm/linker.c (link_class_intern): OR ACC_CLASS_HAS_POINTERS flag.

* src/vm/builtin.c (builtin_new): Use ACC_CLASS_HAS_POINTERS to determine
which kind of memory to allocate.

* src/native/vm/VMClass.c (Java_java_lang_VMClass_getModifiers): Mask
reported access flags with ACC_CLASS_REFLECT_MASK.

src/native/vm/VMClass.c
src/vm/builtin.c
src/vm/global.h
src/vm/linker.c
src/vm/loader.c

index 44dc2b3f19d4f0da5c98f01da0e0c6b9afc2e08c..341cdffd04b7c731f0d680dbec5087785d5d1672 100644 (file)
@@ -30,7 +30,7 @@
             Christian Thalinger
             Edwin Steiner
 
-   $Id: VMClass.c 4725 2006-04-04 08:45:43Z twisti $
+   $Id: VMClass.c 4829 2006-04-24 17:16:45Z edwin $
 
 */
 
@@ -321,16 +321,16 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass cla
 
                                if (outer.any)
                                        /* return flags got from the outer class file */
-                                       return c->innerclass[i].flags;
+                                       return c->innerclass[i].flags & ACC_CLASS_REFLECT_MASK;
                                else
-                                       return c->flags;
+                                       return c->flags & ACC_CLASS_REFLECT_MASK;
                        }
                }
        }
 
        /* passed class is no inner class or it was not requested */
 
-       return c->flags;
+       return c->flags & ACC_CLASS_REFLECT_MASK;
 }
 
 
index 0529680f0eb1d81aa2b5267cfe827dcd5db68432..060b3a79b541ce0536a09b74397edddba570db2b 100644 (file)
@@ -37,7 +37,7 @@
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 4815 2006-04-23 19:16:54Z edwin $
+   $Id: builtin.c 4829 2006-04-24 17:16:45Z edwin $
 
 */
 
@@ -781,7 +781,8 @@ java_objectheader *builtin_new(classinfo *c)
                        return NULL;
        }
 
-       o = heap_allocate(c->instancesize, true, c->finalizer);
+       o = heap_allocate(c->instancesize, c->flags & ACC_CLASS_HAS_POINTERS,
+                                         c->finalizer);
 
        if (!o)
                return NULL;
@@ -794,7 +795,7 @@ java_objectheader *builtin_new(classinfo *c)
 
        CYCLES_STATS_GET(cycles_end);
        RT_TIMING_GET_TIME(time_end);
-       
+
        CYCLES_STATS_COUNT(builtin_new,cycles_end - cycles_start);
        RT_TIMING_TIME_DIFF(time_start, time_end, RT_TIMING_NEW_OBJECT);
 
index 2d933a228c20f71037e66d4580b4410c958b9e2e..ecfa4e55b9c184e904afc8c75b6ad024995debbd 100644 (file)
@@ -33,7 +33,7 @@
             Joseph Wenninger
             Christian Thalinger
 
-   $Id: global.h 4728 2006-04-04 09:17:05Z twisti $
+   $Id: global.h 4829 2006-04-24 17:16:45Z edwin $
 
 */
 
@@ -192,6 +192,11 @@ typedef struct java_objectarray java_objectarray;
 #define ACC_ENUM            0x4000
 #define ACC_MIRANDA         0x8000
 
+/* special flags used in classinfo ********************************************/
+
+#define ACC_CLASS_REFLECT_MASK 0x0000ffff     /* flags reported by reflection */
+#define ACC_CLASS_HAS_POINTERS 0x00010000     /* instance contains pointers   */
+
 
 /* data structures of the runtime system **************************************/
 
@@ -314,4 +319,5 @@ void compiler_unlock();
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */
index aeab9fd6a6a3333b3a9043a58091d5046b66b231..9c09210c9ed85c9ce8458f007924e2c33c708586 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: linker.c 4803 2006-04-21 00:00:22Z edwin $
+   $Id: linker.c 4829 2006-04-24 17:16:45Z edwin $
 
 */
 
@@ -565,11 +565,17 @@ static classinfo *link_class_intern(classinfo *c)
                                                                          "Cannot inherit from final class");
                        return NULL;
                }
+
+               /* link the superclass if necessary */
                
                if (!(super->state & CLASS_LINKED))
                        if (!link_class(super))
                                return NULL;
 
+               /* OR the ACC_CLASS_HAS_POINTERS flag */
+
+               c->flags |= (super->flags & ACC_CLASS_HAS_POINTERS);
+
                /* handle array classes */
 
                if (c->name->text[0] == '[')
@@ -582,7 +588,7 @@ static classinfo *link_class_intern(classinfo *c)
                        c->index = super->index + 1;
                
                c->instancesize = super->instancesize;
-               
+
                vftbllength = supervftbllength = super->vftbl->vftbllength;
                
                c->finalizer = super->finalizer;
index aff82d550d7a6e7cf0de0aaa65d83a1d7339c388..343ec264d76a8843f8b8b74c31ef0df9f6760f96 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: loader.c 4772 2006-04-13 20:45:16Z edwin $
+   $Id: loader.c 4829 2006-04-24 17:16:45Z edwin $
 
 */
 
@@ -876,16 +876,19 @@ static bool load_field(classbuffer *cb, fieldinfo *f, descriptor_pool *descpool)
                }
        }
 #endif /* ENABLE_VERIFIER */
-               
+
        f->type   = jtype = descriptor_to_basic_type(f->descriptor); /* data type */
        f->offset = 0;                             /* offset from start of object */
        f->class  = c;
-       
+
        switch (f->type) {
        case TYPE_INT:     f->value.i = 0; break;
        case TYPE_FLOAT:   f->value.f = 0.0; break;
        case TYPE_DOUBLE:  f->value.d = 0.0; break;
-       case TYPE_ADDRESS: f->value.a = NULL; break;
+       case TYPE_ADDRESS: f->value.a = NULL;
+                                          if (!(f->flags & ACC_STATIC))
+                                                  c->flags |= ACC_CLASS_HAS_POINTERS;
+                                          break;
        case TYPE_LONG:
 #if U8_AVAILABLE
                f->value.l = 0; break;
@@ -1675,7 +1678,7 @@ classinfo *load_class_bootstrap(utf *name)
        /* create the classinfo */
 
        c = class_create_classinfo(name);
-       
+
        /* handle array classes */
 
        if (name->text[0] == '[') {