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);
|