[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