[pypy-svn] r19106 - pypy/dist/pypy/tool
mwh at codespeak.net
mwh at codespeak.net
Fri Oct 28 12:33:03 CEST 2005
Author: mwh
Date: Fri Oct 28 12:33:02 2005
New Revision: 19106
Modified:
pypy/dist/pypy/tool/importfun.py
Log:
some fairly straightforward refactoring.
Modified: pypy/dist/pypy/tool/importfun.py
==============================================================================
--- pypy/dist/pypy/tool/importfun.py (original)
+++ pypy/dist/pypy/tool/importfun.py Fri Oct 28 12:33:02 2005
@@ -156,24 +156,32 @@
i += 2
yield op, oparg
-STORE_DEREF = opcode.opmap["STORE_DEREF"]
-STORE_FAST = opcode.opmap["STORE_FAST"]
-STORE_GLOBAL = opcode.opmap["STORE_GLOBAL"]
-STORE_NAME = opcode.opmap["STORE_NAME"]
-IMPORT_NAME = opcode.opmap["IMPORT_NAME"]
-IMPORT_FROM = opcode.opmap["IMPORT_FROM"]
-LOAD_CONST = opcode.opmap["LOAD_CONST"]
-LOAD_ATTR = opcode.opmap["LOAD_ATTR"]
-
-LOAD_DEREF = opcode.opmap["LOAD_DEREF"]
-LOAD_FAST = opcode.opmap["LOAD_FAST"]
-LOAD_NAME = opcode.opmap["LOAD_NAME"]
-LOAD_GLOBAL = opcode.opmap["LOAD_GLOBAL"]
-MAKE_CLOSURE = opcode.opmap["MAKE_CLOSURE"]
-MAKE_FUNCTION = opcode.opmap["MAKE_FUNCTION"]
+class _Op(object):
+ def __getattr__(self, name):
+ if name in opcode.opmap:
+ return opcode.opmap[name]
+ else:
+ raise AttributeError, name
+
+_op_ = _Op()
+
-POP_TOP = opcode.opmap['POP_TOP']
+loadops = [_op_.LOAD_NAME, _op_.LOAD_GLOBAL, _op_.LOAD_FAST, _op_.LOAD_DEREF]
+storeops = [_op_.STORE_NAME, _op_.STORE_FAST, _op_.STORE_DEREF, _op_.STORE_GLOBAL]
+
+def name_for_op(code, op, oparg):
+ if op in [_op_.LOAD_GLOBAL, _op_.STORE_GLOBAL, _op_.LOAD_NAME, _op_.STORE_NAME]:
+ return code.co_names[oparg]
+ elif op in [_op_.LOAD_FAST, _op_.STORE_FAST]:
+ return code.co_varnames[oparg]
+ elif op in [_op_.LOAD_DEREF, _op_.STORE_DEREF]:
+ if oparg < len(code.co_cellvars):
+ return code.co_cellvars[oparg]
+ else:
+ return code.co_freevars[oparg - len(code.co_cellvars)]
+ else:
+ assert 0, "%s is not an opcode with a name!"%(opcode.opname[op],)
def process(r, codeob, scope, toplevel=False):
opcodes = list(iteropcodes(codeob.co_code))
@@ -185,9 +193,9 @@
while i < len(opcodes):
op, oparg = opcodes[i]
- if op == IMPORT_NAME:
+ if op == _op_.IMPORT_NAME:
preop, preoparg = opcodes[i-1]
- assert preop == LOAD_CONST, 'LOAD_CONST'
+ assert preop == _op_.LOAD_CONST, 'LOAD_CONST'
fromlist = codeob.co_consts[preoparg]
@@ -206,17 +214,8 @@
# this assert actually triggers quite frequently, for things like
# import py.lib as lib
# (which is strange code, in my book...)
- assert postop in [STORE_NAME, STORE_FAST, STORE_DEREF, STORE_GLOBAL], 'postop'
- if postop == STORE_FAST:
- storename = codeob.co_varnames[postoparg]
- elif postop == STORE_DEREF:
- if postoparg < len(codeob.co_cellvars):
- storename = codeob.co_cellvars[postoparg]
- else:
- storename = codeob.co_freevars[postoparg - len(codeob.co_cellvars)]
- else:
- storename = codeob.co_names[postoparg]
-
+ assert postop in storeops, 'postop'
+ storename = name_for_op(codeob, postop, postoparg)
scope.modvars[storename] = modname.split('.')[0]
i += 1
elif fromlist == ('*',):
@@ -245,7 +244,7 @@
i += 1
for f in fromlist:
op, oparg = opcodes[i]
- assert op == IMPORT_FROM, 'IMPORT_FROM'
+ assert op == _op_.IMPORT_FROM, 'IMPORT_FROM'
assert codeob.co_names[oparg] == f, 'f'
i += 1
@@ -267,17 +266,8 @@
op, oparg = opcodes[i]
- assert op in [STORE_NAME, STORE_FAST, STORE_DEREF, STORE_GLOBAL], 'opstore'
- if op == STORE_FAST:
- storename = codeob.co_varnames[oparg]
- elif op == STORE_DEREF:
- if oparg < len(codeob.co_cellvars):
- storename = codeob.co_cellvars[oparg]
- else:
- storename = codeob.co_freevars[oparg - len(codeob.co_cellvars)]
- else:
- storename = codeob.co_names[oparg]
-
+ assert op in storeops, 'opstore'
+ storename = name_for_op(codeob, op, oparg)
if mod:
scope.modvars[storename] = submod
@@ -285,21 +275,18 @@
scope.varsources[storename] = modname, f
i += 1
op, oparg = opcodes[i]
- assert op == POP_TOP, 'POP_TOP'
- elif op == STORE_NAME and toplevel or op == STORE_GLOBAL:
+ assert op == _op_.POP_TOP, 'POP_TOP'
+ elif op == _op_.STORE_NAME and toplevel or op == _op_.STORE_GLOBAL:
r.definitions.append(codeob.co_names[oparg])
- elif op == LOAD_ATTR:
+ elif op == _op_.LOAD_ATTR:
preop, preoparg = opcodes[i-1]
- if preop in [LOAD_NAME, LOAD_GLOBAL]:
- m = scope.mod_for_name(codeob.co_names[preoparg])
- if m:
- r.import_(m)[codeob.co_names[oparg]] = True
- elif preop in [LOAD_FAST]:
- m = scope.mod_for_name(codeob.co_varnames[preoparg])
+ if preop in loadops:
+ name = name_for_op(codeob, preop, preoparg)
+ m = scope.mod_for_name(name)
if m:
r.import_(m)[codeob.co_names[oparg]] = True
- elif op in [LOAD_NAME, LOAD_GLOBAL]:
- name = codeob.co_names[oparg]
+ elif op in loadops:
+ name = name_for_op(codeob, op, oparg)
m, a = scope.var_source(name)
if m:
assert a in r.import_(m), 'a'
@@ -311,24 +298,9 @@
## and name not in __builtin__.__dict__ \
## and (op == LOAD_GLOBAL or toplevel):
## print 'where did', name, 'come from?'
- elif op in [LOAD_FAST]:
- name = codeob.co_varnames[oparg]
- m, a = scope.var_source(name)
- if m:
- assert a in r.import_(m), 'a2'
- r.import_(m)[a] = True
- elif op in [LOAD_DEREF]:
- if oparg < len(codeob.co_cellvars):
- name = codeob.co_cellvars[oparg]
- else:
- name = codeob.co_freevars[oparg - len(codeob.co_cellvars)]
- m, a = scope.var_source(name)
- if m:
- assert a in r.import_(m), 'a3'
- r.import_(m)[a] = True
- elif op in [MAKE_FUNCTION, MAKE_CLOSURE]:
+ elif op in [_op_.MAKE_FUNCTION, _op_.MAKE_CLOSURE]:
preop, preoparg = opcodes[i-1]
- assert preop == LOAD_CONST, 'preop'
+ assert preop == _op_.LOAD_CONST, 'preop'
codeobjs.append(codeob.co_consts[preoparg])
i += 1
@@ -357,6 +329,7 @@
process(r, code, r.toplevelscope, True)
except (ImportError, AssertionError, SyntaxError), e:
print "failed!", e
+ #raise
else:
if dottedname in system.pendingmodules:
print
More information about the Pypy-commit
mailing list