(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.
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 $
*/
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;
}
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 $
*/
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;
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);
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 $
*/
#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 **************************************/
* c-basic-offset: 4
* tab-width: 4
* End:
+ * vim:noexpandtab:sw=4:ts=4:
*/
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 $
*/
"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] == '[')
c->index = super->index + 1;
c->instancesize = super->instancesize;
-
+
vftbllength = supervftbllength = super->vftbl->vftbllength;
c->finalizer = super->finalizer;
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 $
*/
}
}
#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;
/* create the classinfo */
c = class_create_classinfo(name);
-
+
/* handle array classes */
if (name->text[0] == '[') {