gh-138431: JIT Optimizer --- Fix round-tripping references for str and tuple (GH-138458)

Co-authored-by: Mark Shannon <9448417+markshannon@users.noreply.github.com>
This commit is contained in:
Ken Jin 2025-09-04 02:05:06 +08:00 committed by GitHub
parent 0d1f4e1639
commit 2402f84665
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 34 additions and 8 deletions

View file

@ -762,9 +762,8 @@ dummy_func(void) {
}
op(_RETURN_VALUE, (retval -- res)) {
// We wrap and unwrap the value to mimic PyStackRef_MakeHeapSafe
// in bytecodes.c
JitOptRef temp = PyJitRef_Wrap(PyJitRef_Unwrap(retval));
// Mimics PyStackRef_MakeHeapSafe in the interpreter.
JitOptRef temp = PyJitRef_StripReferenceInfo(retval);
DEAD(retval);
SAVE_STACK();
ctx->frame->stack_pointer = stack_pointer;
@ -925,7 +924,9 @@ dummy_func(void) {
op(_CALL_STR_1, (unused, unused, arg -- res)) {
if (sym_matches_type(arg, &PyUnicode_Type)) {
// e.g. str('foo') or str(foo) where foo is known to be a string
res = arg;
// Note: we must strip the reference information because it goes
// through str() which strips the reference information from it.
res = PyJitRef_StripReferenceInfo(arg);
}
else {
res = sym_new_type(ctx, &PyUnicode_Type);
@ -1065,7 +1066,9 @@ dummy_func(void) {
op(_CALL_TUPLE_1, (callable, null, arg -- res)) {
if (sym_matches_type(arg, &PyTuple_Type)) {
// e.g. tuple((1, 2)) or tuple(foo) where foo is known to be a tuple
res = arg;
// Note: we must strip the reference information because it goes
// through tuple() which strips the reference information from it.
res = PyJitRef_StripReferenceInfo(arg);
}
else {
res = sym_new_type(ctx, &PyTuple_Type);

View file

@ -1060,7 +1060,7 @@
JitOptRef retval;
JitOptRef res;
retval = stack_pointer[-1];
JitOptRef temp = PyJitRef_Wrap(PyJitRef_Unwrap(retval));
JitOptRef temp = PyJitRef_StripReferenceInfo(retval);
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
ctx->frame->stack_pointer = stack_pointer;
@ -2496,7 +2496,7 @@
JitOptRef res;
arg = stack_pointer[-1];
if (sym_matches_type(arg, &PyUnicode_Type)) {
res = arg;
res = PyJitRef_StripReferenceInfo(arg);
}
else {
res = sym_new_type(ctx, &PyUnicode_Type);
@ -2522,7 +2522,7 @@
JitOptRef res;
arg = stack_pointer[-1];
if (sym_matches_type(arg, &PyTuple_Type)) {
res = arg;
res = PyJitRef_StripReferenceInfo(arg);
}
else {
res = sym_new_type(ctx, &PyTuple_Type);