comparison agent/src/share/classes/sun/jvm/hotspot/runtime/CompiledVFrame.java @ 818:b109e761e927

6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14 Summary: Disable escape analysis when jvmti/debugger is used. Add support for EA ibto SA. Reviewed-by: never
author kvn
date Tue, 09 Jun 2009 16:19:10 -0700
parents 9ee9cf798b59
children bd02caa94611
comparison
equal deleted inserted replaced
793:eacd97c88873 818:b109e761e927
129 return new ArrayList(); 129 return new ArrayList();
130 } 130 }
131 List result = new ArrayList(monitors.size()); 131 List result = new ArrayList(monitors.size());
132 for (int i = 0; i < monitors.size(); i++) { 132 for (int i = 0; i < monitors.size(); i++) {
133 MonitorValue mv = (MonitorValue) monitors.get(i); 133 MonitorValue mv = (MonitorValue) monitors.get(i);
134 StackValue ownerSV = createStackValue(mv.owner()); // it is an oop 134 ScopeValue ov = mv.owner();
135 result.add(new MonitorInfo(ownerSV.getObject(), resolveMonitorLock(mv.basicLock()))); 135 StackValue ownerSV = createStackValue(ov); // it is an oop
136 if (ov.isObject()) { // The owner object was scalar replaced
137 Assert.that(mv.eliminated() && ownerSV.objIsScalarReplaced(), "monitor should be eliminated for scalar replaced object");
138 // Put klass for scalar replaced object.
139 ScopeValue kv = ((ObjectValue)ov).getKlass();
140 Assert.that(kv.isConstantOop(), "klass should be oop constant for scalar replaced object");
141 OopHandle k = ((ConstantOopReadValue)kv).getValue();
142 result.add(new MonitorInfo(k, resolveMonitorLock(mv.basicLock()), mv.eliminated(), true));
143 } else {
144 result.add(new MonitorInfo(ownerSV.getObject(), resolveMonitorLock(mv.basicLock()), mv.eliminated(), false));
145 }
136 } 146 }
137 return result; 147 return result;
138 } 148 }
139 149
140 public int getBCI() { 150 public int getBCI() {
210 if (loc.isRegister() && VM.getVM().isBigEndian()) { 220 if (loc.isRegister() && VM.getVM().isBigEndian()) {
211 // The callee has no clue whether the register holds an narrow oop, 221 // The callee has no clue whether the register holds an narrow oop,
212 // long or is unused. He always saves a long. Here we know 222 // long or is unused. He always saves a long. Here we know
213 // a long was saved, but we only want an narrow oop back. Narrow the 223 // a long was saved, but we only want an narrow oop back. Narrow the
214 // saved long to the narrow oop that the JVM wants. 224 // saved long to the narrow oop that the JVM wants.
215 return new StackValue(valueAddr.getCompOopHandleAt(VM.getVM().getIntSize())); 225 return new StackValue(valueAddr.getCompOopHandleAt(VM.getVM().getIntSize()), 0);
216 } else { 226 } else {
217 return new StackValue(valueAddr.getCompOopHandleAt(0)); 227 return new StackValue(valueAddr.getCompOopHandleAt(0), 0);
218 } 228 }
219 } else if( loc.holdsOop() ) { // Holds an oop? 229 } else if( loc.holdsOop() ) { // Holds an oop?
220 return new StackValue(valueAddr.getOopHandleAt(0)); 230 return new StackValue(valueAddr.getOopHandleAt(0), 0);
221 } else if( loc.holdsDouble() ) { 231 } else if( loc.holdsDouble() ) {
222 // Double value in a single stack slot 232 // Double value in a single stack slot
223 return new StackValue(valueAddr.getJIntAt(0) & 0xFFFFFFFF); 233 return new StackValue(valueAddr.getJIntAt(0) & 0xFFFFFFFF);
224 } else if(loc.holdsAddr()) { 234 } else if(loc.holdsAddr()) {
225 if (Assert.ASSERTS_ENABLED) { 235 if (Assert.ASSERTS_ENABLED) {
275 } else if (sv.isConstantInt()) { 285 } else if (sv.isConstantInt()) {
276 // Constant int: treat same as register int. 286 // Constant int: treat same as register int.
277 return new StackValue(((ConstantIntValue) sv).getValue() & 0xFFFFFFFF); 287 return new StackValue(((ConstantIntValue) sv).getValue() & 0xFFFFFFFF);
278 } else if (sv.isConstantOop()) { 288 } else if (sv.isConstantOop()) {
279 // constant oop 289 // constant oop
280 return new StackValue(((ConstantOopReadValue) sv).getValue()); 290 return new StackValue(((ConstantOopReadValue) sv).getValue(), 0);
281 } else if (sv.isConstantDouble()) { 291 } else if (sv.isConstantDouble()) {
282 // Constant double in a single stack slot 292 // Constant double in a single stack slot
283 double d = ((ConstantDoubleValue) sv).getValue(); 293 double d = ((ConstantDoubleValue) sv).getValue();
284 return new StackValue(Double.doubleToLongBits(d) & 0xFFFFFFFF); 294 return new StackValue(Double.doubleToLongBits(d) & 0xFFFFFFFF);
285 } else if (VM.getVM().isLP64() && sv.isConstantLong()) { 295 } else if (VM.getVM().isLP64() && sv.isConstantLong()) {
286 // Constant long in a single stack slot 296 // Constant long in a single stack slot
287 return new StackValue(((ConstantLongValue) sv).getValue() & 0xFFFFFFFF); 297 return new StackValue(((ConstantLongValue) sv).getValue() & 0xFFFFFFFF);
298 } else if (sv.isObject()) {
299 // Scalar replaced object in compiled frame
300 return new StackValue(((ObjectValue)sv).getValue(), 1);
288 } 301 }
289 302
290 // Unknown ScopeValue type 303 // Unknown ScopeValue type
291 Assert.that(false, "Should not reach here"); 304 Assert.that(false, "Should not reach here");
292 return new StackValue(0); // dummy 305 return new StackValue(0); // dummy