mirror of
https://github.com/python/cpython.git
synced 2025-10-20 00:13:47 +00:00
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:
parent
0d1f4e1639
commit
2402f84665
5 changed files with 34 additions and 8 deletions
|
@ -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);
|
||||
|
|
6
Python/optimizer_cases.c.h
generated
6
Python/optimizer_cases.c.h
generated
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue