@@ -73,25 +73,36 @@ def write(self, f: typing.TextIO, indent: str, dedent: int = 0) -> None:
73
73
cache_offset = 0
74
74
for ceffect in self .cache_effects :
75
75
if ceffect .name != UNUSED :
76
- # TODO: if name is 'descr' use PyObject *descr = read_obj(...)
77
76
bits = ceffect .size * BITS_PER_CODE_UNIT
78
- f .write (f"{ indent } uint{ bits } _t { ceffect .name } = " )
79
- if ceffect .size == 1 :
80
- f .write (f"*(next_instr + { cache_offset } );\n " )
77
+ if bits == 64 :
78
+ # NOTE: We assume that 64-bit data in the cache
79
+ # is always an object pointer.
80
+ # If this becomes false, we need a way to specify
81
+ # syntactically what type the cache data is.
82
+ f .write (
83
+ f"{ indent } PyObject *{ ceffect .name } = "
84
+ f"read_obj(next_instr + { cache_offset } );\n "
85
+ )
81
86
else :
82
- f .write (f"read_u{ bits } (next_instr + { cache_offset } );\n " )
87
+ f .write (f"{ indent } uint{ bits } _t { ceffect .name } = " )
88
+ if ceffect .size == 1 :
89
+ # There is no read_u16() helper function.
90
+ f .write (f"*(next_instr + { cache_offset } );\n " )
91
+ else :
92
+ f .write (f"read_u{ bits } (next_instr + { cache_offset } );\n " )
83
93
cache_offset += ceffect .size
84
94
assert cache_offset == self .cache_offset
85
95
86
96
# Write input stack effect variable declarations and initializations
87
- input_names = [seffect .name for seffect in self .input_effects ]
88
97
for i , seffect in enumerate (reversed (self .input_effects ), 1 ):
89
98
if seffect .name != UNUSED :
90
99
f .write (f"{ indent } PyObject *{ seffect .name } = PEEK({ i } );\n " )
91
100
92
101
# Write output stack effect variable declarations
102
+ input_names = {seffect .name for seffect in self .input_effects }
103
+ input_names .add (UNUSED )
93
104
for seffect in self .output_effects :
94
- if seffect .name not in input_names and seffect . name != UNUSED :
105
+ if seffect .name not in input_names :
95
106
f .write (f"{ indent } PyObject *{ seffect .name } ;\n " )
96
107
97
108
self .write_body (f , indent , dedent )
@@ -108,10 +119,13 @@ def write(self, f: typing.TextIO, indent: str, dedent: int = 0) -> None:
108
119
f .write (f"{ indent } STACK_SHRINK({ - diff } );\n " )
109
120
110
121
# Write output stack effect assignments
111
- for i , output in enumerate (reversed (self .output_effects ), 1 ):
112
- # TODO: Only skip if output occurs at same position as input
113
- if output .name not in input_names and output .name != UNUSED :
114
- f .write (f"{ indent } POKE({ i } , { output .name } );\n " )
122
+ unmoved_names = {UNUSED }
123
+ for ieffect , oeffect in zip (self .input_effects , self .output_effects ):
124
+ if ieffect .name == oeffect .name :
125
+ unmoved_names .add (ieffect .name )
126
+ for i , seffect in enumerate (reversed (self .output_effects )):
127
+ if seffect .name not in unmoved_names :
128
+ f .write (f"{ indent } POKE({ i + 1 } , { seffect .name } );\n " )
115
129
116
130
# Write cache effect
117
131
if self .cache_offset :
0 commit comments