Mercurial > hg > graal-jvmci-8
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); } |