2222from src .arch .z80 .visitor .unary_op_translator import UnaryOpTranslator
2323from src .symbols import sym as symbols
2424from src .symbols .arrayaccess import SymbolARRAYACCESS
25+ from src .symbols .binary import SymbolBINARY
2526from src .symbols .id_ import ref
2627from src .symbols .type_ import Type
2728
@@ -216,7 +217,7 @@ def visit_ARGUMENT(self, node):
216217 return
217218
218219 # ByRef argument
219- if node .value .token != "ARRAYLOAD" :
220+ if node .value .token not in ( "ARRAYLOAD" , "ARRAYACCESS" ) :
220221 scope = node .value .scope
221222 if node .t [0 ] == "_" :
222223 t = optemps .new_t ()
@@ -238,8 +239,18 @@ def visit_ARGUMENT(self, node):
238239 return
239240
240241 # 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+
243254 yield node .value
244255
245256 def visit_ARRAYLOAD (self , node ):
0 commit comments