Author: Maciej Fijalkowski <[email protected]>
Branch: virtual-arguments
Changeset: r56129:472a414c4207
Date: 2012-07-18 14:31 +0200
http://bitbucket.org/pypy/pypy/changeset/472a414c4207/
Log: hack differently - disallow negative multiplication of array
alltogether
diff --git a/pypy/annotation/binaryop.py b/pypy/annotation/binaryop.py
--- a/pypy/annotation/binaryop.py
+++ b/pypy/annotation/binaryop.py
@@ -614,6 +614,8 @@
class __extend__(pairtype(SomeList, SomeInteger)):
def mul((lst1, int2)):
+ if not int2.nonneg:
+ raise TypeError("in [item] * times, times must be proven
non-negative")
return lst1.listdef.offspring()
def getitem((lst1, int2)):
diff --git a/pypy/jit/codewriter/jtransform.py
b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -1430,8 +1430,6 @@
def do_fixed_newlist(self, op, args, arraydescr):
v_length = self._get_initial_newlist_length(op, args)
- if v_length.concretetype == lltype.Signed:
- raise Exception("[item] * lgt must have lgt to be proven
non-negative for the JIT")
return SpaceOperation('new_array', [arraydescr, v_length], op.result)
def do_fixed_list_len(self, op, args, arraydescr):
diff --git a/pypy/jit/codewriter/test/test_codewriter.py
b/pypy/jit/codewriter/test/test_codewriter.py
--- a/pypy/jit/codewriter/test/test_codewriter.py
+++ b/pypy/jit/codewriter/test/test_codewriter.py
@@ -221,14 +221,3 @@
assert 'setarrayitem_raw_i' in s
assert 'getarrayitem_raw_i' in s
assert 'residual_call_ir_v $<* fn _ll_1_raw_free__arrayPtr>' in s
-
-def test_newlist_negativ():
- def f(n):
- l = [0] * n
- return len(l)
-
- rtyper = support.annotate(f, [-1])
- jitdriver_sd = FakeJitDriverSD(rtyper.annotator.translator.graphs[0])
- cw = CodeWriter(FakeCPU(rtyper), [jitdriver_sd])
- cw.find_all_graphs(FakePolicy())
- py.test.raises(Exception, "cw.make_jitcodes(verbose=True)")
diff --git a/pypy/rpython/rlist.py b/pypy/rpython/rlist.py
--- a/pypy/rpython/rlist.py
+++ b/pypy/rpython/rlist.py
@@ -295,6 +295,8 @@
def rtype_mul((r_lst, r_int), hop):
cRESLIST = hop.inputconst(Void, hop.r_result.LIST)
v_lst, v_factor = hop.inputargs(r_lst, Signed)
+ if not hop.args_s[1].nonneg:
+ raise TypeError("in [item] * times, times must be proven
non-negative")
return hop.gendirectcall(ll_mul, cRESLIST, v_lst, v_factor)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit