Skip to content

Commit 7f87c85

Browse files
call the garbage collector now and then
this enables the assembler to translate larger source files without running out of memory. optimized removal of comments.
1 parent a19ae7b commit 7f87c85

File tree

4 files changed

+24
-4
lines changed

4 files changed

+24
-4
lines changed

esp32_ulp/__main__.py

+4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import sys
22

3+
from .util import garbage_collect
4+
35
from .assemble import Assembler
46
from .link import make_binary
7+
garbage_collect('after import')
58

69

710
def src_to_binary(src):
811
assembler = Assembler()
912
assembler.assemble(src)
13+
garbage_collect('before symbols export')
1014
addrs_syms = assembler.symbols.export()
1115
for addr, sym in addrs_syms:
1216
print('%04d %s' % (addr, sym))

esp32_ulp/assemble.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from . import opcodes
66
from .nocomment import remove_comments
7+
from .util import garbage_collect
78

89
TEXT, DATA, BSS = 'text', 'data', 'bss'
910

@@ -139,8 +140,7 @@ def parse_line(self, line):
139140
return label, opcode, args
140141

141142

142-
def parse(self, text):
143-
lines = remove_comments(text)
143+
def parse(self, lines):
144144
parsed = [self.parse_line(line) for line in lines]
145145
return [p for p in parsed if p is not None]
146146

@@ -271,10 +271,13 @@ def assembler_pass(self, lines):
271271
raise Exception('Unknown opcode or directive: %s' % opcode)
272272
self.finalize_sections()
273273

274-
def assemble(self, lines):
274+
def assemble(self, text):
275+
lines = remove_comments(text)
275276
self.init(1) # pass 1 is only to get the symbol table right
276277
self.assembler_pass(lines)
277278
self.symbols.set_bases(self.compute_bases())
279+
garbage_collect('before pass2')
278280
self.init(2) # now we know all symbols and bases, do the real assembler pass, pass 2
279281
self.assembler_pass(lines)
282+
garbage_collect('after pass2')
280283

esp32_ulp/util.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
DEBUG = False
2+
3+
import gc
4+
5+
6+
def garbage_collect(msg, verbose=DEBUG):
7+
free_before = gc.mem_free()
8+
gc.collect()
9+
free_after = gc.mem_free()
10+
if verbose:
11+
print("%s: %d --gc--> %d bytes free" % (msg, free_before, free_after))

tests/assemble.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from esp32_ulp.assemble import Assembler, TEXT, DATA, BSS, REL, ABS
22
from esp32_ulp.assemble import SymbolTable
3+
from esp32_ulp.nocomment import remove_comments
34

45
src = """\
56
@@ -25,7 +26,8 @@ def test_parse_line():
2526

2627
def test_parse():
2728
a = Assembler()
28-
result = a.parse(src)
29+
lines = remove_comments(src)
30+
result = a.parse(lines)
2931
assert None not in result
3032

3133

0 commit comments

Comments
 (0)