comparison agent/src/share/classes/sun/jvm/hotspot/code/NMethod.java @ 3908:7588156f5cf9

7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244) Reviewed-by: kvn
author never
date Mon, 05 Sep 2011 17:09:05 -0700
parents 3e8fbc61cee8
children f6f3bb0ee072
comparison
equal deleted inserted replaced
3907:7b5c767f229c 3908:7588156f5cf9
44 private static JByteField scavengeRootStateField; 44 private static JByteField scavengeRootStateField;
45 45
46 /** Offsets for different nmethod parts */ 46 /** Offsets for different nmethod parts */
47 private static CIntegerField exceptionOffsetField; 47 private static CIntegerField exceptionOffsetField;
48 private static CIntegerField deoptOffsetField; 48 private static CIntegerField deoptOffsetField;
49 private static CIntegerField deoptMhOffsetField;
49 private static CIntegerField origPCOffsetField; 50 private static CIntegerField origPCOffsetField;
50 private static CIntegerField stubOffsetField; 51 private static CIntegerField stubOffsetField;
51 private static CIntegerField oopsOffsetField; 52 private static CIntegerField oopsOffsetField;
52 private static CIntegerField scopesDataOffsetField; 53 private static CIntegerField scopesDataOffsetField;
53 private static CIntegerField scopesPCsOffsetField; 54 private static CIntegerField scopesPCsOffsetField;
93 scavengeRootLinkField = type.getAddressField("_scavenge_root_link"); 94 scavengeRootLinkField = type.getAddressField("_scavenge_root_link");
94 scavengeRootStateField = type.getJByteField("_scavenge_root_state"); 95 scavengeRootStateField = type.getJByteField("_scavenge_root_state");
95 96
96 exceptionOffsetField = type.getCIntegerField("_exception_offset"); 97 exceptionOffsetField = type.getCIntegerField("_exception_offset");
97 deoptOffsetField = type.getCIntegerField("_deoptimize_offset"); 98 deoptOffsetField = type.getCIntegerField("_deoptimize_offset");
99 deoptMhOffsetField = type.getCIntegerField("_deoptimize_mh_offset");
98 origPCOffsetField = type.getCIntegerField("_orig_pc_offset"); 100 origPCOffsetField = type.getCIntegerField("_orig_pc_offset");
99 stubOffsetField = type.getCIntegerField("_stub_offset"); 101 stubOffsetField = type.getCIntegerField("_stub_offset");
100 oopsOffsetField = type.getCIntegerField("_oops_offset"); 102 oopsOffsetField = type.getCIntegerField("_oops_offset");
101 scopesDataOffsetField = type.getCIntegerField("_scopes_data_offset"); 103 scopesDataOffsetField = type.getCIntegerField("_scopes_data_offset");
102 scopesPCsOffsetField = type.getCIntegerField("_scopes_pcs_offset"); 104 scopesPCsOffsetField = type.getCIntegerField("_scopes_pcs_offset");
134 public boolean isOSRMethod() { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); } 136 public boolean isOSRMethod() { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); }
135 137
136 /** Boundaries for different parts */ 138 /** Boundaries for different parts */
137 public Address constantsBegin() { return contentBegin(); } 139 public Address constantsBegin() { return contentBegin(); }
138 public Address constantsEnd() { return getEntryPoint(); } 140 public Address constantsEnd() { return getEntryPoint(); }
139 public Address instsBegin() { return codeBegin(); } 141 public Address instsBegin() { return codeBegin(); }
140 public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } 142 public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); }
141 public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } 143 public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); }
142 public Address deoptBegin() { return headerBegin().addOffsetTo(getDeoptOffset()); } 144 public Address deoptHandlerBegin() { return headerBegin().addOffsetTo(getDeoptOffset()); }
145 public Address deoptMhHandlerBegin() { return headerBegin().addOffsetTo(getDeoptMhOffset()); }
143 public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } 146 public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); }
144 public Address stubEnd() { return headerBegin().addOffsetTo(getOopsOffset()); } 147 public Address stubEnd() { return headerBegin().addOffsetTo(getOopsOffset()); }
145 public Address oopsBegin() { return headerBegin().addOffsetTo(getOopsOffset()); } 148 public Address oopsBegin() { return headerBegin().addOffsetTo(getOopsOffset()); }
146 public Address oopsEnd() { return headerBegin().addOffsetTo(getScopesDataOffset()); } 149 public Address oopsEnd() { return headerBegin().addOffsetTo(getScopesDataOffset()); }
147 public Address scopesDataBegin() { return headerBegin().addOffsetTo(getScopesDataOffset()); } 150 public Address scopesDataBegin() { return headerBegin().addOffsetTo(getScopesDataOffset()); }
248 251
249 public int getScavengeRootState() { 252 public int getScavengeRootState() {
250 return (int) scavengeRootStateField.getValue(addr); 253 return (int) scavengeRootStateField.getValue(addr);
251 } 254 }
252 255
256 // MethodHandle
257 public boolean isMethodHandleReturn(Address returnPc) {
258 // Hard to read a bit fields from Java and it's only there for performance
259 // so just go directly to the PCDesc
260 // if (!hasMethodHandleInvokes()) return false;
261 PCDesc pd = getPCDescAt(returnPc);
262 if (pd == null)
263 return false;
264 return pd.isMethodHandleInvoke();
265 }
266
267 // Deopt
268 // Return true is the PC is one would expect if the frame is being deopted.
269 public boolean isDeoptPc (Address pc) { return isDeoptEntry(pc) || isDeoptMhEntry(pc); }
270 public boolean isDeoptEntry (Address pc) { return pc == deoptHandlerBegin(); }
271 public boolean isDeoptMhEntry (Address pc) { return pc == deoptMhHandlerBegin(); }
253 272
254 /** Tells whether frames described by this nmethod can be 273 /** Tells whether frames described by this nmethod can be
255 deoptimized. Note: native wrappers cannot be deoptimized. */ 274 deoptimized. Note: native wrappers cannot be deoptimized. */
256 public boolean canBeDeoptimized() { return isJavaMethod(); } 275 public boolean canBeDeoptimized() { return isJavaMethod(); }
257 276
386 // 405 //
387 406
388 private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } 407 private int getEntryBCI() { return (int) entryBCIField .getValue(addr); }
389 private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } 408 private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); }
390 private int getDeoptOffset() { return (int) deoptOffsetField .getValue(addr); } 409 private int getDeoptOffset() { return (int) deoptOffsetField .getValue(addr); }
410 private int getDeoptMhOffset() { return (int) deoptMhOffsetField .getValue(addr); }
391 private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } 411 private int getStubOffset() { return (int) stubOffsetField .getValue(addr); }
392 private int getOopsOffset() { return (int) oopsOffsetField .getValue(addr); } 412 private int getOopsOffset() { return (int) oopsOffsetField .getValue(addr); }
393 private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); } 413 private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); }
394 private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } 414 private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); }
395 private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); } 415 private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); }