Skip to content

Commit 7e8a71b

Browse files
committed
Add tests for dictionaries and dunders
1 parent 0ff5589 commit 7e8a71b

File tree

3 files changed

+285
-198
lines changed

3 files changed

+285
-198
lines changed

mypyc/codegen/emit.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,8 @@ def emit_box(
10831083
for attr, attr_type in cl.all_attributes().items():
10841084
attr_name = self.attr(attr)
10851085
self.emit_line(f"{temp_dest}->{attr_name} = {src}.{attr_name};", ann="box")
1086+
if attr_type.is_refcounted:
1087+
self.emit_inc_ref(temp_dest, attr_type)
10861088

10871089
self.emit_line(f"{declaration}{dest} = (PyObject *){temp_dest};")
10881090
else:

mypyc/codegen/emitwrapper.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ def make_format_string(func_name: str | None, groups: dict[ArgKind, list[Runtime
131131
return format
132132

133133

134+
def unbox_value_if_required(src: str, dest: str, dest_type: RType, emitter: Emitter) -> bool:
135+
"""Declares a new dest variable and unbox if needed. Assumes src is boxed."""
136+
if dest_type.is_unboxed:
137+
emitter.emit_unbox(src, dest, dest_type, declare_dest=True)
138+
return True
139+
else:
140+
emitter.emit_line(f"{emitter.ctype_spaced(dest_type)}{dest} = {src};")
141+
return False
142+
143+
134144
def generate_wrapper_function(
135145
fn: FuncIR, emitter: Emitter, source_path: str, module_name: str
136146
) -> None:
@@ -548,8 +558,9 @@ def generate_hash_wrapper(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
548558
"""Generates a wrapper for native __hash__ methods."""
549559
name = f"{DUNDER_PREFIX}{fn.name}{cl.name_prefix(emitter.names)}"
550560
emitter.emit_line(f"static Py_ssize_t {name}(PyObject *self) {{")
561+
unbox_value_if_required("self", "obj_self", fn.args[0].type, emitter)
551562
emitter.emit_line(
552-
"{}retval = {}{}{}(self);".format(
563+
"{}retval = {}{}{}(obj_self);".format(
553564
emitter.ctype_spaced(fn.ret_type),
554565
emitter.get_group_prefix(fn.decl),
555566
NATIVE_PREFIX,
@@ -575,8 +586,9 @@ def generate_len_wrapper(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
575586
"""Generates a wrapper for native __len__ methods."""
576587
name = f"{DUNDER_PREFIX}{fn.name}{cl.name_prefix(emitter.names)}"
577588
emitter.emit_line(f"static Py_ssize_t {name}(PyObject *self) {{")
589+
unbox_value_if_required("self", "obj_self", fn.args[0].type, emitter)
578590
emitter.emit_line(
579-
"{}retval = {}{}{}(self);".format(
591+
"{}retval = {}{}{}(obj_self);".format(
580592
emitter.ctype_spaced(fn.ret_type),
581593
emitter.get_group_prefix(fn.decl),
582594
NATIVE_PREFIX,
@@ -600,8 +612,9 @@ def generate_bool_wrapper(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
600612
"""Generates a wrapper for native __bool__ methods."""
601613
name = f"{DUNDER_PREFIX}{fn.name}{cl.name_prefix(emitter.names)}"
602614
emitter.emit_line(f"static int {name}(PyObject *self) {{")
615+
unbox_value_if_required("self", "obj_self", fn.args[0].type, emitter)
603616
emitter.emit_line(
604-
"{}val = {}{}(self);".format(
617+
"{}val = {}{}(obj_self);".format(
605618
emitter.ctype_spaced(fn.ret_type), NATIVE_PREFIX, fn.cname(emitter.names)
606619
)
607620
)
@@ -722,8 +735,9 @@ def generate_contains_wrapper(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
722735
name = f"{DUNDER_PREFIX}{fn.name}{cl.name_prefix(emitter.names)}"
723736
emitter.emit_line(f"static int {name}(PyObject *self, PyObject *obj_item) {{")
724737
generate_arg_check("item", fn.args[1].type, emitter, ReturnHandler("-1"))
738+
unbox_value_if_required("self", "obj_self", fn.args[0].type, emitter)
725739
emitter.emit_line(
726-
"{}val = {}{}(self, arg_item);".format(
740+
"{}val = {}{}(obj_self, arg_item);".format(
727741
emitter.ctype_spaced(fn.ret_type), NATIVE_PREFIX, fn.cname(emitter.names)
728742
)
729743
)

0 commit comments

Comments
 (0)