summaryrefslogtreecommitdiff
path: root/libjava/include
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/include')
-rw-r--r--libjava/include/boehm-gc.h1
-rw-r--r--libjava/include/execution.h20
2 files changed, 19 insertions, 2 deletions
diff --git a/libjava/include/boehm-gc.h b/libjava/include/boehm-gc.h
index e7802b68035..4e2a06b8903 100644
--- a/libjava/include/boehm-gc.h
+++ b/libjava/include/boehm-gc.h
@@ -19,6 +19,7 @@ extern "C"
{
void *_Jv_MarkObj (void *, void *, void *, void *);
void *_Jv_MarkArray (void *, void *, void *, void *);
+ void _Jv_RegisterLibForGc (const void *);
}
// Enough stuff to inline _Jv_AllocObj. Ugly.
diff --git a/libjava/include/execution.h b/libjava/include/execution.h
index 88189f6449e..fe141e91ec9 100644
--- a/libjava/include/execution.h
+++ b/libjava/include/execution.h
@@ -55,9 +55,25 @@ struct _Jv_CompiledEngine : public _Jv_ExecutionEngine
return NULL;
}
- static void do_allocate_static_fields (jclass, int, int)
+ static void do_allocate_static_fields (jclass klass,
+ int pointer_size,
+ int other_size)
{
- // Compiled classes don't need this.
+ // Splitting the allocations here lets us scan reference fields
+ // and avoid scanning non-reference fields.
+ char *reference_fields = (char *) _Jv_AllocRawObj (pointer_size);
+ char *non_reference_fields = (char *) _Jv_AllocBytes (other_size);
+
+ for (int i = 0; i < klass->field_count; i++)
+ {
+ _Jv_Field *field = &klass->fields[i];
+
+ if ((field->flags & java::lang::reflect::Modifier::STATIC) == 0)
+ continue;
+
+ char *base = field->isRef() ? reference_fields : non_reference_fields;
+ field->u.addr = base + field->u.boffset;
+ }
}
static void do_create_ncode (jclass)