-
-
Notifications
You must be signed in to change notification settings - Fork 34.4k
gh-148374: Fix a bug in _Py_uop_sym_get_type
#148375
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
cc75b3d
c03a070
f9345a3
d848083
c76db65
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,4 +1,4 @@ | ||
| #ifdef _Py_TIER2 | ||
| ifdef _Py_TIER2 | ||
|
|
||
| #include "Python.h" | ||
|
|
||
|
|
@@ -783,6 +783,7 @@ _Py_uop_sym_get_type(JitOptRef ref) | |
| case JIT_SYM_NON_NULL_TAG: | ||
| case JIT_SYM_UNKNOWN_TAG: | ||
| case JIT_SYM_RECORDED_TYPE_TAG: | ||
| case JIT_SYM_RECORDED_GEN_FUNC_TAG: | ||
| return NULL; | ||
| case JIT_SYM_RECORDED_VALUE_TAG: | ||
| if (sym->recorded_value.known_type) { | ||
|
|
@@ -804,8 +805,6 @@ _Py_uop_sym_get_type(JitOptRef ref) | |
| return &PyBool_Type; | ||
| case JIT_SYM_COMPACT_INT: | ||
| return &PyLong_Type; | ||
| case JIT_SYM_RECORDED_GEN_FUNC_TAG: | ||
| return &PyGen_Type; | ||
| } | ||
| Py_UNREACHABLE(); | ||
| } | ||
|
|
@@ -830,7 +829,7 @@ _Py_uop_sym_get_probable_type(JitOptRef ref) | |
| case JIT_SYM_KNOWN_VALUE_TAG: | ||
| return _Py_uop_sym_get_type(ref); | ||
| case JIT_SYM_RECORDED_GEN_FUNC_TAG: | ||
| return NULL; | ||
| return &PyGen_Type; | ||
| case JIT_SYM_RECORDED_VALUE_TAG: | ||
| return Py_TYPE(sym->recorded_value.value); | ||
| case JIT_SYM_RECORDED_TYPE_TAG: | ||
|
|
@@ -2211,7 +2210,8 @@ _Py_uop_symbols_test(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) | |
| /* Test that recorded type aren't treated as known values*/ | ||
| JitOptRef rg1 = _Py_uop_sym_new_unknown(ctx); | ||
| _Py_uop_sym_set_recorded_gen_func(ctx, rg1, func); | ||
| TEST_PREDICATE(_Py_uop_sym_matches_type(rg1, &PyGen_Type), "recorded gen func not treated as generator"); | ||
| TEST_PREDICATE(!_Py_uop_sym_matches_type(rg1, &PyGen_Type), "recorded gen func treated as generator"); | ||
| TEST_PREDICATE(_Py_uop_sym_get_probable_type(rg1) == &PyGen_Type, "recorded gen func not treated as generator"); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Seems like the test is failing. Not sure why. can you do some debugging please and check what type returns? You can do something like
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I thought it was due to this test? I have to go for a bit now, I'll upload the debug prints when i'm back
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Okay, I think I understand what's going on.
JitOptRef rg1 = _Py_uop_sym_new_unknown(ctx);
_Py_uop_sym_set_recorded_gen_func(ctx, rg1, func);
TEST_PREDICATE(!_Py_uop_sym_matches_type(rg1, &PyGen_Type), "recorded gen func treated as generator");
TEST_PREDICATE(_Py_uop_sym_get_probable_type(rg1) == &PyGen_Type, "rg1: recorded gen func not treated as generator");
TEST_PREDICATE(_Py_uop_sym_get_const(ctx, rg1) == NULL, "recorded gen func is treated as known value");
/* Test that setting type narrows correctly */
JitOptRef rg2 = _Py_uop_sym_new_unknown(ctx);
_Py_uop_sym_set_recorded_gen_func(ctx, rg2, func);
_Py_uop_sym_set_type(ctx, rg2, &PyGen_Type);
TEST_PREDICATE(!_Py_uop_sym_matches_type(rg2, &PyGen_Type), "rg2: recorded gen func not treated as generator");
TEST_PREDICATE(_Py_uop_sym_get_const(ctx, rg2) == NULL, "known type is treated as known value");
JitOptRef rg3 = _Py_uop_sym_new_unknown(ctx);
_Py_uop_sym_set_recorded_gen_func(ctx, rg3, func);
_Py_uop_sym_set_type_version(ctx, rg3, PyGen_Type.tp_version_tag);
TEST_PREDICATE(!_Py_uop_sym_matches_type(rg3, &PyGen_Type), "rg3: recorded gen func not treated as generator");
TEST_PREDICATE(_Py_uop_sym_get_const(ctx, rg3) == NULL, "recorded value with type is treated as known");Output: Running Debug|x64 interpreter...
F.....
======================================================================
FAIL: test_optimizer_symbols (test.test_optimizer.TestOptimizerSymbols.test_optimizer_symbols)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Sacul Dev Stuff\Cpython - Contributing\cpython\Lib\test\test_optimizer.py", line 86, in test_optimizer_symbols
_testinternalcapi.uop_symbols_test()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
AssertionError: rg2: recorded gen func not treated as generator
Running Debug|x64 interpreter...
F.....
======================================================================
FAIL: test_optimizer_symbols (test.test_optimizer.TestOptimizerSymbols.test_optimizer_symbols)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Sacul Dev Stuff\Cpython - Contributing\cpython\Lib\test\test_optimizer.py", line 86, in test_optimizer_symbols
_testinternalcapi.uop_symbols_test()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
AssertionError: rg3: recorded gen func not treated as generator
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh yeah you're right. Please amend the other tests. |
||
| TEST_PREDICATE(_Py_uop_sym_get_const(ctx, rg1) == NULL, "recorded gen func is treated as known value"); | ||
|
|
||
| /* Test that setting type narrows correctly */ | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.