[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