[pypy-svn] r18990 - pypy/dist/pypy/tool

mwh at codespeak.net mwh at codespeak.net
Wed Oct 26 11:12:22 CEST 2005


Author: mwh
Date: Wed Oct 26 11:12:21 2005
New Revision: 18990

Modified:
   pypy/dist/pypy/tool/importfun.py
Log:
checkpoint: can import-analyse all of pypy now.
next: do something useful with the info :)


Modified: pypy/dist/pypy/tool/importfun.py
==============================================================================
--- pypy/dist/pypy/tool/importfun.py	(original)
+++ pypy/dist/pypy/tool/importfun.py	Wed Oct 26 11:12:21 2005
@@ -2,6 +2,7 @@
 import opcode
 import dis
 import imp
+import os
 from sys import path, prefix
 
 """
@@ -73,6 +74,16 @@
 POP_TOP
 
 
+import foo.bar
+
+->
+
+LOAD_CONST  None
+IMPORT_NAME foo.bar
+STORE_NAME  foo
+
+(I hate this style)
+
 there are other forms, but i don't support them (should hit an
 assertion rather than silently fail).
 
@@ -109,10 +120,15 @@
 class Module(object):
     def __init__(self, system):
         self.system = system
-        self.imports = {} # {modname:{name:was-it-used?}}
+        self._imports = {} # {modname:{name:was-it-used?}}
         self.definitions = []
         self.toplevelscope = Scope()
-
+    def import_(self, modname):
+        if modname not in self._imports:
+            if modname not in self.system.modules:
+                self.system.pendingmodules[modname] = None
+            self._imports[modname] = {}
+        return self._imports[modname]
 
 def iteropcodes(codestring):
     n = len(codestring)
@@ -165,21 +181,18 @@
             
             if fromlist is None:
                 # this is the 'import foo' case
-                if modname not in r.imports:
-                    if modname not in r.system.modules:
-                        r.system.pendingmodules[modname] = None
-                    r.imports[modname] = {}
+                r.import_(modname)
 
                 postop, postoparg = opcodes[i+1]
 
                 # ban 'import foo.bar' (it's dubious style anyway, imho)
                 
-                assert not '.' in modname
+                #assert not '.' in modname
                 
-                scope.modvars[codeob.co_names[postoparg]] = modname
+                scope.modvars[codeob.co_names[postoparg]] = modname.split('.')[0]
                 i += 1
             elif fromlist == ('*',):
-                pass
+                r.import_(modname)['*'] = False
             else:
                 # ok, this is from foo import bar
                 path = None
@@ -199,24 +212,17 @@
                     except ImportError:
                         assert mods is None
                         vars = True
-                        if modname not in r.imports:
-                            if modname not in r.system.modules:
-                                r.system.pendingmodules[modname] = None
-                            r.imports[modname] = {}
-                        r.imports[modname][f] = False
+                        r.import_(modname)[f] = False
                     else:
                         assert vars is None
                         mods = True
                         submod = modname + '.' + f
-                        if submod not in r.imports:
-                            if submod not in r.system.modules:
-                                r.system.pendingmodules[submod] = None
-                            r.imports[submod] = {}
+                        r.import_(submod)
                         
                     op, oparg = opcodes[i]
 
-                    assert op in [STORE_NAME, STORE_FAST, STORE_DEREF]
-                    
+                    assert op in [STORE_NAME, STORE_FAST, STORE_DEREF, STORE_GLOBAL]
+
                     if mods is not None:
                         scope.modvars[codeob.co_names[oparg]] = submod
                     else:
@@ -228,22 +234,26 @@
             r.definitions.append(codeob.co_names[oparg])
         elif op == LOAD_ATTR:
             preop, preoparg = opcodes[i-1]
-            if preop in [LOAD_FAST, LOAD_NAME, LOAD_GLOBAL]:
+            if preop in [LOAD_NAME, LOAD_GLOBAL]:
                 m = scope.mod_for_name(codeob.co_names[preoparg])
                 if m:
-                    r.imports[m][codeob.co_names[oparg]] = True
+                    r.import_(m)[codeob.co_names[oparg]] = True
+            elif preop in [LOAD_FAST]:
+                m = scope.mod_for_name(codeob.co_varnames[preoparg])
+                if m:
+                    r.import_(m)[codeob.co_names[oparg]] = True                
         elif op in [LOAD_NAME, LOAD_GLOBAL]:
             name = codeob.co_names[oparg]
             m, a = scope.var_source(name)
             if m:
-                assert a in r.imports[m]
-                r.imports[m][a] = True
+                assert a in r.import_(m)
+                r.import_(m)[a] = True
         elif op in [LOAD_FAST]:
             name = codeob.co_varnames[oparg]
             m, a = scope.var_source(name)
             if m:
-                assert a in r.imports[m]
-                r.imports[m][a] = True
+                assert a in r.import_(m)
+                r.import_(m)[a] = True
         elif op in [MAKE_FUNCTION, MAKE_CLOSURE]:
             preop, preoparg = opcodes[i-1]
             assert preop == LOAD_CONST
@@ -255,14 +265,19 @@
 
 def process_module(dottedname, system):
     path = find_from_dotted_name(dottedname)
-    code = compile(open(path).read(), '', 'exec')
+    if os.path.isdir(path):
+        path += '/__init__.py'
+    code = compile(open(path, "U").read(), '', 'exec')
     r = Module(system)
 
-    process(r, code, r.toplevelscope, True)
-
-    assert dottedname not in system.pendingmodules
+    try:
+        process(r, code, r.toplevelscope, True)
+    except ImportError, e:
+        print "failed!", e
+    else:
+        assert dottedname not in system.pendingmodules
 
-    system.modules[dottedname] = r
+        system.modules[dottedname] = r
         
     return r
 
@@ -280,7 +295,7 @@
     while system.pendingmodules:
         path, d = system.pendingmodules.popitem()
         print len(system.pendingmodules), path
-        if not path.startswith('pypy.'):
+        if not path.startswith('pypy.') or path == 'pypy._cache':
             continue
         process_module(path, system)
 



More information about the Pypy-commit mailing list