diff src/share/vm/c1x/c1x_Compiler.cpp @ 1452:9b22e3e5df8e

Solved an issue with unresolved field patching.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Fri, 12 Nov 2010 18:04:27 +0100
parents 8cfe3537a0d3
children a8f9f091c219
line wrap: on
line diff
--- a/src/share/vm/c1x/c1x_Compiler.cpp	Thu Nov 11 14:42:14 2010 +0100
+++ b/src/share/vm/c1x/c1x_Compiler.cpp	Fri Nov 12 18:04:27 2010 +0100
@@ -45,7 +45,10 @@
   assert(klass != NULL, "c1x VMEntries class not found");
   env->RegisterNatives(klass, VMEntries_methods, VMEntries_methods_count());
 
-  check_pending_exception("Could not register natives");
+  {
+    VM_ENTRY_MARK;
+    check_pending_exception("Could not register natives");
+  }
 
   c1x_compute_offsets();
 
@@ -83,7 +86,7 @@
   TRACE_C1X_1("C1XCompiler::print_timers");
 }
 
-oop C1XCompiler::get_RiType(ciType *type, klassOop accessor, TRAPS) {
+oop C1XCompiler::get_RiType(ciType *type, KlassHandle accessor, TRAPS) {
   if (type->is_loaded()) {
     if (type->is_primitive_type()) {
       return VMExits::createRiTypePrimitive((int) type->basic_type(), THREAD);
@@ -93,15 +96,23 @@
     return createHotSpotTypeResolved(klass, name, CHECK_NULL);
   } else {
     symbolOop name = ((ciKlass *) type)->name()->get_symbolOop();
-    return VMExits::createRiTypeUnresolved(VmIds::toString<Handle>(name, THREAD), VmIds::add<klassOop>(accessor), THREAD);
+    return VMExits::createRiTypeUnresolved(VmIds::toString<Handle>(name, THREAD), VmIds::add<klassOop>(accessor()), THREAD);
   }
 }
 
-oop C1XCompiler::get_RiField(ciField *field, klassOop accessor, TRAPS) {
+oop C1XCompiler::get_RiField(ciField *field, KlassHandle accessor, Bytecodes::Code byteCode, TRAPS) {
   Handle field_holder = get_RiType(field->holder(), accessor, CHECK_0);
   Handle field_type = get_RiType(field->type(), accessor, CHECK_0);
   Handle field_name = VmIds::toString<Handle>(field->name()->get_symbolOop(), CHECK_0);
-  int offset = field->holder()->is_loaded() ? field->offset() : -1;
+
+  ciInstanceKlass* accessor_klass = (ciInstanceKlass *) CURRENT_ENV->get_object(accessor());
+  bool will_link;
+  {
+    ThreadToNativeFromVM trans((JavaThread*)THREAD);
+    will_link = field->will_link(accessor_klass, byteCode);
+  }
+
+  int offset = (field->holder()->is_loaded() && will_link) ? field->offset() : -1;
 
   // TODO: implement caching
   return VMExits::createRiField(field_holder, field_name, field_type, offset, THREAD);