Skip to content

Commit 69fb348

Browse files
authored
[mypyc] Fix broken master due to use of IS_FREE_THREADED (#22217)
#22203 broke CI.
1 parent c39fc6d commit 69fb348

4 files changed

Lines changed: 26 additions & 14 deletions

File tree

‎mypyc/codegen/emitclass.py‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,7 +1399,11 @@ def generate_getter(cl: ClassIR, attr: str, rtype: RType, emitter: Emitter) -> N
13991399
emitter.emit_line("}")
14001400
return
14011401

1402-
if IS_FREE_THREADED and is_int_rprimitive(rtype) and attr not in cl.final_attributes:
1402+
if (
1403+
emitter.target_python.free_threaded
1404+
and is_int_rprimitive(rtype)
1405+
and attr not in cl.final_attributes
1406+
):
14031407
# In free-threaded builds, CPyTagged_GetAttr takes a new reference to a long
14041408
# value without racing with a concurrent setter (see CPyTagged_SetAttr). It
14051409
# returns CPY_INT_TAG if the attribute is undefined.
@@ -1479,7 +1483,7 @@ def generate_setter(cl: ClassIR, attr: str, rtype: RType, emitter: Emitter) -> N
14791483
emitter.emit_line("}")
14801484
return
14811485

1482-
if IS_FREE_THREADED and is_int_rprimitive(rtype):
1486+
if emitter.target_python.free_threaded and is_int_rprimitive(rtype):
14831487
# In free-threaded builds, CPyTagged_SetAttr steals the new value and safely
14841488
# reclaims the old one (see CPyTagged_GetAttr). Unbox (borrowed) and take a
14851489
# new reference to hand over; a failed unbox leaves the attribute intact.

‎mypyc/codegen/emitfunc.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ def emit_load_attr_take_ref(
470470
ClassIR.attrs_are_thread_confined.
471471
"""
472472
if (
473-
IS_FREE_THREADED
473+
self.emitter.target_python.free_threaded
474474
and is_int_rprimitive(attr_rtype)
475475
and not op.is_borrowed
476476
and not cl.attrs_are_thread_confined()
@@ -659,7 +659,7 @@ def visit_set_attr(self, op: SetAttr) -> None:
659659
if op.error_kind == ERR_FALSE:
660660
self.emitter.emit_line(f"{dest} = 1;")
661661
elif (
662-
IS_FREE_THREADED
662+
self.emitter.target_python.free_threaded
663663
and is_int_rprimitive(attr_rtype)
664664
and not cl.attrs_are_thread_confined()
665665
):

‎mypyc/test/test_emitclass.py‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,16 @@ def test_free_threaded_ref_attribute_getter_and_setter_use_owner(self) -> None:
6363
assert "CPy_SetAttrRef((PyObject *)self, (PyObject **)&self->_o, tmp)" in generated
6464
assert "CPy_SetAttrRef((PyObject *)self, (PyObject **)&self->_o, NULL)" in generated
6565

66-
@unittest.skipUnless(IS_FREE_THREADED, "requires a free threaded build")
6766
def test_free_threaded_int_attribute_getter_and_setter(self) -> None:
6867
cl = ClassIR("A", "mod")
6968
cl.attributes = {"n": int_rprimitive}
7069
cl.deletable = ["n"]
7170
cl.mro = cl.base_mro = [cl]
72-
emitter = Emitter(EmitterContext(NameGenerator([["mod"]]), True))
71+
emitter = Emitter(
72+
EmitterContext(
73+
NameGenerator([["mod"]]), True, target_python=TargetPython((3, 14), True)
74+
)
75+
)
7376

7477
generate_getter(cl, "n", int_rprimitive, emitter)
7578
generate_setter(cl, "n", int_rprimitive, emitter)

‎mypyc/test/test_emitfunc.py‎

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ def use_free_threaded_target(self) -> None:
154154
NameGenerator([["mod"]]), True, target_python=TargetPython((3, 14), True)
155155
)
156156

157+
def use_gil_target(self) -> None:
158+
self.context = EmitterContext(
159+
NameGenerator([["mod"]]), True, target_python=TargetPython((3, 14), False)
160+
)
161+
157162
def test_goto(self) -> None:
158163
self.assert_emit(Goto(BasicBlock(2)), "goto CPyL2;")
159164

@@ -523,8 +528,8 @@ def test_list_append(self) -> None:
523528
"""cpy_r_r0 = PyList_Append(cpy_r_l, cpy_r_o);""",
524529
)
525530

526-
@unittest.skipIf(IS_FREE_THREADED, "free threaded builds use CPyTagged_GetAttr")
527531
def test_get_attr(self) -> None:
532+
self.use_gil_target()
528533
self.assert_emit(
529534
GetAttr(self.r, "y", 1),
530535
"""cpy_r_r0 = ((mod___AObject *)cpy_r_r)->_y;
@@ -536,8 +541,8 @@ def test_get_attr(self) -> None:
536541
""",
537542
)
538543

539-
@unittest.skipUnless(IS_FREE_THREADED, "requires a free threaded build")
540544
def test_get_attr_int_free_threaded(self) -> None:
545+
self.use_free_threaded_target()
541546
self.assert_emit(
542547
GetAttr(self.r, "y", 1),
543548
"""\
@@ -548,8 +553,8 @@ def test_get_attr_int_free_threaded(self) -> None:
548553
""",
549554
)
550555

551-
@unittest.skipUnless(IS_FREE_THREADED, "requires a free threaded build")
552556
def test_get_attr_int_merged_free_threaded(self) -> None:
557+
self.use_free_threaded_target()
553558
op = GetAttr(self.r, "y", 1)
554559
branch = Branch(op, BasicBlock(8), BasicBlock(9), Branch.IS_ERROR)
555560
branch.traceback_entry = ("foobar", 123)
@@ -589,8 +594,8 @@ def test_get_attr_ref_free_threaded(self) -> None:
589594
""",
590595
)
591596

592-
@unittest.skipIf(IS_FREE_THREADED, "free threaded builds use CPyTagged_GetAttr")
593597
def test_get_attr_merged(self) -> None:
598+
self.use_gil_target()
594599
op = GetAttr(self.r, "y", 1)
595600
branch = Branch(op, BasicBlock(8), BasicBlock(9), Branch.IS_ERROR)
596601
branch.traceback_entry = ("foobar", 123)
@@ -630,8 +635,8 @@ def test_get_attr_nullable_with_tuple(self) -> None:
630635
""",
631636
)
632637

633-
@unittest.skipIf(IS_FREE_THREADED, "free threaded builds use CPyTagged_SetAttr")
634638
def test_set_attr(self) -> None:
639+
self.use_gil_target()
635640
self.assert_emit(
636641
SetAttr(self.r, "y", self.m, 1),
637642
"""if (((mod___AObject *)cpy_r_r)->_y != CPY_INT_TAG) {
@@ -652,8 +657,8 @@ def test_set_attr_ref_free_threaded(self) -> None:
652657
""",
653658
)
654659

655-
@unittest.skipUnless(IS_FREE_THREADED, "requires a free threaded build")
656660
def test_set_attr_int_free_threaded(self) -> None:
661+
self.use_free_threaded_target()
657662
self.assert_emit(
658663
SetAttr(self.r, "y", self.m, 1),
659664
"""\
@@ -662,8 +667,8 @@ def test_set_attr_int_free_threaded(self) -> None:
662667
""",
663668
)
664669

665-
@unittest.skipUnless(IS_FREE_THREADED, "requires a free threaded build")
666670
def test_set_attr_int_init_free_threaded(self) -> None:
671+
self.use_free_threaded_target()
667672
op = SetAttr(self.r, "y", self.m, 1)
668673
op.mark_as_initializer()
669674
self.assert_emit(op, "CPyTagged_InitAttr(&((mod___AObject *)cpy_r_r)->_y, cpy_r_m);")
@@ -676,8 +681,8 @@ def test_set_attr_non_refcounted(self) -> None:
676681
""",
677682
)
678683

679-
@unittest.skipIf(IS_FREE_THREADED, "free threaded builds use CPyTagged_SetAttr")
680684
def test_set_attr_no_error(self) -> None:
685+
self.use_gil_target()
681686
op = SetAttr(self.r, "y", self.m, 1)
682687
op.error_kind = ERR_NEVER
683688
self.assert_emit(

0 commit comments

Comments
 (0)