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

cfbolz at codespeak.net cfbolz at codespeak.net
Sat Apr 16 02:17:09 CEST 2005


Author: cfbolz
Date: Sat Apr 16 02:17:08 2005
New Revision: 10720

Removed:
   pypy/dist/pypy/translator/llvm/string.ll
Modified:
   pypy/dist/pypy/translator/llvm/class.ll
   pypy/dist/pypy/translator/llvm/classrepr.py
   pypy/dist/pypy/translator/llvm/funcrepr.py
   pypy/dist/pypy/translator/llvm/genllvm.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:
Added support for functions with default args. Various fixes and some tests. Removed unused string.ll file.

Modified: pypy/dist/pypy/translator/llvm/class.ll
==============================================================================
--- pypy/dist/pypy/translator/llvm/class.ll	(original)
+++ pypy/dist/pypy/translator/llvm/class.ll	Sat Apr 16 02:17:08 2005
@@ -64,11 +64,3 @@
         %r = cast sbyte %c to int
         ret int %r
 }
-
-;XXXX
-internal int %std.ord(%std.list.sbyte* %c) {
-	%c = call sbyte %std.getitem(%std.list.sbyte* %c, int 0)
-        %r = cast sbyte %c to int
-        ret int %r
-}
-

Modified: pypy/dist/pypy/translator/llvm/classrepr.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/classrepr.py	(original)
+++ pypy/dist/pypy/translator/llvm/classrepr.py	Sat Apr 16 02:17:08 2005
@@ -152,12 +152,14 @@
         if init is not None:
             l_init = self.gen.get_repr(init)
             l_func.dependencies.add(l_init)
-            l_args = [self.gen.get_repr(arg) for arg in args[1:]]
-            self.dependencies.update(l_args)
-            # XXX
+            l_tmp = self.gen.get_local_tmp(PointerTypeRepr("sbyte", self.gen),
+                                           l_func)
+            self.dependencies.add(l_tmp)
+            #XXX VirtualMethodRepr should recognize __init__ methods
             if isinstance(l_init, VirtualMethodRepr):
                 l_init = l_init.l_funcs[l_init.l_classes.index(self)]
-            lblock.call_void(l_init, [l_target] + l_args)
+            l_init.op_simple_call(l_tmp, [l_init, l_target] + args[1:],
+                                  lblock, l_func)
 
     def t_op_getattr(self, l_target, args, lblock, l_func):
         if debug:

Modified: pypy/dist/pypy/translator/llvm/funcrepr.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/funcrepr.py	(original)
+++ pypy/dist/pypy/translator/llvm/funcrepr.py	Sat Apr 16 02:17:08 2005
@@ -115,6 +115,7 @@
         self.dependencies.update(self.l_args)
         self.retvalue = self.gen.get_repr(self.graph.returnblock.inputargs[0])
         self.dependencies.add(self.retvalue)
+        self.l_default_args = None
         self.build_bbs()
 
     def get_returntype():
@@ -163,6 +164,15 @@
 
     def op_simple_call(self, l_target, args, lblock, l_func):
         l_args = [self.gen.get_repr(arg) for arg in args]
+        if len(l_args) - 1 < len(self.l_args):
+            assert self.func.func_defaults is not None
+            if self.l_default_args is None:
+                self.l_default_args = [self.gen.get_repr(Constant(de))
+                                       for de in self.func.func_defaults]
+                self.dependencies.update(self.l_default_args)
+            offset = len(self.l_args) - len(self.l_default_args)
+            for i in range(len(l_args) - 1, len(self.l_args)):
+                l_args.append(self.l_default_args[i - offset])
         for i, (l_a1, l_a2) in enumerate(zip(l_args[1:], self.l_args)):
             if l_a1.llvmtype() != l_a2.llvmtype():
                 l_tmp = self.gen.get_local_tmp(l_a2.type, l_func)

Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py	Sat Apr 16 02:17:08 2005
@@ -30,10 +30,18 @@
     return gen.compile(optimize)
 
 def get_key(obj):
+    #XXX Get rid of this:
+    #LLVMGenerator should only cache gen_repr requestes,
+    #the Repr classes should be responsible for deciding which queries
+    #should result in the same representation
     if isinstance(obj, Constant):
         #To avoid getting "bool true" as representation for int 1
         if obj.value is True or obj.value is False:
             return obj
+        try:
+            hash(obj.value)
+        except TypeError:
+            return id(obj.value)
         return obj.value
     if isinstance(obj, annmodel.SomeInstance):
         return obj.classdef.cls
@@ -176,9 +184,3 @@
             yield l_dep1
     yield l_repr
 
-
-## from pypy.translator.test.rpystone import *
-## t = Translator(Proc0)
-## a = t.annotate([int])
-## t.view()
-## f = llvmcompile(t)

Modified: pypy/dist/pypy/translator/llvm/seqrepr.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/seqrepr.py	(original)
+++ pypy/dist/pypy/translator/llvm/seqrepr.py	Sat Apr 16 02:17:08 2005
@@ -15,6 +15,8 @@
 
 class ListRepr(LLVMRepr):
     def get(obj, gen):
+        if isinstance(obj, Constant):
+            obj = obj.value
         if obj.__class__ == list:
             return ListRepr(obj, gen)
         return None
@@ -61,7 +63,15 @@
         lblock.getelementptr(l_from, l_tmp, [0, 0])
         lblock.getelementptr(l_to, self, [0, 1])
         lblock.store(l_from, l_to)
-            
+
+    def __getattr__(self, name):
+        if name.startswith("op_"):
+            return getattr(self.type, "t_" + name, None)
+        else:
+            raise AttributeError, ("ListRepr instance has no attribute %s"
+                                   % repr(name))
+
+           
 
 class ListTypeRepr(TypeRepr):
     l_listtypes = {}

Deleted: /pypy/dist/pypy/translator/llvm/string.ll
==============================================================================
--- /pypy/dist/pypy/translator/llvm/string.ll	Sat Apr 16 02:17:08 2005
+++ (empty file)
@@ -1,49 +0,0 @@
-internal uint %std.len(%std.string* %a) {
-	%p = getelementptr %std.string* %a, int 0, uint 0
-	%length1 = load uint* %p
-	ret uint %length1
-}
-
-internal %std.string* %std.make(uint %len, sbyte* %s) {
-	%ret = malloc %std.string, uint 1
-	%lenp = getelementptr %std.string* %ret, int 0, uint 0
-	%lsp = getelementptr %std.string* %ret, int 0, uint 1
-	store uint %len, uint* %lenp
-	store sbyte* %s, sbyte** %lsp
-	ret %std.string* %ret
-}
-
-
-internal %std.string* %std.add(%std.string* %a, %std.string* %b) {
-	%lena = call uint %std.len(%std.string* %a)
-	%lenb = call uint %std.len(%std.string* %b)
-	%totlen = add uint %lena, %lenb
-	%nmem1 = malloc sbyte, uint %totlen
-	%oldsp1 = getelementptr %std.string* %a, int 0, uint 1
-	%oldsp2 = getelementptr %std.string* %b, int 0, uint 1
-	%olds1 =  load sbyte** %oldsp1
-	%olds2 =  load sbyte** %oldsp2
-	%nposp = getelementptr sbyte* %nmem1, uint %lena
-	call void %llvm.memcpy(sbyte* %nmem1, sbyte* %olds1, uint %lena, uint 0)
-	call void %llvm.memcpy(sbyte* %nposp, sbyte* %olds2, uint %lenb, uint 0)
-	%ret = call %std.string* %std.make(uint %totlen, sbyte* %nmem1)
-	ret %std.string* %ret
-}
-
-
-internal sbyte %std.getitem(%std.string* %s, int %p) {
-	%sp1 = getelementptr %std.string* %s, int 0, uint 1
-	%s1 = load sbyte** %sp1
-	%len = call uint %std.len(%std.string* %s)
-	%ilen = cast uint %len to int
-	%negpos = add int %ilen, %p
-	%is_negative = setlt int %p, 0
-	%usedpos = select bool %is_negative, int %negpos, int %p
-	%negusedpos = setlt int %usedpos, 0
-	%posbig = setgt int %usedpos, %ilen
-	%wrongindex = or bool %negusedpos, %posbig
-	%charp = getelementptr sbyte* %s1, int %usedpos
-	%value = load sbyte* %charp
-	%ret = select bool %wrongindex, sbyte 33, sbyte %value
-	ret sbyte %value
-}

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	Sat Apr 16 02:17:08 2005
@@ -42,6 +42,23 @@
         return calling1(m - 1)
     return m
 
+def default_arguments(i1, i2=2, s1="asdf"):
+    return i1 + i2 + len(s1)
+
+def call_default_arguments(i, j):
+    if j == 0:
+        return default_arguments(i)
+    elif j == 1:
+        return default_arguments(i, 42)
+    return default_arguments(i, j, "qwertyuiop")
+
+def list_default_argument(i1, l1=[0]):
+    l1.append(i1)
+    return len(l1) + l1[-2]
+
+def call_list_default_argument(i1):
+    return list_default_argument(i1)
+
 #float snippets
 
 def float_f1(x):
@@ -126,6 +143,13 @@
     a = [0, 1, 2, 3]
     return a.pop() + len(a) + a[i]
 
+glob_array = [[i] * 5 for i in range(5)]
+
+def access_global_array(x, y, z):
+    result = glob_array[x][y]
+    glob_array[x][y] = z
+    return result
+
 
 #class snippets
 
@@ -266,6 +290,17 @@
         a = CLB()
     return a.a
 
+class CLC(object):
+    def __init__(self, a):
+        self.a = a
+
+def attribute_instance(x):
+    if x:
+        a = CLC(CLA())
+    else:
+        a = CLC(CLB())
+    return a.a.a
+
 
 #string snippets
 def string_f1(i):

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	Sat Apr 16 02:17:08 2005
@@ -117,6 +117,16 @@
         f = compile_function(llvmsnippet.calling1, [int])
         assert f(10) == 1
 
+    def test_call_default_arguments(self):
+        f = compile_function(llvmsnippet.call_default_arguments, [int, int])
+        for i in range(3):
+            assert f(i + 3, i) == llvmsnippet.call_default_arguments(i + 3, i)
+
+    def test_call_list_default_argument(self):
+        f = compile_function(llvmsnippet.call_list_default_argument, [int])
+        for i in range(20):
+            assert f(i) == llvmsnippet.call_list_default_argument(i)
+
 class TestFloat(object):
     def setup_method(self, method):
         if not llvm_found:
@@ -190,12 +200,22 @@
         for i in range(10):
             assert f(i) == i
 
-    def test_array_pop(i):
+    def test_array_pop(self):
         f = compile_function(llvmsnippet.array_pop, [int])
         assert f(0) == 5
         assert f(1) == 6
         assert f(2) == 7
 
+    def test_access_global_array(self):
+        f = compile_function(llvmsnippet.access_global_array, [int, int, int])
+        for i in range(5):
+            for j in range(5):
+                assert f(i, j, i + j) == i
+        for i in range(5):
+            for j in range(5):
+                assert f(i, j, 0) == i + j
+        
+
 class TestClass(object):
     def setup_method(self, method):
         if not llvm_found:
@@ -239,6 +259,11 @@
         assert f(True) == 1
         assert f(False) == 2
 
+    def test_attribute_instance(self):
+        f = compile_function(llvmsnippet.attribute_instance, [bool])
+        assert f(True) == 1
+        assert f(False) == 2
+
     def test_global_instance(self):
         f = compile_function(llvmsnippet.global_instance, [int])
         assert f(-1) == 41
@@ -378,6 +403,11 @@
         set_attr = compile_function(test.set_attr, [])
         assert set_attr() == 2
 
+    def test_try_raise_choose(self):
+        try_raise_choose = compile_function(test.try_raise_choose, [int])
+        for i in [-1, 0, 1, 2]:
+            assert try_raise_choose(i) == i
+
     def test_merge_setattr(self):
         merge_setattr = compile_function(test.merge_setattr, [bool])
         assert merge_setattr(1) == 1



More information about the Pypy-commit mailing list