< prev index next >

src/share/vm/ci/ciReplay.cpp

Print this page
rev 10535 : incremental inlining fixes

@@ -30,10 +30,11 @@
 #include "compiler/compileBroker.hpp"
 #include "memory/allocation.inline.hpp"
 #include "memory/oopFactory.hpp"
 #include "memory/resourceArea.hpp"
 #include "oops/oop.inline.hpp"
+#include "oops/valueKlass.hpp"
 #include "utilities/copy.hpp"
 #include "utilities/macros.hpp"
 
 #ifndef PRODUCT
 

@@ -735,10 +736,88 @@
       }
 
     }
   }
 
+  class ValueTypeFieldInitializer : public FieldClosure {
+    oop _vt;
+    CompileReplay* _replay;
+  public:
+    ValueTypeFieldInitializer(oop vt, CompileReplay* replay)
+      : _vt(vt), _replay(replay) {}
+
+    void do_field(fieldDescriptor* fd) {
+      BasicType bt = fd->field_type();
+      const char* string_value = bt != T_VALUETYPE ? _replay->parse_escaped_string() : NULL;
+      switch (bt) {
+        case T_BYTE: {
+          int value = atoi(string_value);
+          _vt->byte_field_put(fd->offset(), value);
+          break;
+        }
+        case T_BOOLEAN: {
+          int value = atoi(string_value);
+          _vt->bool_field_put(fd->offset(), value);
+          break;
+        }
+        case T_SHORT: {
+          int value = atoi(string_value);
+          _vt->short_field_put(fd->offset(), value);
+          break;
+        }
+        case T_CHAR: {
+          int value = atoi(string_value);
+          _vt->char_field_put(fd->offset(), value);
+          break;
+        }
+        case T_INT: {
+          int value = atoi(string_value);
+          _vt->int_field_put(fd->offset(), value);
+          break;
+        }
+        case T_LONG: {
+          jlong value;
+          if (sscanf(string_value, JLONG_FORMAT, &value) != 1) {
+            fprintf(stderr, "Error parsing long: %s\n", string_value);
+            break;
+          }
+          _vt->long_field_put(fd->offset(), value);
+          break;
+        }
+        case T_FLOAT: {
+          float value = atof(string_value);
+          _vt->float_field_put(fd->offset(), value);
+          break;
+        }
+        case T_DOUBLE: {
+          double value = atof(string_value);
+          _vt->double_field_put(fd->offset(), value);
+          break;
+        }
+        case T_ARRAY:
+          _replay->report_error("Array in value type unsupported");
+          break;
+        case T_OBJECT:
+          _replay->report_error("Object in value type unsupported");
+          break;
+        case T_VALUETYPE: {
+          Thread* THREAD = Thread::current();
+          SignatureStream ss(fd->signature(), false);
+          InstanceKlass* holder = fd->field_holder();
+          Klass* k = ss.as_klass(Handle(holder->class_loader()), Handle(holder->protection_domain()), SignatureStream::ReturnNull, THREAD);
+          assert(k != NULL && !HAS_PENDING_EXCEPTION, "can resolve klass?");
+          ValueKlass* vk = ValueKlass::cast(k);
+          int field_offset = fd->offset() - vk->first_field_offset();
+          oop obj = (oop)((address)_vt + field_offset);
+          ValueTypeFieldInitializer init_fields(obj, _replay);
+          vk->do_nonstatic_fields(&init_fields);
+          break;
+        }
+      }
+    }
+  };
+
   // Initialize a class and fill in the value for a static field.
   // This is useful when the compile was dependent on the value of
   // static fields but it's impossible to properly rerun the static
   // initiailizer.
   void process_staticfield(TRAPS) {

@@ -749,11 +828,11 @@
       return;
     }
 
     assert(k->is_initialized(), "must be");
 
-    const char* field_name = parse_escaped_string();;
+    const char* field_name = parse_escaped_string();
     const char* field_signature = parse_string();
     fieldDescriptor fd;
     Symbol* name = SymbolTable::lookup(field_name, (int)strlen(field_name), CHECK);
     Symbol* sig = SymbolTable::lookup(field_signature, (int)strlen(field_signature), CHECK);
     if (!k->find_local_field(name, sig, &fd) ||

@@ -805,11 +884,11 @@
           report_error("unhandled array staticfield");
         }
       }
       java_mirror->obj_field_put(fd.offset(), value);
     } else {
-      const char* string_value = parse_escaped_string();
+      const char* string_value = field_signature[0] != 'Q' ? parse_escaped_string() : NULL;
       if (strcmp(field_signature, "I") == 0) {
         int value = atoi(string_value);
         java_mirror->int_field_put(fd.offset(), value);
       } else if (strcmp(field_signature, "B") == 0) {
         int value = atoi(string_value);

@@ -842,10 +921,18 @@
       } else if (field_signature[0] == 'L') {
         Symbol* klass_name = SymbolTable::lookup(field_signature, (int)strlen(field_signature), CHECK);
         KlassHandle kelem = resolve_klass(field_signature, CHECK);
         oop value = InstanceKlass::cast(kelem())->allocate_instance(CHECK);
         java_mirror->obj_field_put(fd.offset(), value);
+      } else if (field_signature[0] == 'Q') {
+        Symbol* klass_name = SymbolTable::lookup(field_signature, (int)strlen(field_signature), CHECK);
+        KlassHandle kelem = resolve_klass(field_signature, CHECK);
+        ValueKlass* vk = ValueKlass::cast(kelem());
+        oop value = vk->allocate_instance(CHECK);
+        ValueTypeFieldInitializer init_fields(value, this);
+        vk->do_nonstatic_fields(&init_fields);
+        java_mirror->obj_field_put(fd.offset(), value);
       } else {
         report_error("unhandled staticfield");
       }
     }
   }
< prev index next >