diff src/share/vm/c1x/c1x_CodeInstaller.cpp @ 2048:177398c6147d

Added unique concrete subtype assumption.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Mon, 10 Jan 2011 10:50:22 +0100
parents cf75612bdaa5
children 7e09ea4a8f36
line wrap: on
line diff
--- a/src/share/vm/c1x/c1x_CodeInstaller.cpp	Fri Jan 07 19:08:13 2011 +0100
+++ b/src/share/vm/c1x/c1x_CodeInstaller.cpp	Mon Jan 10 10:50:22 2011 +0100
@@ -28,6 +28,7 @@
 #include "c1x/c1x_JavaAccess.hpp"
 #include "c1x/c1x_VmIds.hpp"
 #include "c1/c1_Runtime1.hpp"
+#include "classfile/vmSymbols.hpp"
 #include "vmreg_x86.inline.hpp"
 
 
@@ -208,6 +209,12 @@
   _hotspot_method = HotSpotTargetMethod::method(target_method);
   _name = HotSpotTargetMethod::name(target_method);
   _sites = (arrayOop) HotSpotTargetMethod::sites(target_method);
+  oop assumptions = CiTargetMethod::assumptions(_citarget_method);
+  if (assumptions != NULL) {
+    _assumptions = (arrayOop) CiAssumptions::list(assumptions);
+  } else {
+    _assumptions = NULL;
+  }
   _exception_handlers = (arrayOop) HotSpotTargetMethod::exceptionHandlers(target_method);
 
   _code = (arrayOop) CiTargetMethod::targetCode(_citarget_method);
@@ -270,6 +277,43 @@
       fatal("unexpected Site subclass");
     }
   }
+
+
+  if (_assumptions != NULL) {
+    oop* assumptions = (oop*) _assumptions->base(T_OBJECT);
+    for (int i = 0; i < _assumptions->length(); ++i) {
+      oop assumption = assumptions[i];
+      if (assumption != NULL) {
+        if (assumption->is_a(CiAssumptions_ConcreteSubtype::klass())) {
+          assumption_ConcreteSubtype(assumption);
+        } else if (assumption->is_a(CiAssumptions_ConcreteMethod::klass())) {
+          assumption_ConcreteMethod(assumption);
+        } else {
+          fatal("unexpected Assumption subclass");
+        }
+      }
+    }
+  }
+}
+
+void CodeInstaller::assumption_ConcreteSubtype(oop assumption) {
+  oop context_oop = CiAssumptions_ConcreteSubtype::context(assumption);
+  oop type_oop = CiAssumptions_ConcreteSubtype::subtype(assumption);
+
+  ciKlass* context = (ciKlass*) CURRENT_ENV->get_object(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(context_oop)));
+  ciKlass* type = (ciKlass*) CURRENT_ENV->get_object(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(type_oop)));
+
+  if (context == type) {
+    _dependencies->assert_leaf_type(type);
+  } else {
+    assert(context->is_abstract(), "");
+    ThreadToNativeFromVM trans(JavaThread::current());
+    _dependencies->assert_abstract_with_unique_concrete_subtype(context, type);
+  }
+}
+
+void CodeInstaller::assumption_ConcreteMethod(oop assumption) {
+  fatal("unimplemented");
 }
 
 void CodeInstaller::process_exception_handlers() {