]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libjava/interpret.cc
PR libgcj/26063, PR libgcj/17978, PR libgcj/10598:
[thirdparty/gcc.git] / libjava / interpret.cc
index 87d357c94c2c7583b17000421f57cafb515da5ec..f95671d267bb9da3ac3eafd3ee0420da3ace1b27 100644 (file)
@@ -3877,25 +3877,30 @@ _Jv_InterpreterEngine::do_create_ncode (jclass klass)
 
 void
 _Jv_InterpreterEngine::do_allocate_static_fields (jclass klass,
-                                                 int static_size)
+                                                 int pointer_size,
+                                                 int other_size)
 {
   _Jv_InterpClass *iclass = (_Jv_InterpClass *) klass->aux_info;
 
-  char *static_data = (char *) _Jv_AllocBytes (static_size);
+  // 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)
+      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;
+
+      if (iclass->field_initializers[i] != 0)
        {
-         field->u.addr  = static_data + field->u.boffset;
-             
-         if (iclass->field_initializers[i] != 0)
-           {
-             _Jv_Linker::resolve_field (field, klass->loader);
-             _Jv_InitField (0, klass, i);
-           }
+         _Jv_Linker::resolve_field (field, klass->loader);
+         _Jv_InitField (0, klass, i);
        }
     }