diff options
Diffstat (limited to 'libjava/include')
-rw-r--r-- | libjava/include/boehm-gc.h | 1 | ||||
-rw-r--r-- | libjava/include/execution.h | 20 |
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) |