changeset 3535:977007096840

7187290: nightly failures after JSR 292 lazy method handle update Reviewed-by: kvn, twisti
author twisti
date Fri, 27 Jul 2012 16:14:15 -0700
parents 1d7922586cf6
children 6c5b7a6becc8
files src/share/vm/c1/c1_GraphBuilder.cpp src/share/vm/classfile/javaClasses.cpp src/share/vm/oops/methodOop.cpp src/share/vm/opto/doCall.cpp
diffstat 4 files changed, 33 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/c1/c1_GraphBuilder.cpp	Tue Jul 24 10:51:00 2012 -0700
+++ b/src/share/vm/c1/c1_GraphBuilder.cpp	Fri Jul 27 16:14:15 2012 -0700
@@ -1569,31 +1569,33 @@
       ObjectType* obj_type = obj->type()->as_ObjectType();
       if (obj_type->is_constant() && !PatchALot) {
         ciObject* const_oop = obj_type->constant_value();
-        if (field->is_constant()) {
-          ciConstant field_val = field->constant_value_of(const_oop);
-          BasicType field_type = field_val.basic_type();
-          switch (field_type) {
-          case T_ARRAY:
-          case T_OBJECT:
-            if (field_val.as_object()->should_be_constant()) {
+        if (!const_oop->is_null_object()) {
+          if (field->is_constant()) {
+            ciConstant field_val = field->constant_value_of(const_oop);
+            BasicType field_type = field_val.basic_type();
+            switch (field_type) {
+            case T_ARRAY:
+            case T_OBJECT:
+              if (field_val.as_object()->should_be_constant()) {
+                constant = new Constant(as_ValueType(field_val));
+              }
+              break;
+            default:
               constant = new Constant(as_ValueType(field_val));
             }
-            break;
-          default:
-            constant = new Constant(as_ValueType(field_val));
-          }
-        } else {
-          // For constant CallSites treat the target field as a compile time constant.
-          if (const_oop->is_call_site()) {
-            ciCallSite* call_site = const_oop->as_call_site();
-            if (field->is_call_site_target()) {
-              ciMethodHandle* target = call_site->get_target();
-              if (target != NULL) {  // just in case
-                ciConstant field_val(T_OBJECT, target);
-                constant = new Constant(as_ValueType(field_val));
-                // Add a dependence for invalidation of the optimization.
-                if (!call_site->is_constant_call_site()) {
-                  dependency_recorder()->assert_call_site_target_value(call_site, target);
+          } else {
+            // For CallSite objects treat the target field as a compile time constant.
+            if (const_oop->is_call_site()) {
+              ciCallSite* call_site = const_oop->as_call_site();
+              if (field->is_call_site_target()) {
+                ciMethodHandle* target = call_site->get_target();
+                if (target != NULL) {  // just in case
+                  ciConstant field_val(T_OBJECT, target);
+                  constant = new Constant(as_ValueType(field_val));
+                  // Add a dependence for invalidation of the optimization.
+                  if (!call_site->is_constant_call_site()) {
+                    dependency_recorder()->assert_call_site_target_value(call_site, target);
+                  }
                 }
               }
             }
--- a/src/share/vm/classfile/javaClasses.cpp	Tue Jul 24 10:51:00 2012 -0700
+++ b/src/share/vm/classfile/javaClasses.cpp	Fri Jul 27 16:14:15 2012 -0700
@@ -1462,7 +1462,7 @@
   nmethod* nm = NULL;
   bool skip_fillInStackTrace_check = false;
   bool skip_throwableInit_check = false;
-  bool skip_hidden = false;
+  bool skip_hidden = !ShowHiddenFrames;
 
   for (frame fr = thread->last_frame(); max_depth != total_count;) {
     methodOop method = NULL;
@@ -1544,9 +1544,6 @@
     }
     if (method->is_hidden()) {
       if (skip_hidden)  continue;
-    } else {
-      // start skipping hidden frames after first non-hidden frame
-      skip_hidden = !ShowHiddenFrames;
     }
     bt.push(method, bci, CHECK);
     total_count++;
--- a/src/share/vm/oops/methodOop.cpp	Tue Jul 24 10:51:00 2012 -0700
+++ b/src/share/vm/oops/methodOop.cpp	Fri Jul 27 16:14:15 2012 -0700
@@ -582,7 +582,8 @@
 
 
 bool methodOopDesc::has_native_function() const {
-  assert(!is_method_handle_intrinsic(), "");
+  if (is_method_handle_intrinsic())
+    return false;  // special-cased in SharedRuntime::generate_native_wrapper
   address func = native_function();
   return (func != NULL && func != SharedRuntime::native_method_throw_unsatisfied_link_error_entry());
 }
@@ -612,6 +613,9 @@
   if (number_of_breakpoints() > 0) {
     return true;
   }
+  if (is_method_handle_intrinsic()) {
+    return !is_synthetic();  // the generated adapters must be compiled
+  }
   if (comp_level == CompLevel_any) {
     return is_not_c1_compilable() || is_not_c2_compilable();
   }
--- a/src/share/vm/opto/doCall.cpp	Tue Jul 24 10:51:00 2012 -0700
+++ b/src/share/vm/opto/doCall.cpp	Fri Jul 27 16:14:15 2012 -0700
@@ -641,8 +641,8 @@
 #ifndef PRODUCT
       // We do not expect the same handler bci to take both cold unloaded
       // and hot loaded exceptions.  But, watch for it.
-      if (extype->is_loaded()) {
-        tty->print_cr("Warning: Handler @%d takes mixed loaded/unloaded exceptions in ");
+      if ((Verbose || WizardMode) && extype->is_loaded()) {
+        tty->print("Warning: Handler @%d takes mixed loaded/unloaded exceptions in ", bci());
         method()->print_name(); tty->cr();
       } else if (PrintOpto && (Verbose || WizardMode)) {
         tty->print("Bailing out on unloaded exception type ");