[Wisp-cvs] wisp/users/dig tran-builtins,1.20,1.21 tran.py,1.92,1.93
Status: Alpha
Brought to you by:
digg
From: <di...@us...> - 2003-05-17 11:05:40
|
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': |