< prev index next >

src/hotspot/share/runtime/vframe_hp.cpp

Print this page
rev 52228 : 8212928: Assertion too strict in compiledVFrame::update_deferred_value on SPARC
Reviewed-by: ???
Contributed-by: richard.reingruber@sap.com


  85 }
  86 
  87 void compiledVFrame::update_local(BasicType type, int index, jvalue value) {
  88   assert(index >= 0 && index < method()->max_locals(), "out of bounds");
  89   update_deferred_value(type, index, value);
  90 }
  91 
  92 void compiledVFrame::update_stack(BasicType type, int index, jvalue value) {
  93   assert(index >= 0 && index < method()->max_stack(), "out of bounds");
  94   update_deferred_value(type, index + method()->max_locals(), value);
  95 }
  96 
  97 void compiledVFrame::update_monitor(int index, MonitorInfo* val) {
  98   assert(index >= 0, "out of bounds");
  99   jvalue value;
 100   value.l = (jobject) val->owner();
 101   update_deferred_value(T_OBJECT, index + method()->max_locals() + method()->max_stack(), value);
 102 }
 103 
 104 void compiledVFrame::update_deferred_value(BasicType type, int index, jvalue value) {
 105   assert(fr().is_deoptimized_frame(), "frame must be scheduled for deoptimization");

 106   GrowableArray<jvmtiDeferredLocalVariableSet*>* deferred = thread()->deferred_locals();
 107   jvmtiDeferredLocalVariableSet* locals = NULL;
 108   if (deferred != NULL ) {
 109     // See if this vframe has already had locals with deferred writes
 110     for (int f = 0; f < deferred->length(); f++ ) {
 111       if (deferred->at(f)->matches(this)) {
 112         locals = deferred->at(f);
 113         break;
 114       }
 115     }
 116     // No matching vframe must push a new vframe
 117   } else {
 118     // No deferred updates pending for this thread.
 119     // allocate in C heap
 120     deferred =  new(ResourceObj::C_HEAP, mtCompiler) GrowableArray<jvmtiDeferredLocalVariableSet*> (1, true);
 121     thread()->set_deferred_locals(deferred);
 122   }
 123   if (locals == NULL) {
 124     locals = new jvmtiDeferredLocalVariableSet(method(), bci(), fr().id(), vframe_id());
 125     deferred->push(locals);




  85 }
  86 
  87 void compiledVFrame::update_local(BasicType type, int index, jvalue value) {
  88   assert(index >= 0 && index < method()->max_locals(), "out of bounds");
  89   update_deferred_value(type, index, value);
  90 }
  91 
  92 void compiledVFrame::update_stack(BasicType type, int index, jvalue value) {
  93   assert(index >= 0 && index < method()->max_stack(), "out of bounds");
  94   update_deferred_value(type, index + method()->max_locals(), value);
  95 }
  96 
  97 void compiledVFrame::update_monitor(int index, MonitorInfo* val) {
  98   assert(index >= 0, "out of bounds");
  99   jvalue value;
 100   value.l = (jobject) val->owner();
 101   update_deferred_value(T_OBJECT, index + method()->max_locals() + method()->max_stack(), value);
 102 }
 103 
 104 void compiledVFrame::update_deferred_value(BasicType type, int index, jvalue value) {
 105   assert(fr().is_deoptimized_frame() || thread()->must_deopt_id() == fr().id(),
 106          "frame must be scheduled for deoptimization");
 107   GrowableArray<jvmtiDeferredLocalVariableSet*>* deferred = thread()->deferred_locals();
 108   jvmtiDeferredLocalVariableSet* locals = NULL;
 109   if (deferred != NULL ) {
 110     // See if this vframe has already had locals with deferred writes
 111     for (int f = 0; f < deferred->length(); f++ ) {
 112       if (deferred->at(f)->matches(this)) {
 113         locals = deferred->at(f);
 114         break;
 115       }
 116     }
 117     // No matching vframe must push a new vframe
 118   } else {
 119     // No deferred updates pending for this thread.
 120     // allocate in C heap
 121     deferred =  new(ResourceObj::C_HEAP, mtCompiler) GrowableArray<jvmtiDeferredLocalVariableSet*> (1, true);
 122     thread()->set_deferred_locals(deferred);
 123   }
 124   if (locals == NULL) {
 125     locals = new jvmtiDeferredLocalVariableSet(method(), bci(), fr().id(), vframe_id());
 126     deferred->push(locals);


< prev index next >