Skip to content

Commit bd96b39

Browse files
committed
Refactorize FUNCTION visit
1 parent a6ca143 commit bd96b39

File tree

1 file changed

+24
-29
lines changed

1 file changed

+24
-29
lines changed

arch/zx48k/translator.py

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,11 +1323,11 @@ def start(self):
13231323
self.visit(f)
13241324

13251325
def visit_FUNCTION(self, node):
1326-
self.emit('label', node.mangled)
1326+
self.ic_label(node.mangled)
13271327
if node.convention == CONVENTION.fastcall:
1328-
self.emit('enter', '__fastcall__')
1328+
self.ic_enter('__fastcall__')
13291329
else:
1330-
self.emit('enter', node.locals_size)
1330+
self.ic_enter(node.locals_size)
13311331

13321332
for local_var in node.local_symbol_table.values():
13331333
if not local_var.accessed: # HINT: This should never happens as values() is already filtered
@@ -1347,23 +1347,22 @@ def visit_FUNCTION(self, node):
13471347
r = []
13481348
if local_var.default_value is not None:
13491349
r.extend(self.array_default_value(local_var.type_, local_var.default_value))
1350-
self.emit('larrd', local_var.offset, q, local_var.size, r) # Initializes array bounds
1350+
self.ic_larrd(local_var.offset, q, local_var.size, r) # Initializes array bounds
13511351
elif local_var.class_ == CLASS.const:
13521352
continue
13531353
else: # Local vars always defaults to 0, so if 0 we do nothing
13541354
if local_var.default_value is not None and local_var.default_value != 0:
13551355
if isinstance(local_var.default_value, symbols.CONST) and \
13561356
local_var.default_value.token == 'CONST':
1357-
self.emit('lvarx', local_var.offset, self.TSUFFIX(local_var.type_),
1358-
[self.traverse_const(local_var.default_value)])
1357+
self.ic_lvarx(local_var.type_, local_var.offset, [self.traverse_const(local_var.default_value)])
13591358
else:
13601359
q = self.default_value(local_var.type_, local_var.default_value)
1361-
self.emit('lvard', local_var.offset, q)
1360+
self.ic_lvard(local_var.offset, q)
13621361

13631362
for i in node.body:
13641363
yield i
13651364

1366-
self.emit('label', '%s__leave' % node.mangled)
1365+
self.ic_label('%s__leave' % node.mangled)
13671366

13681367
# Now free any local string from memory.
13691368
preserve_hl = False
@@ -1374,57 +1373,53 @@ def visit_FUNCTION(self, node):
13741373
if scope == SCOPE.local or (scope == SCOPE.parameter and not local_var.byref):
13751374
if not preserve_hl:
13761375
preserve_hl = True
1377-
self.emit('exchg')
1376+
self.ic_exchg()
13781377

13791378
offset = -local_var.offset if scope == SCOPE.local else local_var.offset
1380-
self.emit('fploadstr', local_var.t, offset)
1381-
self.emit('call', '__MEM_FREE', 0)
1379+
self.ic_fpload(TYPE.string, local_var.t, offset)
1380+
self.ic_call('__MEM_FREE', 0)
13821381
self.REQUIRES.add('free.asm')
13831382
elif local_var.class_ == CLASS.const:
13841383
continue
13851384
else: # This is an array of strings, we must free it unless it's a by_ref array
13861385
if scope == SCOPE.local or (scope == SCOPE.parameter and not local_var.byref):
13871386
if not preserve_hl:
13881387
preserve_hl = True
1389-
self.emit('exchg')
1388+
self.ic_exchg()
13901389

1391-
self.emit('param' + self.TSUFFIX(gl.BOUND_TYPE), local_var.count)
1390+
self.ic_param(gl.BOUND_TYPE, local_var.count)
13921391
t2 = optemps.new_t()
13931392
if scope == SCOPE.parameter:
1394-
self.emit('pload%s' % self.TSUFFIX(gl.PTR_TYPE), t2,
1395-
'%i' % (local_var.offset - self.TYPE(gl.PTR_TYPE).size))
1393+
self.ic_pload(gl.PTR_TYPE, t2, '%i' % (local_var.offset - self.TYPE(gl.PTR_TYPE).size))
13961394
elif scope == SCOPE.local:
1397-
self.emit('pload%s' % self.TSUFFIX(gl.PTR_TYPE), t2,
1398-
'%i' % -(local_var.offset - self.TYPE(gl.PTR_TYPE).size))
1399-
self.emit('fparam' + self.TSUFFIX(gl.PTR_TYPE), t2)
1400-
self.emit('call', '__ARRAYSTR_FREE_MEM', 0) # frees all the strings and the array itself
1395+
self.ic_pload(gl.PTR_TYPE, t2, '%i' % -(local_var.offset - self.TYPE(gl.PTR_TYPE).size))
1396+
self.ic_fparam(gl.PTR_TYPE, t2)
1397+
self.ic_call('__ARRAYSTR_FREE_MEM', 0)
14011398
self.REQUIRES.add('arraystrfree.asm')
14021399

14031400
if local_var.class_ == CLASS.array and local_var.type_ != self.TYPE(TYPE.string) and \
14041401
(scope == SCOPE.local or (scope == SCOPE.parameter and not local_var.byref)):
14051402
if not preserve_hl:
14061403
preserve_hl = True
1407-
self.emit('exchg')
1404+
self.ic_exchg()
14081405

14091406
t2 = optemps.new_t()
14101407
if scope == SCOPE.parameter:
1411-
self.emit('pload%s' % self.TSUFFIX(gl.PTR_TYPE), t2, '%i'
1412-
% (local_var.offset - self.TYPE(gl.PTR_TYPE).size))
1408+
self.ic_pload(gl.PTR_TYPE, t2, '%i' % (local_var.offset - self.TYPE(gl.PTR_TYPE).size))
14131409
elif scope == SCOPE.local:
1414-
self.emit('pload%s' % self.TSUFFIX(gl.PTR_TYPE), t2, '%i'
1415-
% -(local_var.offset - self.TYPE(gl.PTR_TYPE).size))
1410+
self.ic_pload(gl.PTR_TYPE, t2, '%i' % -(local_var.offset - self.TYPE(gl.PTR_TYPE).size))
14161411

1417-
self.emit('fparam' + self.TSUFFIX(gl.PTR_TYPE), t2)
1418-
self.emit('call', '__MEM_FREE', 0)
1412+
self.ic_fparam(gl.PTR_TYPE, t2)
1413+
self.ic_call('__MEM_FREE', 0)
14191414
self.REQUIRES.add('free.asm')
14201415

14211416
if preserve_hl:
1422-
self.emit('exchg')
1417+
self.ic_exchg()
14231418

14241419
if node.convention == CONVENTION.fastcall:
1425-
self.emit('leave', CONVENTION.to_string(node.convention))
1420+
self.ic_leave(CONVENTION.to_string(node.convention))
14261421
else:
1427-
self.emit('leave', node.params.size)
1422+
self.ic_leave(node.params.size)
14281423

14291424
def visit_FUNCDECL(self, node):
14301425
""" Nested scope functions

0 commit comments

Comments
 (0)