[pypy-svn] r10399 - in pypy/dist/pypy/translator/llvm: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Thu Apr 7 13:30:52 CEST 2005


Author: cfbolz
Date: Thu Apr  7 13:30:52 2005
New Revision: 10399

Modified:
   pypy/dist/pypy/translator/llvm/representation.py
   pypy/dist/pypy/translator/llvm/seqrepr.py
   pypy/dist/pypy/translator/llvm/test/llvmsnippet.py
   pypy/dist/pypy/translator/llvm/test/test_genllvm.py
Log:
Fixed implementation of constant tuples.

Modified: pypy/dist/pypy/translator/llvm/representation.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/representation.py	(original)
+++ pypy/dist/pypy/translator/llvm/representation.py	Thu Apr  7 13:30:52 2005
@@ -215,41 +215,3 @@
             raise AttributeError, ("VariableRepr instance has no attribute %s"
                                    % repr(name))
 
-class TupleRepr(LLVMRepr):
-    def get(obj, gen):
-        if isinstance(obj, Constant):
-            type_ = gen.annotator.binding(obj)
-            if isinstance(type_, annmodel.SomeTuple):
-                return TupleRepr(obj, gen)
-        return None
-    get = staticmethod(get)
-
-    def __init__(self, obj, gen):
-        if debug:
-            print "TupleRepr", obj, obj.value
-        self.const = obj
-        self.tuple = obj.value
-        self.gen = gen
-        self.dependencies = sets.Set()
-
-    def setup(self):
-        self.l_tuple = [self.gen.get_repr(l) for l in list(self.tuple)]
-        self.glvar = self.gen.get_global_tmp("TupleRepr")
-        self.dependencies.update(self.l_tuple)
-        self.type = self.gen.get_repr(self.gen.annotator.binding(self.const))
-
-    def get_globals(self):
-        s = "%s = internal global " % self.glvar + " " + self.llvmtype()
-        s += "{" + ", ".join([l.typed_name() for l in self.l_tuple]) + "}"
-        i = self.l_tuple[0]
-        return s
-
-    def llvmname(self):
-        return self.glvar
-
-    def __getattr__(self, name):
-        if name.startswith("op_"):
-            return getattr(self.type, "t_" + name, None)
-        else:
-            raise AttributeError, ("TupleRepr instance has no attribute %s"
-                                   % repr(name))

Modified: pypy/dist/pypy/translator/llvm/seqrepr.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/seqrepr.py	(original)
+++ pypy/dist/pypy/translator/llvm/seqrepr.py	Thu Apr  7 13:30:52 2005
@@ -3,6 +3,7 @@
 
 from pypy.objspace.flow.model import Constant
 from pypy.annotation import model as annmodel
+from pypy.translator import gensupp
 
 from pypy.translator.llvm.representation import debug, LLVMRepr
 from pypy.translator.llvm.typerepr import TypeRepr, IntTypeRepr
@@ -71,6 +72,49 @@
         else:
             raise CompileError, "List method %s not supported." % args[1].value
 
+
+class TupleRepr(LLVMRepr):
+    def get(obj, gen):
+        if isinstance(obj, Constant):
+            type_ = gen.annotator.binding(obj)
+            if isinstance(type_, annmodel.SomeTuple):
+                return TupleRepr(obj, gen)
+        return None
+    get = staticmethod(get)
+
+    def __init__(self, obj, gen):
+        if debug:
+            print "TupleRepr", obj, obj.value
+        self.const = obj
+        self.tuple = obj.value
+        self.gen = gen
+        self.dependencies = sets.Set()
+
+    def setup(self):
+        self.l_tuple = [self.gen.get_repr(l) for l in list(self.tuple)]
+        self.glvar = self.gen.get_global_tmp(
+            repr(self.tuple).replace(" ", "").translate(gensupp.C_IDENTIFIER))
+        self.dependencies.update(self.l_tuple)
+        self.type = self.gen.get_repr(self.gen.annotator.binding(self.const))
+        self.dependencies.add(self.type)
+
+    def get_globals(self):
+        s = "%s = internal global " % self.glvar + " " + self.llvmtype()[:-1]
+        s += "{" + ", ".join([l.typed_name() for l in self.l_tuple]) + "}"
+        i = self.l_tuple[0]
+        return s
+
+    def llvmname(self):
+        return self.glvar
+
+    def __getattr__(self, name):
+        if name.startswith("op_"):
+            return getattr(self.type, "t_" + name, None)
+        else:
+            raise AttributeError, ("TupleRepr instance has no attribute %s"
+                                   % repr(name))
+
+
 class TupleTypeRepr(TypeRepr):
     def get(obj, gen):
         if isinstance(obj, annmodel.SomeTuple):

Modified: pypy/dist/pypy/translator/llvm/test/llvmsnippet.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/llvmsnippet.py	(original)
+++ pypy/dist/pypy/translator/llvm/test/llvmsnippet.py	Thu Apr  7 13:30:52 2005
@@ -267,6 +267,9 @@
     j, s1, s2, l = tuple_f2(i)
     return j
 
+def constant_tuple(i):
+    return len((1, 2, "asdf")) + i
+
 
 #exception snippets:
 def simple_exception(n):

Modified: pypy/dist/pypy/translator/llvm/test/test_genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/test/test_genllvm.py	Thu Apr  7 13:30:52 2005
@@ -250,6 +250,11 @@
         assert f(15) == 15
         assert f(30) == 30
 
+    def test_constant_tuple(self):
+        f = compile_function(llvmsnippet.constant_tuple, [int])
+        for i in range(3, 7):
+            assert f(i) == i + 3
+
 class TestException(object):
     def setup_method(self,method):
         if not llvm_found:



More information about the Pypy-commit mailing list