wisp-cvs Mailing List for Wisp interpreter (Page 6)
Status: Alpha
Brought to you by:
digg
You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(30) |
Sep
(312) |
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(5) |
Feb
(131) |
Mar
(17) |
Apr
(184) |
May
(252) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
|
Dec
|
From: <di...@us...> - 2003-05-17 12:02:01
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv23206 Modified Files: interpreter.py Log Message: introduced Register.names Index: interpreter.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/interpreter.py,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- interpreter.py 17 May 2003 11:46:36 -0000 1.2 +++ interpreter.py 17 May 2003 12:01:58 -0000 1.3 @@ -139,22 +139,24 @@ else: return Lexer.get_token(this) class Register (tuple, Stackable): - def __new__ (cls, items): - return tuple.__new__(cls, items) + def __new__ (cls, items, names = None): + this = tuple.__new__(cls, items) + this.names = names + return this def parent (this): - if len(this): return Register(this[:-1]) + if len(this): return Register(this[:-1], this.names) else: return None def next (this): l = list(this) l[-1] += 1 - return Register(l) + return Register(l, this.names) def child (this, index = 0): - return Register(this + (index,)) + return Register(this + (index,), this.names) def __repr__ (this): return 'Register' + tuple.__repr__(this) def __str__ (this): - if Registers.has_key(this): - return Registers[this] + if this.names != None and this.names.has_key(this): + return this.names[this] else: return '%' + '.'.join(map(str, this)) def contained_registers (this): |
From: <di...@us...> - 2003-05-17 11:46:41
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv13944 Modified Files: interpreter.py Log Message: changed Register.__new__'s interface to take all items in a single argument Index: interpreter.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/interpreter.py,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- interpreter.py 17 May 2003 11:35:29 -0000 1.1 +++ interpreter.py 17 May 2003 11:46:36 -0000 1.2 @@ -139,17 +139,17 @@ else: return Lexer.get_token(this) class Register (tuple, Stackable): - def __new__ (cls, *args): - return tuple.__new__(cls, args) + def __new__ (cls, items): + return tuple.__new__(cls, items) def parent (this): - if len(this): return apply(Register, this[:-1]) + if len(this): return Register(this[:-1]) else: return None def next (this): l = list(this) l[-1] += 1 - return apply(Register, l) + return Register(l) def child (this, index = 0): - return apply(Register, this + (index,)) + return Register(this + (index,)) def __repr__ (this): return 'Register' + tuple.__repr__(this) def __str__ (this): @@ -203,7 +203,7 @@ except StopIteration: pass except StopIteration: pass -Generic_Register = Register() +Generic_Register = Register([]) MA_PREFIX = 1 @@ -248,7 +248,7 @@ 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.regpaths = [Register([0])] # for generating new registers this.hanging = {} this.regstack = [] this.state = this.outer_state |
From: <di...@us...> - 2003-05-17 11:35:32
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv7583a Modified Files: Makefile.am tran.py Added Files: interpreter.py Log Message: extracted interpreter.py from tran.py --- NEW FILE: interpreter.py --- #### interpreter.py # # Copyleft © 2003 by Andres Soolo (di...@us...) # This file is licensed under the GNU GPL v2. If you # don't know what that means, please do read the GPL. # #### @(#) $Id: interpreter.py,v 1.1 2003/05/17 11:35:29 digg Exp $ # Not yet importable! def simplest_summable (scalar, symbols, registers): if len(symbols) == len(registers) == 0: return Integer_Literal(scalar) elif scalar == len(registers) == 0 and len(symbols) == 1: return symbols[0] elif len(registers) == 0: return Sum((Integer_Literal(scalar),) + tuple(symbols)) else: return NotImplemented class Summable (object): def get_scalar (this): return 0 def get_symbols (this): return () def get_registers (this): return () def __add__ (this, that): scalar = this.get_scalar() + that.get_scalar() symbols = this.get_symbols() + that.get_symbols() registers = this.get_registers() + that.get_registers() return simplest_summable(scalar, symbols, registers) def __sub__ (this, that): if len(that.get_symbols()) <> 0 or len(that.get_registers()) <> 0: return NotImplemented scalar = this.get_scalar() - that.get_scalar() symbols = this.get_symbols() registers = this.get_registers() return simplest_summable(scalar, symbols, registers) class Token (object): pass class Stackable (object): def contained_registers (this): return () class Integer_Literal (long, Stackable, Token, Summable): def __new__ (cls, i): return long.__new__(cls, i) def __add__ (this, that): return Integer_Literal(long(this) + long(that)) def __sub__ (this, that): return Integer_Literal(long(this) - long(that)) def __repr__ (this): return 'Integer_Literal(%i)' % long(this) def get_scalar (this): return long(this) class Symbol_Literal (str, Stackable, Summable): def __new__ (cls, s): return str.__new__(cls, s) def __repr__ (this): return 'Symbol_Literal(%r)' % str(this) def get_symbols (this): return this, class Sum (tuple, Summable): def __new__ (cls, addends): scalar = 0 me = [] for a in addends: if isinstance(a, Integer_Literal): scalar += long(a) elif isinstance(a, Symbol_Literal): me.append(a) else: raise 'improper addend', a return tuple.__new__(cls, [Integer_Literal(scalar)] + me) def __repr__ (this): return 'Sum(%s)' % repr(tuple(this)) def __str__ (this): return '+'.join(map(str, this)) class Unique (object): def __init__ (this, name): this.name = name def __repr__ (this): return 'Unique(%r)' % this.name def __str__ (this): return this.name class Unique_Token (Unique, Token): pass Semicolon = Unique_Token(';') class Token_Source (object): """After creation, a Token_Source instance will deliver one token each time its get_token method is called, until the token stream ends. After that, it will return None.""" get_token = abstract class Lexer (shlex, Token_Source): def __init__ (this, filename): shlex.__init__(this, instream = open(filename, 'r'), infile = filename) this.commenters = '\\' this.quotes = '"' this.wordchars += '!#$%*+,-./:;<=>?@[]' def get_token (this): tok = shlex.get_token(this) if tok == '': tok = None elif tok[:2] == '#o': tok = Integer_Literal(string.atol(tok[2:], 8)) elif tok[:2] == '#x': tok = Integer_Literal(string.atol(tok[2:], 16)) elif tok[:2] == '#/' and len(tok) == 3: tok = Integer_Literal(ord(tok[2])) else: try: tok = Integer_Literal(string.atol(tok, 10)) except: pass if tok == ';': return Semicolon else: return tok def push_file (this, filename): this.push_source(open(filename, 'r'), filename) class Macro_Cursor (Token_Source): def __init__ (this, sequence): this.sequence = sequence this.current = 0 def get_token (this): if this.current >= len(this.sequence): return None datum = this.sequence[this.current] this.current += 1 return datum class Preprocessor (Lexer): __slots__ = ['tss'] def __init__ (this, filename): Lexer.__init__(this, filename) this.tss = [] def push (this, toksrc): this.tss.append(toksrc) def get_token (this): tok = None while this.tss and tok == None: tok = this.tss[-1].get_token() if tok == None: this.tss.pop() if tok <> None: return tok else: return Lexer.get_token(this) class Register (tuple, Stackable): def __new__ (cls, *args): return tuple.__new__(cls, args) def parent (this): if len(this): return apply(Register, this[:-1]) else: return None def next (this): l = list(this) l[-1] += 1 return apply(Register, l) def child (this, index = 0): return apply(Register, this + (index,)) def __repr__ (this): return 'Register' + tuple.__repr__(this) def __str__ (this): if Registers.has_key(this): return Registers[this] else: return '%' + '.'.join(map(str, this)) def contained_registers (this): return this, class Class_Marker (object, Stackable): def __init__ (this, id): this.id = id def matchers (object): if isinstance(object, Class_Marker): yield object.id elif isinstance(object, Integer_Literal): yield 'int' yield 'lit' yield 'const' elif isinstance(object, Symbol_Literal): yield 'sym' yield 'lit' yield 'const' elif isinstance(object, Sum): yield 'sum' yield 'const' elif isinstance(object, Register): while object <> None: yield Registers[object] object = object.parent() yield 'any' def match_generator (root): yield root if len(interpreter.regstack) < 1: yield None # want more registers m = matchers(interpreter.regstack[-1]) try: while 1: yield root + ' ' + m.next() except StopIteration: pass if len(interpreter.regstack) < 2: yield None m1 = matchers(interpreter.regstack[-2]) try: while 1: n1 = m1.next() m2 = matchers(interpreter.regstack[-1]) try: while 1: yield root + ' ' + n1 + ' ' + m2.next() except StopIteration: pass except StopIteration: pass Generic_Register = Register() MA_PREFIX = 1 def make_universal_meaning (fn): um = { 'reg': Generic_Register, '...': Unique('...'), 'tetras': ['dup', '+', 'dup', '+'], # FIXME } for m in 'any const int lit sum sym'.split(' '): um[m] = Class_Marker(m) # load builtins bf = open(fn, 'r') builtins = bf.read() bf.close() for b in builtins.split('\n\n'): if b[0] != '#': name, code = b.split('\n', 1) np = (name + '|').split('|') name = np[0] pa = np[1] exec 'def _p (%s):\n%s\n' % (pa, code) flags = 0 if pa: flags |= MA_PREFIX um[name] = 'builtin', _p, flags return um class Interpreter (object): __slots__ = 'sections current recordee regpaths hanging regstack state meaning'.split() universal_meaning = make_universal_meaning('tran-builtins') 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 def outer_state (this, tok): if isinstance(tok, Integer_Literal): this.regstack.append(tok) elif isinstance(tok, str): root = tok mg = match_generator(root) try: while not interpreter.meaning.has_key(tok): tok = mg.next() if tok == None: raise 'stack too empty or meaningless word', root except StopIteration: raise 'meaningless word', root m = interpreter.meaning[tok] if isinstance(m, list): prep.push(Macro_Cursor(m)) elif isinstance(m, Stackable): this.regstack.append(m) elif isinstance(m, tuple): mtype = m[0] if mtype == 'builtin': if m[2] & MA_PREFIX: tok = prep.get_token() if not isinstance(tok, str): raise 'word expected', tok m[1](tok) else: m[1]() else: raise 'Unknown meaning type in', `interpreter.meaning[tok]` else: raise 'Unknown meaning format for', tok else: raise 'bad token', tok Index: Makefile.am =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/Makefile.am,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- Makefile.am 17 May 2003 10:03:50 -0000 1.16 +++ Makefile.am 17 May 2003 11:35:28 -0000 1.17 @@ -8,6 +8,7 @@ EXTRA_DIST = .cvsignore .pycheckrc struburn.wisp bits.py linkie.py \ coff.py elf.py pe.py \ + interpreter.py \ i8086.tran i80386.tran ia16.tran ia32.tran \ winapi.tran \ hello.tran mswhello.tran \ Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.94 retrieving revision 1.95 diff -u -d -r1.94 -r1.95 --- tran.py 17 May 2003 11:27:27 -0000 1.94 +++ tran.py 17 May 2003 11:35:29 -0000 1.95 @@ -22,278 +22,7 @@ def abstract (this, *arg, **narg): raise 'abstract method was called', this -def simplest_summable (scalar, symbols, registers): - if len(symbols) == len(registers) == 0: - return Integer_Literal(scalar) - elif scalar == len(registers) == 0 and len(symbols) == 1: - return symbols[0] - elif len(registers) == 0: - return Sum((Integer_Literal(scalar),) + tuple(symbols)) - else: - return NotImplemented - -class Summable (object): - def get_scalar (this): return 0 - def get_symbols (this): return () - def get_registers (this): return () - def __add__ (this, that): - scalar = this.get_scalar() + that.get_scalar() - symbols = this.get_symbols() + that.get_symbols() - registers = this.get_registers() + that.get_registers() - return simplest_summable(scalar, symbols, registers) - def __sub__ (this, that): - if len(that.get_symbols()) <> 0 or len(that.get_registers()) <> 0: - return NotImplemented - scalar = this.get_scalar() - that.get_scalar() - symbols = this.get_symbols() - registers = this.get_registers() - return simplest_summable(scalar, symbols, registers) - -class Token (object): pass - -class Stackable (object): - def contained_registers (this): - return () - -class Integer_Literal (long, Stackable, Token, Summable): - def __new__ (cls, i): - return long.__new__(cls, i) - def __add__ (this, that): - return Integer_Literal(long(this) + long(that)) - def __sub__ (this, that): - return Integer_Literal(long(this) - long(that)) - def __repr__ (this): - return 'Integer_Literal(%i)' % long(this) - def get_scalar (this): - return long(this) - -class Symbol_Literal (str, Stackable, Summable): - def __new__ (cls, s): - return str.__new__(cls, s) - def __repr__ (this): - return 'Symbol_Literal(%r)' % str(this) - def get_symbols (this): - return this, - -class Sum (tuple, Summable): - def __new__ (cls, addends): - scalar = 0 - me = [] - for a in addends: - if isinstance(a, Integer_Literal): scalar += long(a) - elif isinstance(a, Symbol_Literal): me.append(a) - else: raise 'improper addend', a - return tuple.__new__(cls, [Integer_Literal(scalar)] + me) - def __repr__ (this): - return 'Sum(%s)' % repr(tuple(this)) - def __str__ (this): - return '+'.join(map(str, this)) - -class Unique (object): - def __init__ (this, name): - this.name = name - def __repr__ (this): - return 'Unique(%r)' % this.name - def __str__ (this): - return this.name -class Unique_Token (Unique, Token): pass - -Semicolon = Unique_Token(';') - -class Token_Source (object): - """After creation, a Token_Source instance will deliver one token -each time its get_token method is called, until the token stream ends. -After that, it will return None.""" - get_token = abstract - -class Lexer (shlex, Token_Source): - def __init__ (this, filename): - shlex.__init__(this, instream = open(filename, 'r'), infile = filename) - this.commenters = '\\' - this.quotes = '"' - this.wordchars += '!#$%*+,-./:;<=>?@[]' - def get_token (this): - tok = shlex.get_token(this) - if tok == '': tok = None - elif tok[:2] == '#o': tok = Integer_Literal(string.atol(tok[2:], 8)) - elif tok[:2] == '#x': tok = Integer_Literal(string.atol(tok[2:], 16)) - elif tok[:2] == '#/' and len(tok) == 3: - tok = Integer_Literal(ord(tok[2])) - else: - try: tok = Integer_Literal(string.atol(tok, 10)) - except: pass - if tok == ';': return Semicolon - else: return tok - def push_file (this, filename): - this.push_source(open(filename, 'r'), filename) - -class Macro_Cursor (Token_Source): - def __init__ (this, sequence): - this.sequence = sequence - this.current = 0 - def get_token (this): - if this.current >= len(this.sequence): return None - datum = this.sequence[this.current] - this.current += 1 - return datum - -class Preprocessor (Lexer): - __slots__ = ['tss'] - def __init__ (this, filename): - Lexer.__init__(this, filename) - this.tss = [] - def push (this, toksrc): - this.tss.append(toksrc) - def get_token (this): - tok = None - while this.tss and tok == None: - tok = this.tss[-1].get_token() - if tok == None: this.tss.pop() - if tok <> None: return tok - else: return Lexer.get_token(this) - -class Register (tuple, Stackable): - def __new__ (cls, *args): - return tuple.__new__(cls, args) - def parent (this): - if len(this): return apply(Register, this[:-1]) - else: return None - def next (this): - l = list(this) - l[-1] += 1 - return apply(Register, l) - def child (this, index = 0): - return apply(Register, this + (index,)) - def __repr__ (this): - return 'Register' + tuple.__repr__(this) - def __str__ (this): - if Registers.has_key(this): - return Registers[this] - else: - return '%' + '.'.join(map(str, this)) - def contained_registers (this): - return this, - -class Class_Marker (object, Stackable): - def __init__ (this, id): - this.id = id - -def matchers (object): - if isinstance(object, Class_Marker): - yield object.id - elif isinstance(object, Integer_Literal): - yield 'int' - yield 'lit' - yield 'const' - elif isinstance(object, Symbol_Literal): - yield 'sym' - yield 'lit' - yield 'const' - elif isinstance(object, Sum): - yield 'sum' - yield 'const' - elif isinstance(object, Register): - while object <> None: - yield Registers[object] - object = object.parent() - yield 'any' - -def match_generator (root): - yield root - if len(interpreter.regstack) < 1: yield None # want more registers - m = matchers(interpreter.regstack[-1]) - try: - while 1: - yield root + ' ' + m.next() - except StopIteration: pass - if len(interpreter.regstack) < 2: yield None - m1 = matchers(interpreter.regstack[-2]) - try: - while 1: - n1 = m1.next() - m2 = matchers(interpreter.regstack[-1]) - try: - while 1: yield root + ' ' + n1 + ' ' + m2.next() - except StopIteration: pass - except StopIteration: pass - -Generic_Register = Register() - -MA_PREFIX = 1 - -def make_universal_meaning (fn): - um = { - 'reg': Generic_Register, - '...': Unique('...'), - 'tetras': ['dup', '+', 'dup', '+'], # FIXME - } - for m in 'any const int lit sum sym'.split(' '): um[m] = Class_Marker(m) - - # load builtins - bf = open(fn, 'r') - builtins = bf.read() - bf.close() - - for b in builtins.split('\n\n'): - if b[0] != '#': - name, code = b.split('\n', 1) - np = (name + '|').split('|') - name = np[0] - pa = np[1] - exec 'def _p (%s):\n%s\n' % (pa, code) - flags = 0 - if pa: flags |= MA_PREFIX - um[name] = 'builtin', _p, flags - return um - -class Interpreter (object): - __slots__ = 'sections current recordee regpaths hanging regstack state meaning'.split() - universal_meaning = make_universal_meaning('tran-builtins') - - 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 - def outer_state (this, tok): - if isinstance(tok, Integer_Literal): - this.regstack.append(tok) - elif isinstance(tok, str): - root = tok - mg = match_generator(root) - try: - while not interpreter.meaning.has_key(tok): - tok = mg.next() - if tok == None: - raise 'stack too empty or meaningless word', root - except StopIteration: - raise 'meaningless word', root - m = interpreter.meaning[tok] - if isinstance(m, list): prep.push(Macro_Cursor(m)) - elif isinstance(m, Stackable): this.regstack.append(m) - elif isinstance(m, tuple): - mtype = m[0] - if mtype == 'builtin': - if m[2] & MA_PREFIX: - tok = prep.get_token() - if not isinstance(tok, str): raise 'word expected', tok - m[1](tok) - else: - m[1]() - else: raise 'Unknown meaning type in', `interpreter.meaning[tok]` - else: raise 'Unknown meaning format for', tok - else: raise 'bad token', tok +exec open('interpreter.py') interpreter = Interpreter('<', ['.text', '.data', '.bss']) |
From: <di...@us...> - 2003-05-17 11:27:30
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv1347 Modified Files: tran.py Log Message: extracted make_universal_meaning from Interpreter Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.93 retrieving revision 1.94 diff -u -d -r1.93 -r1.94 --- tran.py 17 May 2003 11:05:35 -0000 1.93 +++ tran.py 17 May 2003 11:27:27 -0000 1.94 @@ -219,38 +219,39 @@ Generic_Register = Register() -class Interpreter (object): - __slots__ = 'sections current recordee regpaths hanging regstack state meaning'.split() +MA_PREFIX = 1 - universal_meaning = { +def make_universal_meaning (fn): + um = { 'reg': Generic_Register, '...': Unique('...'), 'tetras': ['dup', '+', 'dup', '+'], # FIXME } - for m in 'any const int lit sum sym'.split(' '): - universal_meaning[m] = Class_Marker(m) + for m in 'any const int lit sum sym'.split(' '): um[m] = Class_Marker(m) # load builtins - _bf = open('tran-builtins', 'r') - _builtins = _bf.read() - _bf.close() + bf = open(fn, 'r') + builtins = bf.read() + bf.close() - MA_PREFIX = 1 + for b in builtins.split('\n\n'): + if b[0] != '#': + name, code = b.split('\n', 1) + np = (name + '|').split('|') + name = np[0] + pa = np[1] + exec 'def _p (%s):\n%s\n' % (pa, code) + flags = 0 + if pa: flags |= MA_PREFIX + um[name] = 'builtin', _p, flags + return um - for _b in _builtins.split('\n\n'): - if _b[0] != '#': - _name, _code = _b.split('\n', 1) - _np = (_name + '|').split('|') - _name = _np[0] - _pa = _np[1] - exec 'def _p (%s):\n%s\n' % (_pa, _code) - _flags = 0 - if _pa: _flags |= MA_PREFIX - universal_meaning[_name] = 'builtin', _p, _flags +class Interpreter (object): + __slots__ = 'sections current recordee regpaths hanging regstack state meaning'.split() + universal_meaning = make_universal_meaning('tran-builtins') def make_section_switcher (this, name): - def switcher (): - this.current = this.sections[name] + def switcher (): this.current = this.sections[name] return switcher def __init__ (this, byte_order, sections = ['.text']): @@ -284,7 +285,7 @@ elif isinstance(m, tuple): mtype = m[0] if mtype == 'builtin': - if m[2] & Interpreter.MA_PREFIX: + if m[2] & MA_PREFIX: tok = prep.get_token() if not isinstance(tok, str): raise 'word expected', tok m[1](tok) |
From: <di...@us...> - 2003-05-17 11:11:33
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv21916 Modified Files: elf.py Log Message: fixed symbol values in ELF32 files Index: elf.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/elf.py,v retrieving revision 1.57 retrieving revision 1.58 diff -u -d -r1.57 -r1.58 --- elf.py 17 May 2003 10:16:53 -0000 1.57 +++ elf.py 17 May 2003 11:11:30 -0000 1.58 @@ -605,7 +605,7 @@ symtab = sections['.symtab'] for symbol, value in section.get_symbols(): if symbol[0] == '&': # only process memory references - symtab.emit_entry(symbol, value, shentnames.index(name) + 1) + symtab.emit_entry(symbol, None, shentnames.index(name) + 1) memory_boundary += section.memsz() memory_boundary = (memory_boundary + 0xFFF) & ~0xFFF @@ -618,8 +618,3 @@ binary.place_symbol('#elf/shstrndx', shentnames.index('.shstrtab') + 1) binary.link() return binary - -# Thoughts of generating ELF32 files -# * In ELF parlance, linker notes are called relocations. -# We need to solve relocations only when generating an -# executable file. |
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': |
From: <di...@us...> - 2003-05-17 10:54:49
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv9695 Modified Files: tran-builtins tran.py Log Message: replaced Meaning by interpreter.meaning Index: tran-builtins =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- tran-builtins 17 May 2003 10:43:54 -0000 1.19 +++ tran-builtins 17 May 2003 10:54:46 -0000 1.20 @@ -77,8 +77,8 @@ raise 'too long argument pattern', interpreter.regstack name = ' '.join([name] + [matchers(i).next() for i in interpreter.regstack]) interpreter.regstack = [] - if Meaning.has_key(name): raise 'duplicate declaration', name - interpreter.recordee = Meaning[name] = [] + if interpreter.meaning.has_key(name): raise 'duplicate declaration', name + interpreter.recordee = interpreter.meaning[name] = [] def record_state (tok): if tok == Semicolon: interpreter.state = interpreter.outer_state @@ -89,8 +89,8 @@ :regs|family def regs_state0 (family): - if Meaning.has_key(family): - f = Meaning[family] + if interpreter.meaning.has_key(family): + f = interpreter.meaning[family] if not isinstance(f, Register): raise 'unable to declare subregisters for', f if not interpreter.hanging.has_key(f): @@ -103,7 +103,7 @@ f = interpreter.regpaths[-1] interpreter.regpaths[-1] = f.next() interpreter.regpaths.append(f.child()) - Meaning[family] = f + interpreter.meaning[family] = f Registers[f] = family interpreter.state = regs_state def regs_state (tok): @@ -115,15 +115,15 @@ r = interpreter.regpaths[-1] if interpreter.hanging.has_key(r.parent()): raise 'misplaced ellipsis' - elif Meaning.has_key(tok): - if Meaning[tok] == Meaning[':regs']: + elif interpreter.meaning.has_key(tok): + if interpreter.meaning[tok] == interpreter.meaning[':regs']: interpreter.state = regs_state0 - elif Meaning[tok] == Meaning['...']: + elif interpreter.meaning[tok] == interpreter.meaning['...']: interpreter.hanging[r.parent()] = r[-1] else: raise 'duplicate declaration', tok else: interpreter.regpaths[-1] = r.next() - Meaning[tok] = r + interpreter.meaning[tok] = r Registers[r] = tok regs_state0(family) Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.91 retrieving revision 1.92 diff -u -d -r1.91 -r1.92 --- tran.py 17 May 2003 10:43:54 -0000 1.91 +++ tran.py 17 May 2003 10:54:46 -0000 1.92 @@ -219,33 +219,35 @@ Generic_Register = Register() -MA_PREFIX = 1 -Meaning = {'reg': Generic_Register, - '...': Unique('...'), - 'tetras': ['dup', '+', 'dup', '+'], # FIXME -} -for m in 'any const int lit sum sym'.split(' '): - Meaning[m] = Class_Marker(m) +class Interpreter (object): + __slots__ = 'text data bss current recordee regpaths hanging regstack state meaning'.split() -bf = open('tran-builtins', 'r') -builtins = bf.read() -bf.close() + universal_meaning = { + 'reg': Generic_Register, + '...': Unique('...'), + 'tetras': ['dup', '+', 'dup', '+'], # FIXME + } + for m in 'any const int lit sum sym'.split(' '): + universal_meaning[m] = Class_Marker(m) -for b in builtins.split('\n\n'): - if b[0] != '#': - name, code = b.split('\n', 1) - np = (name + '|').split('|') - name = np[0] - pa = np[1] - exec 'def _p (%s):\n%s\n' % (pa, code) - flags = 0 - if pa: flags |= MA_PREFIX - Meaning[name] = 'builtin', _p, flags + # load builtins + _bf = open('tran-builtins', 'r') + _builtins = _bf.read() + _bf.close() -Registers = {Generic_Register: 'reg'} # for reverse translation + MA_PREFIX = 1 + + for _b in _builtins.split('\n\n'): + if _b[0] != '#': + _name, _code = _b.split('\n', 1) + _np = (_name + '|').split('|') + _name = _np[0] + _pa = _np[1] + exec 'def _p (%s):\n%s\n' % (_pa, _code) + _flags = 0 + if _pa: _flags |= MA_PREFIX + universal_meaning[_name] = 'builtin', _p, _flags -class Interpreter (object): - __slots__ = 'text data bss current recordee regpaths hanging regstack state'.split() def __init__ (this, byte_order): this.text = Linkie('<') this.data = Linkie('<') @@ -256,6 +258,7 @@ 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) @@ -263,30 +266,32 @@ root = tok mg = match_generator(root) try: - while not Meaning.has_key(tok): + while not interpreter.meaning.has_key(tok): tok = mg.next() if tok == None: raise 'stack too empty or meaningless word', root except StopIteration: raise 'meaningless word', root - m = Meaning[tok] + m = interpreter.meaning[tok] if isinstance(m, list): prep.push(Macro_Cursor(m)) elif isinstance(m, Stackable): this.regstack.append(m) elif isinstance(m, tuple): mtype = m[0] if mtype == 'builtin': - if m[2] & MA_PREFIX: + if m[2] & Interpreter.MA_PREFIX: tok = prep.get_token() if not isinstance(tok, str): raise 'word expected', tok m[1](tok) else: m[1]() - else: raise 'Unknown meaning type in', `Meaning[tok]` + else: raise 'Unknown meaning type in', `interpreter.meaning[tok]` else: raise 'Unknown meaning format for', tok else: raise 'bad token', tok interpreter = Interpreter('<') +Registers = {Generic_Register: 'reg'} # for reverse translation + default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'} verbose = 0 format = 'elf' @@ -307,7 +312,7 @@ if output_name == None: output_name = default_output_names[format] if list_words: wd = {} - for w in Meaning.keys(): + for w in interpreter.meaning.keys(): s = w.find(' ') if s != -1: w = w[:s] wd[w] = 1 |
From: <di...@us...> - 2003-05-17 10:43:59
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv1440 Modified Files: tran-builtins tran.py Log Message: converted outer_state into a method of the Interpreter class Index: tran-builtins =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- tran-builtins 17 May 2003 10:29:40 -0000 1.18 +++ tran-builtins 17 May 2003 10:43:54 -0000 1.19 @@ -81,7 +81,7 @@ interpreter.recordee = Meaning[name] = [] def record_state (tok): if tok == Semicolon: - interpreter.state = outer_state + interpreter.state = interpreter.outer_state interpreter.recordee = None else: interpreter.recordee.append(tok) @@ -110,7 +110,7 @@ if tok == Semicolon: interpreter.regpaths.pop() if len(interpreter.regpaths) == 1: - interpreter.state = outer_state + interpreter.state = interpreter.outer_state else: r = interpreter.regpaths[-1] if interpreter.hanging.has_key(r.parent()): Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.90 retrieving revision 1.91 diff -u -d -r1.90 -r1.91 --- tran.py 17 May 2003 10:38:09 -0000 1.90 +++ tran.py 17 May 2003 10:43:54 -0000 1.91 @@ -217,35 +217,6 @@ except StopIteration: pass except StopIteration: pass -def outer_state (tok): - if isinstance(tok, Integer_Literal): - interpreter.regstack.append(tok) - elif isinstance(tok, str): - root = tok - mg = match_generator(root) - try: - while not Meaning.has_key(tok): - tok = mg.next() - if tok == None: - raise 'stack too empty or meaningless word', root - except StopIteration: - raise 'meaningless word', root - m = Meaning[tok] - if isinstance(m, list): prep.push(Macro_Cursor(m)) - elif isinstance(m, Stackable): interpreter.regstack.append(m) - elif isinstance(m, tuple): - mtype = m[0] - if mtype == 'builtin': - if m[2] & MA_PREFIX: - tok = prep.get_token() - if not isinstance(tok, str): raise 'word expected', tok - m[1](tok) - else: - m[1]() - else: raise 'Unknown meaning type in', `Meaning[tok]` - else: raise 'Unknown meaning format for', tok - else: raise 'bad token', tok - Generic_Register = Register() MA_PREFIX = 1 @@ -284,7 +255,35 @@ this.regpaths = [Register(0)] # for generating new registers this.hanging = {} this.regstack = [] - this.state = outer_state + this.state = this.outer_state + def outer_state (this, tok): + if isinstance(tok, Integer_Literal): + this.regstack.append(tok) + elif isinstance(tok, str): + root = tok + mg = match_generator(root) + try: + while not Meaning.has_key(tok): + tok = mg.next() + if tok == None: + raise 'stack too empty or meaningless word', root + except StopIteration: + raise 'meaningless word', root + m = Meaning[tok] + if isinstance(m, list): prep.push(Macro_Cursor(m)) + elif isinstance(m, Stackable): this.regstack.append(m) + elif isinstance(m, tuple): + mtype = m[0] + if mtype == 'builtin': + if m[2] & MA_PREFIX: + tok = prep.get_token() + if not isinstance(tok, str): raise 'word expected', tok + m[1](tok) + else: + m[1]() + else: raise 'Unknown meaning type in', `Meaning[tok]` + else: raise 'Unknown meaning format for', tok + else: raise 'bad token', tok interpreter = Interpreter('<') |
From: <di...@us...> - 2003-05-17 10:38:17
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv28954 Modified Files: tran.py Log Message: introduced the Interpreter class Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.89 retrieving revision 1.90 diff -u -d -r1.89 -r1.90 --- tran.py 17 May 2003 10:29:41 -0000 1.89 +++ tran.py 17 May 2003 10:38:09 -0000 1.90 @@ -273,18 +273,20 @@ Registers = {Generic_Register: 'reg'} # for reverse translation -class container (object): pass +class Interpreter (object): + __slots__ = 'text data bss current recordee regpaths hanging regstack state'.split() + def __init__ (this, byte_order): + this.text = Linkie('<') + this.data = Linkie('<') + this.bss = Linkie('<') + this.current = this.text + this.recordee = None + this.regpaths = [Register(0)] # for generating new registers + this.hanging = {} + this.regstack = [] + this.state = outer_state -interpreter = container() -interpreter.state = outer_state -interpreter.text = Linkie('<') -interpreter.data = Linkie('<') -interpreter.bss = Linkie('<') -interpreter.current = interpreter.text -interpreter.recordee = None -interpreter.regpaths = [Register(0)] # for generating new registers -interpreter.hanging = {} -interpreter.regstack = [] +interpreter = Interpreter('<') default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'} verbose = 0 |
From: <di...@us...> - 2003-05-17 10:29:45
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv22927 Modified Files: tran-builtins tran.py Log Message: renamed Regstack to interpreter.regstack Index: tran-builtins =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- tran-builtins 17 May 2003 09:51:15 -0000 1.17 +++ tran-builtins 17 May 2003 10:29:40 -0000 1.18 @@ -7,38 +7,38 @@ #### @(#) $Id$ $-t, sum - s = Regstack.pop() + s = interpreter.regstack.pop() scalar = long(s[0]) symbols = map(str, s[1:]) interpreter.current.emit_tetra_sum(symbols, delta = scalar % 0x100000000L, relative = 1) $-t, sym - interpreter.current.emit_tetra_sum([str(Regstack.pop())], relative = 1) + interpreter.current.emit_tetra_sum([str(interpreter.regstack.pop())], relative = 1) $-w, sum - s = Regstack.pop() + s = interpreter.regstack.pop() scalar = long(s[0]) symbols = map(str, s[1:]) interpreter.current.emit_wyde_sum(symbols, delta = scalar % 0x10000L, relative = 1) $-w, sym - interpreter.current.emit_wyde_sum([str(Regstack.pop())], relative = 1) + interpreter.current.emit_wyde_sum([str(interpreter.regstack.pop())], relative = 1) + int int - n = Regstack.pop(); m = Regstack.pop() - Regstack.append(m + n) + n = interpreter.regstack.pop(); m = interpreter.regstack.pop() + interpreter.regstack.append(m + n) - int int - n = Regstack.pop(); m = Regstack.pop() - Regstack.append(m - n) + n = interpreter.regstack.pop(); m = interpreter.regstack.pop() + interpreter.regstack.append(m - n) - sum int - n = Regstack.pop(); m = Regstack.pop() - Regstack.append(m - n) + n = interpreter.regstack.pop(); m = interpreter.regstack.pop() + interpreter.regstack.append(m - n) - sym int - n = Regstack.pop(); m = Regstack.pop() - Regstack.append(m - n) + n = interpreter.regstack.pop(); m = interpreter.regstack.pop() + interpreter.regstack.append(m - n) .bss interpreter.current = interpreter.bss @@ -50,31 +50,33 @@ interpreter.current = interpreter.text // - Regstack = [] + interpreter.regstack = [] 3rev - if len(Regstack) < 3: raise 'unstacking is not implemented yet' - r = Regstack[-3:]; r.reverse() - Regstack = Regstack[:-3] + r + if len(interpreter.regstack) < 3: raise 'unstacking is not implemented yet' + r = interpreter.regstack[-3:]; r.reverse() + interpreter.regstack = interpreter.regstack[:-3] + r 4rev - if len(Regstack) < 4: raise 'unstacking is not implemented yet' - r = Regstack[-4:]; r.reverse() - Regstack = Regstack[:-4] + r + if len(interpreter.regstack) < 4: raise 'unstacking is not implemented yet' + r = interpreter.regstack[-4:]; r.reverse() + interpreter.regstack = interpreter.regstack[:-4] + r 5rev - if len(Regstack) < 5: raise 'unstacking is not implemented yet' - r = Regstack[-5:]; r.reverse() - Regstack = Regstack[:-5] + r + if len(interpreter.regstack) < 5: raise 'unstacking is not implemented yet' + r = interpreter.regstack[-5:]; r.reverse() + interpreter.regstack = interpreter.regstack[:-5] + r :[ # intended to be used before the macro's pattern - if Regstack: raise 'stack not empty for :[', Regstack + if interpreter.regstack: + raise 'stack not empty for :[', interpreter.regstack ]|name - if len(Regstack) > 2: raise 'too long argument pattern', Regstack - name = ' '.join([name] + [matchers(i).next() for i in Regstack]) - Regstack = [] + if len(interpreter.regstack) > 2: + raise 'too long argument pattern', interpreter.regstack + name = ' '.join([name] + [matchers(i).next() for i in interpreter.regstack]) + interpreter.regstack = [] if Meaning.has_key(name): raise 'duplicate declaration', name interpreter.recordee = Meaning[name] = [] def record_state (tok): @@ -126,53 +128,53 @@ regs_state0(family) align int - interpreter.current.align(long(Regstack.pop())) + interpreter.current.align(long(interpreter.regstack.pop())) b, int - interpreter.current[::1] = long(Regstack.pop()) + interpreter.current[::1] = long(interpreter.regstack.pop()) b, sym - interpreter.current[::1] = str(Regstack.pop()) + interpreter.current[::1] = str(interpreter.regstack.pop()) commit - Regstack.reverse() - prep.push(Macro_Cursor(['$push'] * len(Regstack))) + interpreter.regstack.reverse() + prep.push(Macro_Cursor(['$push'] * len(interpreter.regstack))) drop any - Regstack.pop() + interpreter.regstack.pop() dup any - Regstack.append(Regstack[-1]) + interpreter.regstack.append(interpreter.regstack[-1]) label|name interpreter.current.place_symbol('&' + name) minor reg - Regstack.append(Integer_Literal(Regstack.pop()[-1])) + interpreter.regstack.append(Integer_Literal(interpreter.regstack.pop()[-1])) include|name prep.push_file(str(name) + '.tran') ref|name - Regstack.append(Symbol_Literal('&' + name)) + interpreter.regstack.append(Symbol_Literal('&' + name)) reserve int - interpreter.current.skip(Regstack.pop()) + interpreter.current.skip(interpreter.regstack.pop()) swap any any - y = Regstack.pop(); x = Regstack.pop() - Regstack.append(y); Regstack.append(x) + y = interpreter.regstack.pop(); x = interpreter.regstack.pop() + interpreter.regstack.append(y); interpreter.regstack.append(x) t, int - interpreter.current[::4] = long(Regstack.pop()) + interpreter.current[::4] = long(interpreter.regstack.pop()) t, sym - interpreter.current[::4] = str(Regstack.pop()) + interpreter.current[::4] = str(interpreter.regstack.pop()) w, int - interpreter.current[::2] = long(Regstack.pop()) + interpreter.current[::2] = long(interpreter.regstack.pop()) w, sym - interpreter.current[::2] = str(Regstack.pop()) + interpreter.current[::2] = str(interpreter.regstack.pop()) # vim: ft=python Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.88 retrieving revision 1.89 diff -u -d -r1.88 -r1.89 --- tran.py 17 May 2003 10:16:53 -0000 1.88 +++ tran.py 17 May 2003 10:29:41 -0000 1.89 @@ -200,27 +200,26 @@ def match_generator (root): yield root - if len(Regstack) < 1: yield None # want more registers - m = matchers(Regstack[-1]) + if len(interpreter.regstack) < 1: yield None # want more registers + m = matchers(interpreter.regstack[-1]) try: while 1: yield root + ' ' + m.next() except StopIteration: pass - if len(Regstack) < 2: yield None - m1 = matchers(Regstack[-2]) + if len(interpreter.regstack) < 2: yield None + m1 = matchers(interpreter.regstack[-2]) try: while 1: n1 = m1.next() - m2 = matchers(Regstack[-1]) + m2 = matchers(interpreter.regstack[-1]) try: while 1: yield root + ' ' + n1 + ' ' + m2.next() except StopIteration: pass except StopIteration: pass def outer_state (tok): - global Regstack if isinstance(tok, Integer_Literal): - Regstack.append(tok) + interpreter.regstack.append(tok) elif isinstance(tok, str): root = tok mg = match_generator(root) @@ -233,7 +232,7 @@ raise 'meaningless word', root m = Meaning[tok] if isinstance(m, list): prep.push(Macro_Cursor(m)) - elif isinstance(m, Stackable): Regstack.append(m) + elif isinstance(m, Stackable): interpreter.regstack.append(m) elif isinstance(m, tuple): mtype = m[0] if mtype == 'builtin': @@ -247,7 +246,6 @@ else: raise 'Unknown meaning format for', tok else: raise 'bad token', tok -Regstack = [] Generic_Register = Register() MA_PREFIX = 1 @@ -268,7 +266,7 @@ np = (name + '|').split('|') name = np[0] pa = np[1] - exec 'def _p (%s):\n global Regstack\n%s\n' % (pa, code) + exec 'def _p (%s):\n%s\n' % (pa, code) flags = 0 if pa: flags |= MA_PREFIX Meaning[name] = 'builtin', _p, flags @@ -286,6 +284,7 @@ interpreter.recordee = None interpreter.regpaths = [Register(0)] # for generating new registers interpreter.hanging = {} +interpreter.regstack = [] default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'} verbose = 0 @@ -320,14 +319,14 @@ prep = Preprocessor(args[0]) tok = prep.get_token() while tok <> None: - if verbose: print '(%s) %s' % (' '.join(map(str, Regstack)), tok) + 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') - if Regstack: - raise 'Regstack not empty after parsing ended', Regstack + if interpreter.regstack: + raise 'Regstack not empty after parsing ended', interpreter.regstack argum = { 'text': interpreter.text, 'data': interpreter.data, |
From: <di...@us...> - 2003-05-17 10:17:05
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv11686 Modified Files: elf.py pe.py tran.py Log Message: implemented the --base option Index: elf.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/elf.py,v retrieving revision 1.56 retrieving revision 1.57 diff -u -d -r1.56 -r1.57 --- elf.py 16 May 2003 13:37:20 -0000 1.56 +++ elf.py 17 May 2003 10:16:53 -0000 1.57 @@ -490,7 +490,7 @@ return p_flags def make_ELF32_object (text = None, data = None, bss = None, flags = '', - memory_bottom = 0x08048000): + base_address = 0x08048000): # Will NOT set given sections' origins. want_symbols = 's' in flags want_relocatable = 'r' in flags @@ -502,7 +502,7 @@ if bss <> None: sections['.bss'] = bss binary = Linkie('<') - memory_boundary = memory_bottom # must be at page boundary + memory_boundary = base_address # must be at page boundary binary.glue(0, make_ELF32_header('<', reloc = want_relocatable), None) if want_relocatable: binary.place_symbol('#elf/type', ET.REL) Index: pe.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/pe.py,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- pe.py 16 May 2003 17:14:29 -0000 1.6 +++ pe.py 17 May 2003 10:16:53 -0000 1.7 @@ -298,8 +298,8 @@ e.place_symbol('#aout/text-size', roundup(text.memsz(), 0x200)) e.place_symbol('#aout/data-size', roundup(data.memsz(), 0x200)) e.place_symbol('#aout/bss-size', roundup(bss.memsz(), 0x200)) - e.place_symbol('#aout/image-base', 0x00400000) - e.place_symbol('#rva', -0x00400000) # adding this to an address will yield RVA + e.place_symbol('#aout/image-base', base_address) + e.place_symbol('#rva', -base_address) # adding this to an address will yield RVA e.place_symbol('#aout/memory-align', 4096) e.place_symbol('#aout/file-align', 512) # 4.0 = MSW95 Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.87 retrieving revision 1.88 diff -u -d -r1.87 -r1.88 --- tran.py 17 May 2003 09:25:33 -0000 1.87 +++ tran.py 17 May 2003 10:16:53 -0000 1.88 @@ -293,12 +293,15 @@ def main (): global prep, verbose, format - opts, args = getopt(sys.argv[1:], 'vo:f:', ['verbose', 'output=', 'format=', 'list-words']) + opts, args = getopt(sys.argv[1:], 'vo:b:f:', + ['verbose', 'output=', 'base=', 'format=', 'list-words']) output_name = None list_words = 0 + base = None for opt, arg in opts: - if opt in ('-o', '--output'): output_name = arg if opt in ('-v', '--verbose'): verbose = 1 + if opt in ('-o', '--output'): output_name = arg + if opt in ('-b', '--base'): base = string.atol(arg, 16) if opt in ('-f', '--format'): format = arg if opt == '--list-words': list_words = 1 if output_name == None: output_name = default_output_names[format] @@ -325,15 +328,17 @@ interpreter.bss.dump(title = 'BSS') if Regstack: raise 'Regstack not empty after parsing ended', Regstack + argum = { + 'text': interpreter.text, + 'data': interpreter.data, + 'bss': interpreter.bss, + } + if base <> None: argum['base_address'] = base if format == 'elf': - binary = elf.make_ELF32_object(text = interpreter.text, - data = interpreter.data, - bss = interpreter.bss, - flags = 's') + argum['flags'] = 's' + binary = apply(elf.make_ELF32_object, [], argum) elif format == 'pe': - binary = pe.make_pe_executable(text = interpreter.text, - data = interpreter.data, - bss = interpreter.bss) + binary = apply(pe.make_pe_executable, [], argum) f = open(output_name, 'w') binary.get_file().tofile(f) f.close() |
From: <di...@us...> - 2003-05-17 10:03:54
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv5296 Modified Files: Makefile.am ia32.tran Added Files: ia16.tran Log Message: created ia16.tran --- NEW FILE: ia16.tran --- \\\\ ia16.tran - 16-bit Intel architecture \ \ Copyleft © 2003 by Andres Soolo (di...@us...) \ This file is licensed under the GNU GPL v2. If you \ don't know what that means, please do read the GPL. \ \\\\ @(#) $Id: ia16.tran,v 1.1 2003/05/17 10:03:51 digg Exp $ \ Note that ia16 is not generally supported. \ This file is presented merely for completeness' sake. :[ ] $o16 ; :[ ] $o32 #x66 b, ; :[ ] $a16 ; :[ ] $a32 #x67 b, ; \ Note that $osize don't remove the matched register from the stack. :[ reg16 ] $osize ; \ or $o16 :[ reg32 ] $osize #x66 b, ; \ or $o32 \ Processor Word for ia16 is wyde :[ ] pw, w, ; :[ ] pw-size 2 ; :[ ] $-pw, $-w, ; \ vim: ft=tran Index: Makefile.am =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/Makefile.am,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- Makefile.am 17 May 2003 05:37:51 -0000 1.15 +++ Makefile.am 17 May 2003 10:03:50 -0000 1.16 @@ -8,7 +8,9 @@ EXTRA_DIST = .cvsignore .pycheckrc struburn.wisp bits.py linkie.py \ coff.py elf.py pe.py \ - i8086.tran i80386.tran ia32.tran hello.tran winapi.tran mswhello.tran \ + i8086.tran i80386.tran ia16.tran ia32.tran \ + winapi.tran \ + hello.tran mswhello.tran \ makehello.py elfdump.py all: Index: ia32.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- ia32.tran 17 May 2003 09:55:40 -0000 1.16 +++ ia32.tran 17 May 2003 10:03:51 -0000 1.17 @@ -6,15 +6,14 @@ \ \\\\ @(#) $Id$ -\ These are prefixes for 32-bit mode :[ ] $o16 #x66 b, ; :[ ] $o32 ; :[ ] $a16 #x67 b, ; :[ ] $a32 ; \ Note that $osize don't remove the matched register from the stack. -:[ reg32 ] $osize ; \ or $o32 :[ reg16 ] $osize #x66 b, ; \ or $o16 +:[ reg32 ] $osize ; \ or $o32 \ Processor Word for ia32 is tetra :[ ] pw, t, ; |
From: <di...@us...> - 2003-05-17 09:55:43
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv2790 Modified Files: i8086.tran ia32.tran Log Message: introduced the |$-pw,| word Index: i8086.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i8086.tran,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- i8086.tran 17 May 2003 09:47:27 -0000 1.6 +++ i8086.tran 17 May 2003 09:55:40 -0000 1.7 @@ -28,4 +28,6 @@ :[ reg16/32 ] $push $osize minor #o120 + b, ; :[ lit ] $push #x68 b, pw, ; +:[ lit ] $call #xe8 b, pw-size - $-pw, ; + \ vim: ft=tran Index: ia32.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- ia32.tran 17 May 2003 09:48:57 -0000 1.15 +++ ia32.tran 17 May 2003 09:55:40 -0000 1.16 @@ -16,11 +16,9 @@ :[ reg32 ] $osize ; \ or $o32 :[ reg16 ] $osize #x66 b, ; \ or $o16 -:[ ] pw, t, ; \ Processor Word for ia32 is tetra +\ Processor Word for ia32 is tetra +:[ ] pw, t, ; :[ ] pw-size 4 ; - -\ These instructions are not completely operand width portable: - -:[ lit ] $call #xe8 b, pw-size - $-t, ; +:[ ] $-pw, $-t, ; \ vim: ft=tran |
From: <di...@us...> - 2003-05-17 09:51:18
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv1272 Modified Files: tran-builtins Log Message: implemented the |$-w,| builtin Index: tran-builtins =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- tran-builtins 17 May 2003 09:25:33 -0000 1.16 +++ tran-builtins 17 May 2003 09:51:15 -0000 1.17 @@ -15,6 +15,15 @@ $-t, sym interpreter.current.emit_tetra_sum([str(Regstack.pop())], relative = 1) +$-w, sum + s = Regstack.pop() + scalar = long(s[0]) + symbols = map(str, s[1:]) + interpreter.current.emit_wyde_sum(symbols, delta = scalar % 0x10000L, relative = 1) + +$-w, sym + interpreter.current.emit_wyde_sum([str(Regstack.pop())], relative = 1) + + int int n = Regstack.pop(); m = Regstack.pop() Regstack.append(m + n) |
From: <di...@us...> - 2003-05-17 09:49:00
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv554 Modified Files: ia32.tran Log Message: introduced the |pw-size| word Index: ia32.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- ia32.tran 17 May 2003 09:47:28 -0000 1.14 +++ ia32.tran 17 May 2003 09:48:57 -0000 1.15 @@ -17,9 +17,10 @@ :[ reg16 ] $osize #x66 b, ; \ or $o16 :[ ] pw, t, ; \ Processor Word for ia32 is tetra +:[ ] pw-size 4 ; \ These instructions are not completely operand width portable: -:[ lit ] $call #xe8 b, 4 - $-t, ; +:[ lit ] $call #xe8 b, pw-size - $-t, ; \ vim: ft=tran |
From: <di...@us...> - 2003-05-17 09:47:31
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv32552 Modified Files: i8086.tran ia32.tran Log Message: introduced the |pw,| word Index: i8086.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i8086.tran,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- i8086.tran 17 May 2003 09:36:39 -0000 1.5 +++ i8086.tran 17 May 2003 09:47:27 -0000 1.6 @@ -26,5 +26,6 @@ :[ reg32 lit ] $mov $o32 swap minor #o270 + b, t, ; :[ reg16/32 ] $push $osize minor #o120 + b, ; +:[ lit ] $push #x68 b, pw, ; \ vim: ft=tran Index: ia32.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- ia32.tran 17 May 2003 09:36:39 -0000 1.13 +++ ia32.tran 17 May 2003 09:47:28 -0000 1.14 @@ -16,9 +16,10 @@ :[ reg32 ] $osize ; \ or $o32 :[ reg16 ] $osize #x66 b, ; \ or $o16 +:[ ] pw, t, ; \ Processor Word for ia32 is tetra + \ These instructions are not completely operand width portable: -:[ lit ] $push #x68 b, t, ; :[ lit ] $call #xe8 b, 4 - $-t, ; \ vim: ft=tran |
From: <di...@us...> - 2003-05-17 09:41:25
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv30748 Modified Files: hello.tran Log Message: syntax highlighting Index: hello.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/hello.tran,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- hello.tran 17 May 2003 05:37:51 -0000 1.3 +++ hello.tran 17 May 2003 09:41:22 -0000 1.4 @@ -27,4 +27,4 @@ label message #/H b, #/E b, #/L b, #/L b, #/O b, 10 b, -\ vim: ft=forth +\ vim: ft=tran |
From: <di...@us...> - 2003-05-17 09:36:43
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv29087 Modified Files: i8086.tran ia32.tran Log Message: replaced |$push reg32| by |$push reg16/32| Index: i8086.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i8086.tran,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- i8086.tran 17 May 2003 09:33:36 -0000 1.4 +++ i8086.tran 17 May 2003 09:36:39 -0000 1.5 @@ -25,4 +25,6 @@ :[ reg16 lit ] $mov $o16 swap minor #o270 + b, w, ; :[ reg32 lit ] $mov $o32 swap minor #o270 + b, t, ; +:[ reg16/32 ] $push $osize minor #o120 + b, ; + \ vim: ft=tran Index: ia32.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- ia32.tran 17 May 2003 09:33:36 -0000 1.12 +++ ia32.tran 17 May 2003 09:36:39 -0000 1.13 @@ -12,12 +12,9 @@ :[ ] $a16 #x67 b, ; :[ ] $a32 ; +\ Note that $osize don't remove the matched register from the stack. :[ reg32 ] $osize ; \ or $o32 :[ reg16 ] $osize #x66 b, ; \ or $o16 - -\ instructions - -:[ reg32 ] $push minor #o120 + b, ; \ These instructions are not completely operand width portable: |
From: <di...@us...> - 2003-05-17 09:33:39
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv28178 Modified Files: ia32.tran i8086.tran Log Message: moved |$mov reg32 lit| to i8086.tran and wrote |$mov reg16 lit| Index: ia32.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- ia32.tran 17 May 2003 05:37:51 -0000 1.11 +++ ia32.tran 17 May 2003 09:33:36 -0000 1.12 @@ -17,7 +17,6 @@ \ instructions -:[ reg32 lit ] $mov $o32 swap minor #o270 + b, t, ; :[ reg32 ] $push minor #o120 + b, ; \ These instructions are not completely operand width portable: Index: i8086.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i8086.tran,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- i8086.tran 17 May 2003 09:28:34 -0000 1.3 +++ i8086.tran 17 May 2003 09:33:36 -0000 1.4 @@ -15,10 +15,14 @@ :regs reg16/32 \ for extensibility to i80386 :regs reg16 %ax %cx %dx %bx %sp %bp %si %di ; - ... \ and leave it hanging + :regs reg32 ... ; + ... ; \ instructions :[ lit ] $int #xCD b, b, ; + +:[ reg16 lit ] $mov $o16 swap minor #o270 + b, w, ; +:[ reg32 lit ] $mov $o32 swap minor #o270 + b, t, ; \ vim: ft=tran |
From: <di...@us...> - 2003-05-17 09:28:37
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv26624 Modified Files: i8086.tran i80386.tran Log Message: implemented the reg16/reg32 register group Index: i8086.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i8086.tran,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- i8086.tran 17 May 2003 05:17:42 -0000 1.2 +++ i8086.tran 17 May 2003 09:28:34 -0000 1.3 @@ -11,8 +11,12 @@ \ or ia32, too in the future to specify the mode. \ registers -:regs reg16 %ax %cx %dx %bx %sp %bp %si %di ; :regs reg8 %al %cl %dl %bl %ah %ch %dh %bh ; + +:regs reg16/32 \ for extensibility to i80386 + :regs reg16 %ax %cx %dx %bx %sp %bp %si %di ; + ... \ and leave it hanging +; \ instructions :[ lit ] $int #xCD b, b, ; Index: i80386.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i80386.tran,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- i80386.tran 17 May 2003 05:52:49 -0000 1.2 +++ i80386.tran 17 May 2003 09:28:34 -0000 1.3 @@ -9,6 +9,8 @@ include i8086 \ registers -:regs reg32 %eax %ecx %edx %ebx %esp %ebp %esi %edi ; +:regs reg16/32 + :regs reg32 %eax %ecx %edx %ebx %esp %ebp %esi %edi ; +; \ vim: ft=tran |
From: <di...@us...> - 2003-05-17 09:25:36
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv25886 Modified Files: tran-builtins tran.py Log Message: implemented register group hanging Index: tran-builtins =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- tran-builtins 17 May 2003 08:46:24 -0000 1.15 +++ tran-builtins 17 May 2003 09:25:33 -0000 1.16 @@ -78,26 +78,42 @@ :regs|family def regs_state0 (family): - if Meaning.has_key(family): raise 'duplicate declaration', family - f = interpreter.regpath - Meaning[family] = f - Registers[f] = family - interpreter.regpath = interpreter.regpath.child() + if Meaning.has_key(family): + f = Meaning[family] + if not isinstance(f, Register): + raise 'unable to declare subregisters for', f + if not interpreter.hanging.has_key(f): + raise 'unable to re-enter non-hanging register group', f + if interpreter.regpaths[-1].parent() <> f.parent(): + raise 'unable to enter miscontexted register group', f + interpreter.regpaths.append(f.child(interpreter.hanging[f])) + del interpreter.hanging[f] + else: + f = interpreter.regpaths[-1] + interpreter.regpaths[-1] = f.next() + interpreter.regpaths.append(f.child()) + Meaning[family] = f + Registers[f] = family interpreter.state = regs_state def regs_state (tok): if tok == Semicolon: - interpreter.regpath = interpreter.regpath.parent().next() - if len(interpreter.regpath) == 1: + interpreter.regpaths.pop() + if len(interpreter.regpaths) == 1: interpreter.state = outer_state - elif Meaning.has_key(tok): - if Meaning[tok] == Meaning[':regs']: - interpreter.state = regs_state0 - else: raise 'duplicate declaration', tok else: - r = interpreter.regpath - Meaning[tok] = r - Registers[r] = tok - interpreter.regpath = interpreter.regpath.next() + r = interpreter.regpaths[-1] + if interpreter.hanging.has_key(r.parent()): + raise 'misplaced ellipsis' + elif Meaning.has_key(tok): + if Meaning[tok] == Meaning[':regs']: + interpreter.state = regs_state0 + elif Meaning[tok] == Meaning['...']: + interpreter.hanging[r.parent()] = r[-1] + else: raise 'duplicate declaration', tok + else: + interpreter.regpaths[-1] = r.next() + Meaning[tok] = r + Registers[r] = tok regs_state0(family) align int Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.86 retrieving revision 1.87 diff -u -d -r1.86 -r1.87 --- tran.py 17 May 2003 08:46:24 -0000 1.86 +++ tran.py 17 May 2003 09:25:33 -0000 1.87 @@ -284,7 +284,7 @@ interpreter.bss = Linkie('<') interpreter.current = interpreter.text interpreter.recordee = None -interpreter.regpath = Register(0) # for generating new registers +interpreter.regpaths = [Register(0)] # for generating new registers interpreter.hanging = {} default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'} |
From: <di...@us...> - 2003-05-17 08:46:27
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv14469 Modified Files: tran-builtins tran.py Log Message: let interpreter.regpath be an instance of Register Index: tran-builtins =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- tran-builtins 17 May 2003 06:44:35 -0000 1.14 +++ tran-builtins 17 May 2003 08:46:24 -0000 1.15 @@ -79,15 +79,14 @@ :regs|family def regs_state0 (family): if Meaning.has_key(family): raise 'duplicate declaration', family - f = apply(Register, interpreter.regpath) + f = interpreter.regpath Meaning[family] = f Registers[f] = family - interpreter.regpath.append(0) + interpreter.regpath = interpreter.regpath.child() interpreter.state = regs_state def regs_state (tok): if tok == Semicolon: - interpreter.regpath.pop() - interpreter.regpath[-1] += 1 + interpreter.regpath = interpreter.regpath.parent().next() if len(interpreter.regpath) == 1: interpreter.state = outer_state elif Meaning.has_key(tok): @@ -95,10 +94,10 @@ interpreter.state = regs_state0 else: raise 'duplicate declaration', tok else: - r = apply(Register, interpreter.regpath) + r = interpreter.regpath Meaning[tok] = r Registers[r] = tok - interpreter.regpath[-1] += 1 + interpreter.regpath = interpreter.regpath.next() regs_state0(family) align int Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.85 retrieving revision 1.86 diff -u -d -r1.85 -r1.86 --- tran.py 17 May 2003 08:37:23 -0000 1.85 +++ tran.py 17 May 2003 08:46:24 -0000 1.86 @@ -161,7 +161,7 @@ def next (this): l = list(this) l[-1] += 1 - return apply(Register, this) + return apply(Register, l) def child (this, index = 0): return apply(Register, this + (index,)) def __repr__ (this): @@ -284,7 +284,7 @@ interpreter.bss = Linkie('<') interpreter.current = interpreter.text interpreter.recordee = None -interpreter.regpath = [0] # for generating new registers +interpreter.regpath = Register(0) # for generating new registers interpreter.hanging = {} default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'} |
From: <di...@us...> - 2003-05-17 08:37:27
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv11799 Modified Files: tran.py Log Message: wrote Register.next and Register.child Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.84 retrieving revision 1.85 diff -u -d -r1.84 -r1.85 --- tran.py 17 May 2003 08:34:21 -0000 1.84 +++ tran.py 17 May 2003 08:37:23 -0000 1.85 @@ -158,6 +158,12 @@ def parent (this): if len(this): return apply(Register, this[:-1]) else: return None + def next (this): + l = list(this) + l[-1] += 1 + return apply(Register, this) + def child (this, index = 0): + return apply(Register, this + (index,)) def __repr__ (this): return 'Register' + tuple.__repr__(this) def __str__ (this): |
From: <di...@us...> - 2003-05-17 08:34:25
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv10845 Modified Files: tran.py Log Message: added interpreter.hanging Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.83 retrieving revision 1.84 diff -u -d -r1.83 -r1.84 --- tran.py 17 May 2003 08:10:38 -0000 1.83 +++ tran.py 17 May 2003 08:34:21 -0000 1.84 @@ -279,6 +279,7 @@ interpreter.current = interpreter.text interpreter.recordee = None interpreter.regpath = [0] # for generating new registers +interpreter.hanging = {} default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'} verbose = 0 |
From: <di...@us...> - 2003-05-17 08:10:41
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv3315 Modified Files: tran.py Log Message: implemented |...| Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.82 retrieving revision 1.83 diff -u -d -r1.82 -r1.83 --- tran.py 17 May 2003 06:08:31 -0000 1.82 +++ tran.py 17 May 2003 08:10:38 -0000 1.83 @@ -228,7 +228,7 @@ m = Meaning[tok] if isinstance(m, list): prep.push(Macro_Cursor(m)) elif isinstance(m, Stackable): Regstack.append(m) - else: # assume tuple + elif isinstance(m, tuple): mtype = m[0] if mtype == 'builtin': if m[2] & MA_PREFIX: @@ -238,6 +238,7 @@ else: m[1]() else: raise 'Unknown meaning type in', `Meaning[tok]` + else: raise 'Unknown meaning format for', tok else: raise 'bad token', tok Regstack = [] @@ -245,6 +246,7 @@ MA_PREFIX = 1 Meaning = {'reg': Generic_Register, + '...': Unique('...'), 'tetras': ['dup', '+', 'dup', '+'], # FIXME } for m in 'any const int lit sum sym'.split(' '): |