# For now... until we constant propagate it away.
self.assertIn("_BINARY_OP", uops)
+ def test_reference_tracking_across_call_doesnt_crash(self):
+
+ def f1():
+ for _ in range(TIER2_THRESHOLD + 1):
+ # Choose a value that won't occur elsewhere to avoid sharing
+ str("value that won't occur elsewhere to avoid sharing")
+
+ f1()
+
+ def f2():
+ for _ in range(TIER2_THRESHOLD + 1):
+ # Choose a value that won't occur elsewhere to avoid sharing
+ tuple((31, -17, 25, "won't occur elsewhere"))
+
+ f2()
+
def global_identity(x):
return x
}
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;
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);
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);
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;
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);
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);