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

Reply via email to