Author: Ronan Lamy <[email protected]>
Branch: HopArg
Changeset: r71501:e4b87a851b03
Date: 2014-05-14 01:21 +0100
http://bitbucket.org/pypy/pypy/changeset/e4b87a851b03/
Log: Create HopArg class to bundle together a Constant-or-Variable, a
Some and a Repr
diff --git a/rpython/rtyper/rtyper.py b/rpython/rtyper/rtyper.py
--- a/rpython/rtyper/rtyper.py
+++ b/rpython/rtyper/rtyper.py
@@ -648,6 +648,22 @@
# ____________________________________________________________
+class HopArg(object):
+ # XXX: find a better name and a meaningful definition
+ def __init__(self, v, s, r, llops):
+ self.v = v # a Constant or Variable
+ self.s = s # an annotation
+ self.r = r # a repr
+ self.llops = llops
+
+ def convert_to(self, repr):
+ v = self.v
+ if isinstance(v, Constant):
+ return inputconst(repr, v.value)
+ if self.s.is_constant():
+ return inputconst(repr, self.s.const)
+ return self.llops.convertvar(v, self.r, repr)
+
class HighLevelOp(object):
forced_opname = None
@@ -672,6 +688,11 @@
def nb_args(self):
return len(self.args_v)
+ @property
+ def args(self):
+ return [HopArg(v, s, r, self.llops) for v, s, r in
+ zip(self.args_v, self.args_s, self.args_r)]
+
def copy(self):
result = HighLevelOp(self.rtyper, self.spaceop,
self.exceptionlinks, self.llops)
@@ -697,17 +718,7 @@
"""
if not isinstance(converted_to, Repr):
converted_to = self.rtyper.getprimitiverepr(converted_to)
- v = self.args_v[arg]
- if isinstance(v, Constant):
- return inputconst(converted_to, v.value)
- assert hasattr(v, 'concretetype')
-
- s_binding = self.args_s[arg]
- if s_binding.is_constant():
- return inputconst(converted_to, s_binding.const)
-
- r_binding = self.args_r[arg]
- return self.llops.convertvar(v, r_binding, converted_to)
+ return self.args[arg].convert_to(converted_to)
inputconst = staticmethod(inputconst) # export via the HighLevelOp class
@@ -717,8 +728,10 @@
"'%s' has %d arguments, rtyper wants %d" % (
self.spaceop.opname, self.nb_args, len(converted_to)))
vars = []
- for i in range(len(converted_to)):
- vars.append(self.inputarg(converted_to[i], i))
+ for arg, repr in zip(self.args, converted_to):
+ if not isinstance(repr, Repr):
+ repr = self.rtyper.getprimitiverepr(repr)
+ vars.append(arg.convert_to(repr))
return vars
def genop(self, opname, args_v, resulttype=None):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit