@@ -131,6 +131,16 @@ def make_format_string(func_name: str | None, groups: dict[ArgKind, list[Runtime
131
131
return format
132
132
133
133
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
+
134
144
def generate_wrapper_function (
135
145
fn : FuncIR , emitter : Emitter , source_path : str , module_name : str
136
146
) -> None :
@@ -548,8 +558,9 @@ def generate_hash_wrapper(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
548
558
"""Generates a wrapper for native __hash__ methods."""
549
559
name = f"{ DUNDER_PREFIX } { fn .name } { cl .name_prefix (emitter .names )} "
550
560
emitter .emit_line (f"static Py_ssize_t { name } (PyObject *self) {{" )
561
+ unbox_value_if_required ("self" , "obj_self" , fn .args [0 ].type , emitter )
551
562
emitter .emit_line (
552
- "{}retval = {}{}{}(self );" .format (
563
+ "{}retval = {}{}{}(obj_self );" .format (
553
564
emitter .ctype_spaced (fn .ret_type ),
554
565
emitter .get_group_prefix (fn .decl ),
555
566
NATIVE_PREFIX ,
@@ -575,8 +586,9 @@ def generate_len_wrapper(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
575
586
"""Generates a wrapper for native __len__ methods."""
576
587
name = f"{ DUNDER_PREFIX } { fn .name } { cl .name_prefix (emitter .names )} "
577
588
emitter .emit_line (f"static Py_ssize_t { name } (PyObject *self) {{" )
589
+ unbox_value_if_required ("self" , "obj_self" , fn .args [0 ].type , emitter )
578
590
emitter .emit_line (
579
- "{}retval = {}{}{}(self );" .format (
591
+ "{}retval = {}{}{}(obj_self );" .format (
580
592
emitter .ctype_spaced (fn .ret_type ),
581
593
emitter .get_group_prefix (fn .decl ),
582
594
NATIVE_PREFIX ,
@@ -600,8 +612,9 @@ def generate_bool_wrapper(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
600
612
"""Generates a wrapper for native __bool__ methods."""
601
613
name = f"{ DUNDER_PREFIX } { fn .name } { cl .name_prefix (emitter .names )} "
602
614
emitter .emit_line (f"static int { name } (PyObject *self) {{" )
615
+ unbox_value_if_required ("self" , "obj_self" , fn .args [0 ].type , emitter )
603
616
emitter .emit_line (
604
- "{}val = {}{}(self );" .format (
617
+ "{}val = {}{}(obj_self );" .format (
605
618
emitter .ctype_spaced (fn .ret_type ), NATIVE_PREFIX , fn .cname (emitter .names )
606
619
)
607
620
)
@@ -722,8 +735,9 @@ def generate_contains_wrapper(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str:
722
735
name = f"{ DUNDER_PREFIX } { fn .name } { cl .name_prefix (emitter .names )} "
723
736
emitter .emit_line (f"static int { name } (PyObject *self, PyObject *obj_item) {{" )
724
737
generate_arg_check ("item" , fn .args [1 ].type , emitter , ReturnHandler ("-1" ))
738
+ unbox_value_if_required ("self" , "obj_self" , fn .args [0 ].type , emitter )
725
739
emitter .emit_line (
726
- "{}val = {}{}(self , arg_item);" .format (
740
+ "{}val = {}{}(obj_self , arg_item);" .format (
727
741
emitter .ctype_spaced (fn .ret_type ), NATIVE_PREFIX , fn .cname (emitter .names )
728
742
)
729
743
)
0 commit comments