@@ -112,14 +112,17 @@ updateROMMethodInfoCache(J9JavaVM *vm, J9ClassLoader *classLoader, J9ROMMethodIn
112112 }
113113
114114 if (NULL != cache) {
115- hashTableAdd (cache, info);
115+ PORT_ACCESS_FROM_JAVAVM (vm);
116+ J9ROMMethodInfo *copy = (J9ROMMethodInfo *) j9mem_allocate_memory (sizeof (J9ROMMethodInfo), J9MEM_CATEGORY_VM);
117+ *copy = *info;
118+ hashTableAdd (cache, copy);
116119 }
117120
118121 omrthread_monitor_exit (mapCacheMutex);
119122}
120123
121124static void
122- populateROMMethodInfo (J9StackWalkState *walkState, J9ROMMethod *romMethod, void *key, UDATA pc, bool computeStackAndLocals)
125+ populateROMMethodInfo (J9StackWalkState *walkState, J9ROMMethod *romMethod, void *key, UDATA pc, bool computeStackAndLocals, UDATA pendingCount, UDATA numberOfLocals )
123126{
124127 J9Method *method = walkState->method ;
125128 J9ClassLoader *classLoader = J9_CLASS_FROM_METHOD (method)->classLoader ;
@@ -131,7 +134,6 @@ populateROMMethodInfo(J9StackWalkState *walkState, J9ROMMethod *romMethod, void
131134
132135 /* Always compute argument bits */
133136 j9localmap_ArgBitsForPC0 (romClass, romMethod, newInfo.argbits );
134-
135137 if (computeStackAndLocals) {
136138 /* Compute stack map for this PC */
137139 j9stackmap_StackBitsForPC (
@@ -146,6 +148,7 @@ populateROMMethodInfo(J9StackWalkState *walkState, J9ROMMethod *romMethod, void
146148 NULL );
147149
148150 /* Compute local variable map for this PC */
151+
149152 vm->localMapFunction (
150153 vm->portLibrary ,
151154 romClass,
@@ -163,26 +166,58 @@ populateROMMethodInfo(J9StackWalkState *walkState, J9ROMMethod *romMethod, void
163166 newInfo.tempCount = J9_TEMP_COUNT_FROM_ROM_METHOD (romMethod);
164167
165168 /* Insert into cache */
166- updateROMMethodInfoCache (vm, classLoader, &newInfo);
169+ // updateROMMethodInfoCache(vm, classLoader, &newInfo);
170+ PORT_ACCESS_FROM_JAVAVM (vm);
171+ J9ROMMethodInfo *stored = (J9ROMMethodInfo *) j9mem_allocate_memory (sizeof (J9ROMMethodInfo), J9MEM_CATEGORY_VM);
172+ if (NULL == stored) {
173+ walkState->romMethodInfo = newInfo;
174+ } else {
175+ *stored = newInfo;
176+ updateROMMethodInfoCache (vm, classLoader, stored);
177+ walkState->romMethodInfo = *stored;
178+ }
179+ }
180+
181+ static UDATA
182+ computePendingCountForBytecode (J9ROMMethod *romMethod)
183+ {
184+ UDATA pendingCount = 0 ;
167185
168- /* Reflect into current walkState */
169- walkState->romMethodInfo = newInfo;
186+ UDATA argCount = romMethod->argCount ;
187+ UDATA tempCount = romMethod->tempCount ;
188+
189+ pendingCount = argCount + tempCount;
190+
191+ UDATA modifiers = romMethod->modifiers ;
192+
193+ if (modifiers & J9AccSynchronized) {
194+ /* Add monitor slot for synchronized methods */
195+ pendingCount += 1 ;
196+ } else if ((modifiers & (J9AccMethodObjectConstructor | J9AccEmptyMethod)) == J9AccMethodObjectConstructor) {
197+ /* Add extra receiver temp for non-empty Object.<init> */
198+ pendingCount += 1 ;
199+ }
200+
201+ return pendingCount;
170202}
171203
172204void
173205getROMMethodInfoForROMMethod (J9StackWalkState *walkState, J9ROMMethod *romMethod)
174206{
175207 J9Method *method = walkState->method ;
176208 J9ClassLoader *classLoader = J9_CLASS_FROM_METHOD (method)->classLoader ;
177-
209+ if (NULL == walkState->method || walkState->pc == NULL ) {
210+ return ; // avoid dereference
211+ }
178212 void *key = (void *)romMethod;
179213 J9ROMMethodInfo tmp = {0 };
180214
181215 /* Check cache first */
182216 if (!checkROMMethodInfoCache (classLoader, key, &tmp)) {
183217 /* Cache miss or not populated */
184218 initializeBasicROMMethodInfo (walkState, romMethod);
185- populateROMMethodInfo (walkState, romMethod, key, 0 , false );
219+ populateROMMethodInfo (walkState, romMethod, key, 0 , false , 0 , 0 );
220+ // populateROMMethodInfo(walkState, romMethod, key, 0, false);
186221 } else {
187222 /* Cache hit */
188223 walkState->romMethodInfo = tmp;
@@ -194,11 +229,15 @@ void
194229getROMMethodInfoForBytecodePC (J9StackWalkState *walkState, J9ROMMethod *romMethod, UDATA pc)
195230{
196231 if (pc <= J9SF_MAX_SPECIAL_FRAME_TYPE || pc >= (UDATA)J9_BYTECODE_SIZE_FROM_ROM_METHOD (romMethod)) {
232+ initializeBasicROMMethodInfo (walkState, romMethod);
197233 return ;
198234 }
199235
200236 J9Method *method = walkState->method ;
201237 J9ClassLoader *classLoader = J9_CLASS_FROM_METHOD (method)->classLoader ;
238+ if (NULL == walkState->method || walkState->pc == NULL ) {
239+ return ; // avoid dereference
240+ }
202241
203242 void *key = (void *)( (uintptr_t )J9_BYTECODE_START_FROM_ROM_METHOD (romMethod) + (uintptr_t )pc );
204243 J9ROMMethodInfo tmp = {0 };
@@ -207,12 +246,37 @@ getROMMethodInfoForBytecodePC(J9StackWalkState *walkState, J9ROMMethod *romMetho
207246 if (!checkROMMethodInfoCache (classLoader, key, &tmp)) {
208247 /* Cache miss or not populated */
209248 initializeBasicROMMethodInfo (walkState, romMethod);
210- populateROMMethodInfo (walkState, romMethod, key, pc, true );
249+ UDATA pendingCount = computePendingCountForBytecode (romMethod);
250+ UDATA numberOfLocals = romMethod->tempCount + romMethod->argCount ;
251+ populateROMMethodInfo (walkState, romMethod, key, pc, true , pendingCount, numberOfLocals);
252+ // populateROMMethodInfo(walkState, romMethod, key, pc, true);
211253 } else {
212254 /* Cache hit */
213255 walkState->romMethodInfo = tmp;
214256 }
215257}
216258
259+ void
260+ getROMMethodInfoForOSRFrame (J9StackWalkState *walkState, J9OSRFrame *osrFrame)
261+ {
262+ J9Method *method = osrFrame->method ;
263+ J9ClassLoader *classLoader = J9_CLASS_FROM_METHOD (method)->classLoader ;
264+ J9ROMMethod *romMethod = J9_ROM_METHOD_FROM_RAM_METHOD (method);
265+
266+ /* Use the ROMMethod pointer plus bytecode offset as key */
267+ void *key = (void *)((uintptr_t )J9_BYTECODE_START_FROM_ROM_METHOD (romMethod) + (uintptr_t )osrFrame->bytecodePCOffset );
268+ J9ROMMethodInfo tmp = {0 };
269+
270+ /* Check the cache first */
271+ if (!checkROMMethodInfoCache (classLoader, key, &tmp)) {
272+ /* Cache miss or not populated */
273+ initializeBasicROMMethodInfo (walkState, romMethod);
274+ populateROMMethodInfo (walkState, romMethod, key, osrFrame->bytecodePCOffset , true , osrFrame->pendingStackHeight , osrFrame->numberOfLocals );
275+ // populateROMMethodInfo(walkState, romMethod, key, osrFrame->bytecodePCOffset,true);
276+ } else {
277+ /* Cache hit */
278+ walkState->romMethodInfo = tmp;
279+ }
280+ }
217281
218282} /* extern "C" */
0 commit comments