[pypy-svn] r4858 - pypy/branch/ale_translator_stuff

ale at codespeak.net ale at codespeak.net
Thu Jun 3 12:19:53 CEST 2004


Author: ale
Date: Thu Jun  3 12:19:52 2004
New Revision: 4858

Modified:
   pypy/branch/ale_translator_stuff/codewriter.py
   pypy/branch/ale_translator_stuff/genpyrex.py
Log:
Using the old naming logic

Modified: pypy/branch/ale_translator_stuff/codewriter.py
==============================================================================
--- pypy/branch/ale_translator_stuff/codewriter.py	(original)
+++ pypy/branch/ale_translator_stuff/codewriter.py	Thu Jun  3 12:19:52 2004
@@ -1,3 +1,4 @@
+from pypy.objspace.flow.model import Variable, Constant, UndefinedConstant
 
 
 class CodeWriter:
@@ -16,22 +17,95 @@
         def write_rec(block,indentation_level=0):
             for item in block:
                 if isinstance(item,str):
-                    print >>file,"  "*indentation_level+item
+                    print >>file, "  "*indentation_level + item
                 else:
                     write_rec(item,indentation_level+1)
                     
         write_rec(self.blocks)
         
-    def name(self,obj):
+    def xx_name(self,obj):
+        print "Name, ",repr(obj)
         if obj in self.known_names:
             return self.known_names[obj]
         else:
             name=getattr(obj,'__name__','Var')
             if name in self.unique_val:
                 self.unique_val[name]+=1
-                name=name+'__'+str(self.unique_val[name])
+                name=name+'_'+str(self.unique_val[name])
             else:
                 self.unique_val[name]=0
             self.known_names[obj]=name
             return name
+        
+    def _hackname(self, value):
+        try:
+            name = value.__name__
+        except AttributeError:
+            pass
+        else:
+            import types
+            if isinstance(value, (types.FunctionType, types.ClassType, type)):
+                # XXX! use the id of the value to make unique function and
+                #      class names
+                return '%s__%x' % (name, id(value))
+            elif isinstance(value, types.BuiltinFunctionType):
+                return str(name)
+        if isinstance(value, int):
+            value = int(value)  # cast subclasses of int (i.e. bools) to ints
+        return repr(value)
+    
+    def get_functionname(self,function):
+        return function.func_name
+    
+    def name(self, obj):
+        if isinstance(obj, Variable):
+            #self.variablelocations[obj] = block
+            return self.get_varname(obj)
+        elif isinstance(obj, Constant):
+            return self._hackname(obj.value)
+        else:
+            print "Type error"
+            raise TypeError("Unknown class: %s" % obj.__class__)
+    def get_type(self, var):
+        if isinstance(var, Constant):
+            return type(var.value)
+        elif self.annotator:
+            return self.annotator.gettype(var)
+        else:
+            return None
+
+    def get_classname(self, userclass):
+        return self._hackname(userclass)
+
+    def _vardecl(self, var):
+            vartype, varname = self._paramvardecl(var)
+            if vartype != "object":
+                return "cdef %s %s" % (vartype, varname)
+            else:
+                return ""
+
+    def get_varname(self, var):
+        vartype = self.get_type(var)
+        if vartype in (int, bool):
+            prefix = "i_"
+        elif self.annotator and vartype in self.annotator.getuserclasses():
+            prefix = "p_"
+        else:
+            prefix = ""
+        return prefix + var.name
+
+    def _paramvardecl(self, var):
+        vartype = self.get_type(var)
+        ctype=self._gettypename(vartype)
+        return (ctype, self.get_varname(var))
+
+    def _gettypename(self, vartype):
+        if vartype in (int, bool):
+            ctype = "int"
+        elif self.annotator and vartype in self.annotator.getuserclasses():
+            ctype = self.get_classname(vartype)
+        else:
+            ctype = "object"
+        return ctype
+        
     
\ No newline at end of file

Modified: pypy/branch/ale_translator_stuff/genpyrex.py
==============================================================================
--- pypy/branch/ale_translator_stuff/genpyrex.py	(original)
+++ pypy/branch/ale_translator_stuff/genpyrex.py	Thu Jun  3 12:19:52 2004
@@ -10,7 +10,7 @@
 from pypy.annotation.model import SomeMethod
 from pypy.translator.codewriter import CodeWriter
 
-Op={'next'          :'',
+Op={
     'getitem'       :"%s = %s[%s]",
     'newtuple'      :"%s = (%s)",
     'newlist'       :"%s = [%s]",
@@ -24,7 +24,8 @@
     'not'           :"%s = not %s",
     'is_true'       :"%s = not not %s",
     'exception'     :"%s, last_exc = last_exc, None" ,
-    'generic'       :"%s = %s(%s)" 
+    'generic'       :"%s = %s(%s)" ,
+    'next'          :'',
     }
 class GenPyrex(CodeWriter):
     
@@ -34,12 +35,10 @@
         self.annotator=annotator
         self.blockids={}
         ops = {}
-        oparity = {}
         for (opname, opsymbol, arity, _) in ObjSpace.MethodTable:
             ops[opname] = opsymbol
-            oparity[opname] = arity
         self.ops = ops  
-        self.oparity = oparity
+        
                 
     def build(self):
         self.blockids={}
@@ -96,14 +95,14 @@
         self.blockids={}
         fungraph=self.translator.getflowgraph(function)
         self.entrymap = mkentrymap(fungraph)  
-        signature = [ "%s %s"%(self.typename(self.typeof(var)),
+        signature = [ "%s %s"%(self.typeof(var),
             self.name(var)) for var in fungraph.getargs() ]
         signature=",".join(signature)
         if self.translator.entrypoint is function:
-            yield "def %s(%s):" % (self.name(function),signature)
+            yield "def %s(%s):" % (self.get_functionname(function),signature)
         else:
             yield "cdef %s %s(%s):" % (self.typeof(fungraph.getreturnvar()),
-                self.name(function),signature)
+                self.get_functionname(function),signature)
         # Building the body of the function
         body=[]
         print "Entry map keys",self.entrymap.keys()
@@ -142,40 +141,8 @@
             yield 'cinline "Label%s:"' % thisone
         for op in block.operations:
            # print "making operations %s"%op
-            argnames = [self.name(arg) for arg in op.args]
-            resultname = self.name(op.result)
-            operator = self.ops.get(op.opname, op.opname)
-            
-            if operator in ['+','-','*','**','/']:
-                if len(argnames) == 1:
-                    yield "%s = %s %s" % (resultname, operator) + argnames
-                elif len(argnames) == 2:
-                    yield "%s = %s %s %s" % (resultname, argnames[0], operator, argnames[1])
-                elif len(argnames) == 3 and operator == "**": #special case, have to handle it manually
-                    yield "%s = pow(%s, %s, %s)" % (resultname,) + argnames
-                else:
-                    raise NotImplementedError, "I don't know to handle the operator %s (arity %s)" \
-                          % (operator, len(argnames))
-            else:
-                opstring=Op.get(operator,None)
-                if opstring:
-                    if operator in ['newlist','newtuple']:
-                        format=(resultname,"".join([a+',' for a in argnames]))
-                    elif operator =='newdict':
-                        pairs = []
-                        for i in range(0, len(argnames), 2):
-                            pairs.append("%s: %s, " % 
-                                (argnames[i], argnames[i+1]))
-                        format=(resultname,",".join(pairs))
-                    elif operator =='simple_call':
-                        format=(resultname,argnames[0],
-                            ",".join(argnames[1:]))
-                    else:
-                        format=(resultname,)+tuple(argnames)
-                    #print opstring,resultname,argnames,format
-                    yield opstring %format
-                else:
-                    yield Op['generic']%format
+           for op_string in self.build_operations(op):
+               yield op_string
         exits = block.exits
         if len(exits) == 1:
             for line in self.gen_link(block, exits[0]): yield line
@@ -217,29 +184,55 @@
         print "from gen_link", prevblock, "doing", block
         for line in self.build_block(block): yield line
 
-    
+    def build_operations(self,op):
+        argnames = [self.name(arg) for arg in op.args]
+        resultname = self.name(op.result)
+        operator = self.ops.get(op.opname, op.opname)
+        
+        if operator in ['+','-','*','**','/']:
+            if len(argnames) == 1:
+                yield "%s = %s %s" % (resultname, operator) + argnames
+            elif len(argnames) == 2:
+                yield "%s = %s %s %s" % (resultname, argnames[0], operator, argnames[1])
+            elif len(argnames) == 3 and operator == "**": #special case, have to handle it manually
+                yield "%s = pow(%s, %s, %s)" % (resultname,) + argnames
+            else:
+                raise NotImplementedError, "I don't know to handle the operator %s (arity %s)" \
+                      % (operator, len(argnames))
+        else:
+            opstring=Op.get(operator,None)
+            format=(resultname,)+tuple([arg for arg in argnames])
+            if opstring:
+                if operator in ['newlist','newtuple']:
+                    format=(resultname,"".join([a+',' for a in argnames]))
+                elif operator =='newdict':
+                    pairs = []
+                    for i in range(0, len(argnames), 2):
+                        pairs.append("%s: %s, " % 
+                            (argnames[i], argnames[i+1]))
+                    format=(resultname,",".join(pairs))
+                elif operator =='simple_call':
+                    format=(resultname,argnames[0],
+                        ",".join([arg for arg in argnames[1:]]))
+                #print opstring,resultname,argnames,format
+                yield opstring %format
+            elif operator == 'next':
+                yield "try:"
+                yield ["  %s = %s.next()" % (resultname, argnames[0])]
+                yield "except StopIteration:"
+                yield ["  last_exc = StopIteration"]
+                yield "else:"
+                yield ["  last_exc = None"]
+            else:
+                format=(resultname,)
+                yield "%s" % format
+        
     def typeof(self,var):
         if isinstance(var, Constant):
             return self.typename(var.value)
         else:
             return self.typename(self.annotator.gettype(var))
         
-        
-    def varname(self, var):
-        if isinstance(var, Variable):
-            vartype = self.typeof(var)
-            if vartype in (int, bool):
-                prefix = "i_"
-            elif vartype in self.annotator.getuserclasses():
-                prefix = "p_"
-            else:
-                prefix = ""
-            return prefix + var.name
-        elif isinstance(var, Constant):
-            return self.name(var.value)
-        else:
-            raise TypeError("Unknown class: %s" % var.__class__)
-
     def typename(self, vartype):
         if vartype in (int, bool):
             ctype = "int"



More information about the Pypy-commit mailing list