Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
66a07c0
commit 217a5fa
Showing
11 changed files
with
1,377 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
# Disassembler | ||
|
||
import sys | ||
import string | ||
|
||
def dis(): | ||
tb = sys.last_traceback | ||
while tb.tb_next: tb = tb.tb_next | ||
distb(tb) | ||
|
||
def distb(tb): | ||
disassemble(tb.tb_frame.f_code, tb.tb_lasti) | ||
|
||
def disco(co): | ||
disassemble(co, -1) | ||
|
||
def disassemble(co, lasti): | ||
code = co.co_code | ||
labels = findlabels(code) | ||
n = len(code) | ||
i = 0 | ||
while i < n: | ||
c = code[i] | ||
op = ord(c) | ||
if op = SET_LINENO and i > 0: print # Extra blank line | ||
if i = lasti: print '-->', | ||
else: print ' ', | ||
if i in labels: print '>>', | ||
else: print ' ', | ||
print string.rjust(`i`, 4), | ||
print string.ljust(opname[op], 15), | ||
i = i+1 | ||
if op >= HAVE_ARGUMENT: | ||
oparg = ord(code[i]) + ord(code[i+1])*256 | ||
i = i+2 | ||
print string.rjust(`oparg`, 5), | ||
if op in hasconst: | ||
print '(' + `co.co_consts[oparg]` + ')', | ||
elif op in hasname: | ||
print '(' + co.co_names[oparg] + ')', | ||
elif op in hasjrel: | ||
print '(to ' + `i + oparg` + ')', | ||
|
||
def findlabels(code): | ||
labels = [] | ||
n = len(code) | ||
i = 0 | ||
while i < n: | ||
c = code[i] | ||
op = ord(c) | ||
i = i+1 | ||
if op >= HAVE_ARGUMENT: | ||
oparg = ord(code[i]) + ord(code[i+1])*256 | ||
i = i+2 | ||
label = -1 | ||
if op in hasjrel: | ||
label = i+oparg | ||
elif op in hasjabs: | ||
label = oparg | ||
if label >= 0: | ||
if label not in labels: | ||
labels.append(label) | ||
return labels | ||
|
||
hasconst = [] | ||
hasname = [] | ||
hasjrel = [] | ||
hasjabs = [] | ||
|
||
opname = range(256) | ||
for op in opname: opname[op] = '<' + `op` + '>' | ||
|
||
def def_op(name, op): | ||
opname[op] = name | ||
|
||
def name_op(name, op): | ||
opname[op] = name | ||
hasname.append(op) | ||
|
||
def jrel_op(name, op): | ||
opname[op] = name | ||
hasjrel.append(op) | ||
|
||
def jabs_op(name, op): | ||
opname[op] = name | ||
hasjabs.append(op) | ||
|
||
# Instruction opcodes for compiled code | ||
|
||
def_op('STOP_CODE', 0) | ||
def_op('POP_TOP', 1) | ||
def_op('ROT_TWO', 2) | ||
def_op('ROT_THREE', 3) | ||
def_op('DUP_TOP', 4) | ||
|
||
def_op('UNARY_POSITIVE', 10) | ||
def_op('UNARY_NEGATIVE', 11) | ||
def_op('UNARY_NOT', 12) | ||
def_op('UNARY_CONVERT', 13) | ||
def_op('UNARY_CALL', 14) | ||
|
||
def_op('BINARY_MULTIPLY', 20) | ||
def_op('BINARY_DIVIDE', 21) | ||
def_op('BINARY_MODULO', 22) | ||
def_op('BINARY_ADD', 23) | ||
def_op('BINARY_SUBTRACT', 24) | ||
def_op('BINARY_SUBSCR', 25) | ||
def_op('BINARY_CALL', 26) | ||
|
||
def_op('SLICE+0', 30) | ||
def_op('SLICE+1', 31) | ||
def_op('SLICE+2', 32) | ||
def_op('SLICE+3', 33) | ||
|
||
def_op('STORE_SLICE+0', 40) | ||
def_op('STORE_SLICE+1', 41) | ||
def_op('STORE_SLICE+2', 42) | ||
def_op('STORE_SLICE+3', 43) | ||
|
||
def_op('DELETE_SLICE+0', 50) | ||
def_op('DELETE_SLICE+1', 51) | ||
def_op('DELETE_SLICE+2', 52) | ||
def_op('DELETE_SLICE+3', 53) | ||
|
||
def_op('STORE_SUBSCR', 60) | ||
def_op('DELETE_SUBSCR', 61) | ||
|
||
def_op('PRINT_EXPR', 70) | ||
def_op('PRINT_ITEM', 71) | ||
def_op('PRINT_NEWLINE', 72) | ||
|
||
def_op('BREAK_LOOP', 80) | ||
def_op('RAISE_EXCEPTION', 81) | ||
def_op('LOAD_LOCALS', 82) | ||
def_op('RETURN_VALUE', 83) | ||
def_op('REQUIRE_ARGS', 84) | ||
def_op('REFUSE_ARGS', 85) | ||
def_op('BUILD_FUNCTION', 86) | ||
def_op('POP_BLOCK', 87) | ||
def_op('END_FINALLY', 88) | ||
def_op('BUILD_CLASS', 89) | ||
|
||
HAVE_ARGUMENT = 90 # Opcodes from here have an argument: | ||
|
||
name_op('STORE_NAME', 90) # Index in name list | ||
name_op('DELETE_NAME', 91) # "" | ||
def_op('UNPACK_TUPLE', 92) # Number of tuple items | ||
def_op('UNPACK_LIST', 93) # Number of list items | ||
# unused: 94 | ||
name_op('STORE_ATTR', 95) # Index in name list | ||
name_op('DELETE_ATTR', 96) # "" | ||
|
||
def_op('LOAD_CONST', 100) # Index in const list | ||
hasconst.append(100) | ||
name_op('LOAD_NAME', 101) # Index in name list | ||
def_op('BUILD_TUPLE', 102) # Number of tuple items | ||
def_op('BUILD_LIST', 103) # Number of list items | ||
def_op('BUILD_MAP', 104) # Always zero for now | ||
name_op('LOAD_ATTR', 105) # Index in name list | ||
def_op('COMPARE_OP', 106) # Comparison operator | ||
name_op('IMPORT_NAME', 107) # Index in name list | ||
name_op('IMPORT_FROM', 108) # Index in name list | ||
|
||
jrel_op('JUMP_FORWARD', 110) # Number of bytes to skip | ||
jrel_op('JUMP_IF_FALSE', 111) # "" | ||
jrel_op('JUMP_IF_TRUE', 112) # "" | ||
jabs_op('JUMP_ABSOLUTE', 113) # Target byte offset from beginning of code | ||
jrel_op('FOR_LOOP', 114) # Number of bytes to skip | ||
|
||
jrel_op('SETUP_LOOP', 120) # Distance to target address | ||
jrel_op('SETUP_EXCEPT', 121) # "" | ||
jrel_op('SETUP_FINALLY', 122) # "" | ||
|
||
def_op('SET_LINENO', 127) # Current line number | ||
SET_LINENO = 127 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# 'grep' | ||
|
||
import regexp | ||
import string | ||
|
||
def grep(expr, filename): | ||
prog = regexp.compile(expr) | ||
fp = open(filename, 'r') | ||
lineno = 0 | ||
while 1: | ||
line = fp.readline() | ||
if not line: break | ||
lineno = lineno + 1 | ||
res = prog.exec(line) | ||
if res: | ||
#print res | ||
start, end = res[0] | ||
if line[-1:] = '\n': line = line[:-1] | ||
prefix = string.rjust(`lineno`, 3) + ': ' | ||
print prefix + line | ||
if 0: | ||
line = line[:start] | ||
if '\t' not in line: | ||
prefix = ' ' * (len(prefix) + start) | ||
else: | ||
prefix = ' ' * len(prefix) | ||
for c in line: | ||
if c <> '\t': c = ' ' | ||
prefix = prefix + c | ||
if start = end: prefix = prefix + '\\' | ||
else: prefix = prefix + '^'*(end-start) | ||
print prefix |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# 'grep' | ||
|
||
import regexp | ||
import string | ||
|
||
def grep(expr, filename): | ||
prog = regexp.compile(expr) | ||
fp = open(filename, 'r') | ||
lineno = 0 | ||
while 1: | ||
line = fp.readline() | ||
if not line: break | ||
lineno = lineno + 1 | ||
res = prog.exec(line) | ||
if res: | ||
#print res | ||
start, end = res[0] | ||
if line[-1:] = '\n': line = line[:-1] | ||
prefix = string.rjust(`lineno`, 3) + ': ' | ||
print prefix + line | ||
if 0: | ||
line = line[:start] | ||
if '\t' not in line: | ||
prefix = ' ' * (len(prefix) + start) | ||
else: | ||
prefix = ' ' * len(prefix) | ||
for c in line: | ||
if c <> '\t': c = ' ' | ||
prefix = prefix + c | ||
if start = end: prefix = prefix + '\\' | ||
else: prefix = prefix + '^'*(end-start) | ||
print prefix |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
# Module 'packmail' -- create a shell script out of some files. | ||
|
||
import mac | ||
import macpath | ||
from stat import ST_MTIME | ||
|
||
# Pack one file | ||
def pack(outfp, file, name): | ||
fp = open(file, 'r') | ||
outfp.write('sed "s/^X//" >' + name + ' <<"!"\n') | ||
while 1: | ||
line = fp.readline() | ||
if not line: break | ||
if line[-1:] <> '\n': | ||
line = line + '\n' | ||
outfp.write('X' + line) | ||
outfp.write('!\n') | ||
|
||
# Pack some files from a directory | ||
def packsome(outfp, dirname, names): | ||
for name in names: | ||
print name | ||
file = macpath.cat(dirname, name) | ||
pack(outfp, file, name) | ||
|
||
# Pack all files from a directory | ||
def packall(outfp, dirname): | ||
names = mac.listdir(dirname) | ||
names.sort() | ||
packsome(outfp, dirname, names) | ||
|
||
# Pack all files from a directory that are not older than a give one | ||
def packnotolder(outfp, dirname, oldest): | ||
names = mac.listdir(dirname) | ||
oldest = macpath.cat(dirname, oldest) | ||
st = mac.stat(oldest) | ||
mtime = st[ST_MTIME] | ||
todo = [] | ||
for name in names: | ||
print name, '...', | ||
st = mac.stat(macpath.cat(dirname, name)) | ||
if st[ST_MTIME] >= mtime: | ||
print 'Yes.' | ||
todo.append(name) | ||
else: | ||
print 'No.' | ||
todo.sort() | ||
packsome(outfp, dirname, todo) |
Oops, something went wrong.
217a5fa
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
does it actually work?