Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv17356
Modified Files:
tran-builtins tran.py
Log Message:
implemented automatic section management for Interpreter
Index: tran-builtins
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- tran-builtins 17 May 2003 10:54:46 -0000 1.20
+++ tran-builtins 17 May 2003 11:05:34 -0000 1.21
@@ -40,15 +40,6 @@
n = interpreter.regstack.pop(); m = interpreter.regstack.pop()
interpreter.regstack.append(m - n)
-.bss
- interpreter.current = interpreter.bss
-
-.data
- interpreter.current = interpreter.data
-
-.text
- interpreter.current = interpreter.text
-
//
interpreter.regstack = []
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -d -r1.92 -r1.93
--- tran.py 17 May 2003 10:54:46 -0000 1.92
+++ tran.py 17 May 2003 11:05:35 -0000 1.93
@@ -220,7 +220,7 @@
Generic_Register = Register()
class Interpreter (object):
- __slots__ = 'text data bss current recordee regpaths hanging regstack state meaning'.split()
+ __slots__ = 'sections current recordee regpaths hanging regstack state meaning'.split()
universal_meaning = {
'reg': Generic_Register,
@@ -248,17 +248,23 @@
if _pa: _flags |= MA_PREFIX
universal_meaning[_name] = 'builtin', _p, _flags
- def __init__ (this, byte_order):
- this.text = Linkie('<')
- this.data = Linkie('<')
- this.bss = Linkie('<')
- this.current = this.text
+ def make_section_switcher (this, name):
+ def switcher ():
+ this.current = this.sections[name]
+ return switcher
+
+ def __init__ (this, byte_order, sections = ['.text']):
+ this.sections = {}
+ this.meaning = Interpreter.universal_meaning.copy()
+ for s in sections:
+ this.sections[s] = Linkie(byte_order)
+ this.meaning[s] = 'builtin', this.make_section_switcher(s), 0
+ this.current = this.sections[sections[0]]
this.recordee = None
this.regpaths = [Register(0)] # for generating new registers
this.hanging = {}
this.regstack = []
this.state = this.outer_state
- this.meaning = Interpreter.universal_meaning.copy()
def outer_state (this, tok):
if isinstance(tok, Integer_Literal):
this.regstack.append(tok)
@@ -288,7 +294,7 @@
else: raise 'Unknown meaning format for', tok
else: raise 'bad token', tok
-interpreter = Interpreter('<')
+interpreter = Interpreter('<', ['.text', '.data', '.bss'])
Registers = {Generic_Register: 'reg'} # for reverse translation
@@ -328,15 +334,15 @@
if verbose: print '(%s) %s' % (' '.join(map(str, interpreter.regstack)), tok)
interpreter.state(tok)
tok = prep.get_token()
- interpreter.text.dump(title = 'TEXT')
- interpreter.data.dump(title = 'DATA')
- interpreter.bss.dump(title = 'BSS')
+ interpreter.sections['.text'].dump(title = 'TEXT')
+ interpreter.sections['.data'].dump(title = 'DATA')
+ interpreter.sections['.bss'].dump(title = 'BSS')
if interpreter.regstack:
raise 'Regstack not empty after parsing ended', interpreter.regstack
argum = {
- 'text': interpreter.text,
- 'data': interpreter.data,
- 'bss': interpreter.bss,
+ 'text': interpreter.sections['.text'],
+ 'data': interpreter.sections['.data'],
+ 'bss': interpreter.sections['.bss'],
}
if base <> None: argum['base_address'] = base
if format == 'elf':
|