hotspot/src/share/vm/runtime/vframe_hp.cpp
changeset 13728 882756847a04
parent 13195 be27e1b6a4b9
child 29081 c61eb4914428
--- a/hotspot/src/share/vm/runtime/vframe_hp.cpp	Fri Aug 31 16:39:35 2012 -0700
+++ b/hotspot/src/share/vm/runtime/vframe_hp.cpp	Sat Sep 01 13:25:18 2012 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -196,7 +196,7 @@
   // Natives has no scope
   if (scope() == NULL) {
     nmethod* nm = code();
-    methodOop method = nm->method();
+    Method* method = nm->method();
     assert(method->is_native(), "");
     if (!method->is_synchronized()) {
       return new GrowableArray<MonitorInfo*>(0);
@@ -226,8 +226,9 @@
       // Put klass for scalar replaced object.
       ScopeValue* kv = ((ObjectValue *)ov)->klass();
       assert(kv->is_constant_oop(), "klass should be oop constant for scalar replaced object");
-      KlassHandle k(((ConstantOopReadValue*)kv)->value()());
-      result->push(new MonitorInfo(k->as_klassOop(), resolve_monitor_lock(mv->basic_lock()),
+      Handle k(((ConstantOopReadValue*)kv)->value()());
+      assert(java_lang_Class::is_instance(k()), "must be");
+      result->push(new MonitorInfo(k(), resolve_monitor_lock(mv->basic_lock()),
                                    mv->eliminated(), true));
     } else {
       result->push(new MonitorInfo(owner_sv->get_obj()(), resolve_monitor_lock(mv->basic_lock()),
@@ -267,14 +268,14 @@
 }
 
 
-methodOop compiledVFrame::method() const {
+Method* compiledVFrame::method() const {
   if (scope() == NULL) {
     // native nmethods have no scope the method is implied
     nmethod* nm = code();
     assert(nm->is_native_method(), "must be native");
     return nm->method();
   }
-  return scope()->method()();
+  return scope()->method();
 }
 
 
@@ -318,7 +319,7 @@
   }
 }
 
-jvmtiDeferredLocalVariableSet::jvmtiDeferredLocalVariableSet(methodOop method, int bci, intptr_t* id) {
+jvmtiDeferredLocalVariableSet::jvmtiDeferredLocalVariableSet(Method* method, int bci, intptr_t* id) {
   _method = method;
   _bci = bci;
   _id = id;
@@ -353,8 +354,8 @@
 }
 
 void jvmtiDeferredLocalVariableSet::oops_do(OopClosure* f) {
-
-  f->do_oop((oop*) &_method);
+  // The Method* is on the stack so a live activation keeps it alive
+  // either by mirror in interpreter or code in compiled code.
   for ( int i = 0; i < locals()->length(); i++ ) {
     if ( locals()->at(i)->type() == T_OBJECT) {
       f->do_oop(locals()->at(i)->oop_addr());