From cec8a150911e20c4ba4697950a9e9ded8d0999cb Mon Sep 17 00:00:00 2001 From: Jack Lu Date: Mon, 30 Oct 2023 16:15:49 -0400 Subject: [PATCH] Recognize JNI local refs in JNINativeMethodFrames First 8 JNI local refs are directly stored inside the J9SFJNINativeMethodFrame before allocating J9JNIReferenceFrame to store additional references. StackWalker should check if the object pushes from method frame is JNI local when walking O-Slots. Signed-off-by: Jack Lu --- runtime/vm/swalk.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtime/vm/swalk.c b/runtime/vm/swalk.c index a41008f073e..f02f949cf45 100644 --- a/runtime/vm/swalk.c +++ b/runtime/vm/swalk.c @@ -701,6 +701,7 @@ static void walkMethodFrame(J9StackWalkState * walkState) { J9SFMethodFrame * methodFrame = (J9SFMethodFrame *) ((U_8*) walkState->walkSP + (UDATA) walkState->literals); + BOOLEAN isJNINative = (J9SF_FRAME_TYPE_JNI_NATIVE_METHOD == (UDATA)walkState->pc); walkState->bp = (UDATA *) &(methodFrame->savedA0); walkState->frameFlags = methodFrame->specialFrameFlags; @@ -734,7 +735,7 @@ walkMethodFrame(J9StackWalkState * walkState) #endif if ((walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) && walkState->literals) { - if (walkState->frameFlags & J9_SSF_JNI_REFS_REDIRECTED) { + if ((walkState->frameFlags & J9_SSF_JNI_REFS_REDIRECTED) || isJNINative) { walkPushedJNIRefs(walkState); } else { walkObjectPushes(walkState);