22
22
from src .arch .z80 .visitor .unary_op_translator import UnaryOpTranslator
23
23
from src .symbols import sym as symbols
24
24
from src .symbols .arrayaccess import SymbolARRAYACCESS
25
+ from src .symbols .binary import SymbolBINARY
25
26
from src .symbols .id_ import ref
26
27
from src .symbols .type_ import Type
27
28
@@ -216,7 +217,7 @@ def visit_ARGUMENT(self, node):
216
217
return
217
218
218
219
# ByRef argument
219
- if node .value .token != "ARRAYLOAD" :
220
+ if node .value .token not in ( "ARRAYLOAD" , "ARRAYACCESS" ) :
220
221
scope = node .value .scope
221
222
if node .t [0 ] == "_" :
222
223
t = optemps .new_t ()
@@ -238,8 +239,18 @@ def visit_ARGUMENT(self, node):
238
239
return
239
240
240
241
# Must compute Address of @array(...)
241
- node .value = SymbolARRAYACCESS .copy_from (node .value )
242
- node .value = symbols .UNARY ("ADDRESS" , node .value , node .lineno , type_ = self .TYPE (gl .PTR_TYPE ))
242
+ if node .value .scope == SCOPE .global_ and self .O_LEVEL > 1 : # Calculate offset if global variable
243
+ node .value = SymbolBINARY .make_node (
244
+ "PLUS" ,
245
+ symbols .UNARY ("ADDRESS" , node .value .entry , node .value .lineno , type_ = self .TYPE (gl .PTR_TYPE )),
246
+ symbols .NUMBER (node .value .offset , lineno = node .value .lineno , type_ = self .TYPE (gl .PTR_TYPE )),
247
+ lineno = node .lineno ,
248
+ func = lambda x , y : x + y ,
249
+ )
250
+ else :
251
+ node .value = SymbolARRAYACCESS .copy_from (node .value )
252
+ node .value = symbols .UNARY ("ADDRESS" , node .value , node .lineno , type_ = self .TYPE (gl .PTR_TYPE ))
253
+
243
254
yield node .value
244
255
245
256
def visit_ARRAYLOAD (self , node ):
0 commit comments