Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r82683:bc2523a1a870
Date: 2016-03-03 19:09 +0100
http://bitbucket.org/pypy/pypy/changeset/bc2523a1a870/

Log:    merge heads

diff --git a/pypy/interpreter/test/test_app_main.py 
b/pypy/interpreter/test/test_app_main.py
--- a/pypy/interpreter/test/test_app_main.py
+++ b/pypy/interpreter/test/test_app_main.py
@@ -133,7 +133,7 @@
         self.check(['-S', '-tO', '--info'], {}, output_contains='translation')
         self.check(['-S', '-tO', '--version'], {}, output_contains='Python')
         self.check(['-S', '-tOV'], {}, output_contains='Python')
-        self.check(['--jit', 'foobar', '-S'], {}, sys_argv=[''],
+        self.check(['--jit', 'off', '-S'], {}, sys_argv=[''],
                    run_stdin=True, no_site=1)
         self.check(['-c', 'pass'], {}, sys_argv=['-c'], run_command='pass')
         self.check(['-cpass'], {}, sys_argv=['-c'], run_command='pass')
diff --git a/pypy/objspace/std/test/test_kwargsdict.py 
b/pypy/objspace/std/test/test_kwargsdict.py
--- a/pypy/objspace/std/test/test_kwargsdict.py
+++ b/pypy/objspace/std/test/test_kwargsdict.py
@@ -118,10 +118,16 @@
     def test_delitem(self):
         pass # delitem devolves for now
 
+    def test_setdefault_fast(self):
+        pass # not based on hashing at all
+
 class TestDevolvedKwargsDictImplementation(BaseTestDevolvedDictImplementation):
     get_impl = get_impl
     StrategyClass = KwargsDictStrategy
 
+    def test_setdefault_fast(self):
+        pass # not based on hashing at all
+
 
 class AppTestKwargsDictStrategy(object):
     def setup_class(cls):
diff --git a/rpython/rtyper/test/test_rdict.py 
b/rpython/rtyper/test/test_rdict.py
--- a/rpython/rtyper/test/test_rdict.py
+++ b/rpython/rtyper/test/test_rdict.py
@@ -59,19 +59,6 @@
         yield
 
 
-def not_really_random():
-    """A random-ish generator, which also generates nice patterns from time to 
time.
-    Could be useful to detect problems associated with specific usage 
patterns."""
-    import random
-    x = random.random()
-    print 'random seed: %r' % (x,)
-    for i in range(12000):
-        r = 3.4 + i/20000.0
-        x = r*x - x*x
-        assert 0 <= x < 4
-        yield x
-
-
 class BaseTestRDict(BaseRtypingTest):
     def test_dict_creation(self):
         def createdict(i):
@@ -1048,7 +1035,7 @@
         s_BA_dic = s.items[1]
 
         r_AB_dic = rtyper.getrepr(s_AB_dic)
-        r_BA_dic = rtyper.getrepr(s_AB_dic)
+        r_BA_dic = rtyper.getrepr(s_BA_dic)
 
         assert r_AB_dic.lowleveltype == r_BA_dic.lowleveltype
 
@@ -1166,50 +1153,51 @@
 st_keys = sampled_from(keytypes_s)
 st_values = sampled_from(keytypes_s + [SomeString(can_be_None=True)])
 
-class Space(object):
+class MappingSpace(object):
     def __init__(self, s_key, s_value):
         self.s_key = s_key
         self.s_value = s_value
         rtyper = PseudoRTyper()
         r_key = s_key.rtyper_makerepr(rtyper)
         r_value = s_value.rtyper_makerepr(rtyper)
-        dictrepr = rdict.DictRepr(rtyper, r_key, r_value,
+        dictrepr = self.MappingRepr(rtyper, r_key, r_value,
                         DictKey(None, s_key),
                         DictValue(None, s_value))
         dictrepr.setup()
-        self.l_dict = rdict.ll_newdict(dictrepr.DICT)
-        self.reference = {}
+        self.l_dict = self.newdict(dictrepr)
+        self.reference = self.new_reference()
         self.ll_key = r_key.convert_const
         self.ll_value = r_value.convert_const
 
     def setitem(self, key, value):
         ll_key = self.ll_key(key)
         ll_value = self.ll_value(value)
-        rdict.ll_dict_setitem(self.l_dict, ll_key, ll_value)
+        self.ll_setitem(self.l_dict, ll_key, ll_value)
         self.reference[key] = value
-        assert rdict.ll_contains(self.l_dict, ll_key)
+        assert self.ll_contains(self.l_dict, ll_key)
 
     def delitem(self, key):
         ll_key = self.ll_key(key)
-        rdict.ll_dict_delitem(self.l_dict, ll_key)
+        self.ll_delitem(self.l_dict, ll_key)
         del self.reference[key]
-        assert not rdict.ll_contains(self.l_dict, ll_key)
+        assert not self.ll_contains(self.l_dict, ll_key)
 
     def copydict(self):
-        self.l_dict = rdict.ll_copy(self.l_dict)
+        self.l_dict = self.ll_copy(self.l_dict)
+        assert self.ll_len(self.l_dict) == len(self.reference)
 
     def cleardict(self):
-        rdict.ll_clear(self.l_dict)
+        self.ll_clear(self.l_dict)
         self.reference.clear()
-        assert rdict.ll_dict_len(self.l_dict) == 0
+        assert self.ll_len(self.l_dict) == 0
 
     def fullcheck(self):
-        assert rdict.ll_dict_len(self.l_dict) == len(self.reference)
+        assert self.ll_len(self.l_dict) == len(self.reference)
         for key, value in self.reference.iteritems():
-            assert (rdict.ll_dict_getitem(self.l_dict, self.ll_key(key)) ==
+            assert (self.ll_getitem(self.l_dict, self.ll_key(key)) ==
                 self.ll_value(value))
 
-class StressTest(GenericStateMachine):
+class MappingSM(GenericStateMachine):
     def __init__(self):
         self.space = None
 
@@ -1239,7 +1227,7 @@
 
     def execute_step(self, action):
         if action.method == 'setup':
-            self.space = Space(*action.args)
+            self.space = self.Space(*action.args)
             self.st_keys = ann2strategy(self.space.s_key)
             self.st_values = ann2strategy(self.space.s_value)
             return
@@ -1250,5 +1238,24 @@
         if self.space:
             self.space.fullcheck()
 
+
+class DictSpace(MappingSpace):
+    MappingRepr = rdict.DictRepr
+    new_reference = dict
+    ll_getitem = staticmethod(rdict.ll_dict_getitem)
+    ll_setitem = staticmethod(rdict.ll_dict_setitem)
+    ll_delitem = staticmethod(rdict.ll_dict_delitem)
+    ll_len = staticmethod(rdict.ll_dict_len)
+    ll_contains = staticmethod(rdict.ll_contains)
+    ll_copy = staticmethod(rdict.ll_copy)
+    ll_clear = staticmethod(rdict.ll_clear)
+
+    def newdict(self, repr):
+        return rdict.ll_newdict(repr.DICT)
+
+class DictSM(MappingSM):
+    Space = DictSpace
+
 def test_hypothesis():
-    run_state_machine_as_test(StressTest, settings(max_examples=500, 
stateful_step_count=100))
+    run_state_machine_as_test(
+        DictSM, settings(max_examples=500, stateful_step_count=100))
diff --git a/rpython/rtyper/test/test_rordereddict.py 
b/rpython/rtyper/test/test_rordereddict.py
--- a/rpython/rtyper/test/test_rordereddict.py
+++ b/rpython/rtyper/test/test_rordereddict.py
@@ -1,14 +1,18 @@
-
 import py
 from collections import OrderedDict
 
+from hypothesis import settings
+from hypothesis.stateful import run_state_machine_as_test
+
 from rpython.rtyper.lltypesystem import lltype, rffi
 from rpython.rtyper.lltypesystem import rordereddict, rstr
 from rpython.rlib.rarithmetic import intmask
 from rpython.rtyper.annlowlevel import llstr, hlstr
-from rpython.rtyper.test.test_rdict import BaseTestRDict
+from rpython.rtyper.test.test_rdict import (
+    BaseTestRDict, MappingSpace, MappingSM)
 from rpython.rlib import objectmodel
 
+rodct = rordereddict
 
 def get_indexes(ll_d):
     return ll_d.indexes._obj.container._as_ptr()
@@ -330,124 +334,48 @@
         assert res == 6
 
 
-class TestStress:
+class ODictSpace(MappingSpace):
+    MappingRepr = rodct.OrderedDictRepr
+    new_reference = OrderedDict
+    ll_getitem = staticmethod(rodct.ll_dict_getitem)
+    ll_setitem = staticmethod(rodct.ll_dict_setitem)
+    ll_delitem = staticmethod(rodct.ll_dict_delitem)
+    ll_len = staticmethod(rodct.ll_dict_len)
+    ll_contains = staticmethod(rodct.ll_dict_contains)
+    ll_copy = staticmethod(rodct.ll_dict_copy)
+    ll_clear = staticmethod(rodct.ll_dict_clear)
 
-    def test_stress(self):
-        from rpython.annotator.dictdef import DictKey, DictValue
-        from rpython.annotator import model as annmodel
-        from rpython.rtyper import rint
-        from rpython.rtyper.test.test_rdict import not_really_random
-        rodct = rordereddict
-        dictrepr = rodct.OrderedDictRepr(
-                                  None, rint.signed_repr, rint.signed_repr,
-                                  DictKey(None, annmodel.SomeInteger()),
-                                  DictValue(None, annmodel.SomeInteger()))
-        dictrepr.setup()
-        l_dict = rodct.ll_newdict(dictrepr.DICT)
-        referencetable = [None] * 400
-        referencelength = 0
-        value = 0
+    def newdict(self, repr):
+        return rodct.ll_newdict(repr.DICT)
 
-        def complete_check():
-            for n, refvalue in zip(range(len(referencetable)), referencetable):
-                try:
-                    gotvalue = rodct.ll_dict_getitem(l_dict, n)
-                except KeyError:
-                    assert refvalue is None
-                else:
-                    assert gotvalue == refvalue
+    def get_keys(self):
+        DICT = lltype.typeOf(self.l_dict).TO
+        ITER = rordereddict.get_ll_dictiter(lltype.Ptr(DICT))
+        ll_iter = rordereddict.ll_dictiter(ITER, self.l_dict)
+        ll_dictnext = rordereddict._ll_dictnext
+        keys_ll = []
+        while True:
+            try:
+                num = ll_dictnext(ll_iter)
+                keys_ll.append(self.l_dict.entries[num].key)
+            except StopIteration:
+                break
+        return keys_ll
 
-        for x in not_really_random():
-            n = int(x*100.0)    # 0 <= x < 400
-            op = repr(x)[-1]
-            if op <= '2' and referencetable[n] is not None:
-                rodct.ll_dict_delitem(l_dict, n)
-                referencetable[n] = None
-                referencelength -= 1
-            elif op <= '6':
-                rodct.ll_dict_setitem(l_dict, n, value)
-                if referencetable[n] is None:
-                    referencelength += 1
-                referencetable[n] = value
-                value += 1
-            else:
-                try:
-                    gotvalue = rodct.ll_dict_getitem(l_dict, n)
-                except KeyError:
-                    assert referencetable[n] is None
-                else:
-                    assert gotvalue == referencetable[n]
-            if 1.38 <= x <= 1.39:
-                complete_check()
-                print 'current dict length:', referencelength
-            assert l_dict.num_live_items == referencelength
-        complete_check()
+    def fullcheck(self):
+        # overridden to also check key order
+        assert self.ll_len(self.l_dict) == len(self.reference)
+        keys_ll = self.get_keys()
+        assert len(keys_ll) == len(self.reference)
+        for key, ll_key in zip(self.reference, keys_ll):
+            assert self.ll_key(key) == ll_key
+            assert (self.ll_getitem(self.l_dict, self.ll_key(key)) ==
+                self.ll_value(self.reference[key]))
 
-    def test_stress_2(self):
-        yield self.stress_combination, True,  False
-        yield self.stress_combination, False, True
-        yield self.stress_combination, False, False
-        yield self.stress_combination, True,  True
 
-    def stress_combination(self, key_can_be_none, value_can_be_none):
-        from rpython.rtyper.lltypesystem.rstr import string_repr
-        from rpython.annotator.dictdef import DictKey, DictValue
-        from rpython.annotator import model as annmodel
-        from rpython.rtyper.test.test_rdict import not_really_random
-        rodct = rordereddict
+class ODictSM(MappingSM):
+    Space = ODictSpace
 
-        print
-        print "Testing combination with can_be_None: keys %s, values %s" % (
-            key_can_be_none, value_can_be_none)
-
-        class PseudoRTyper:
-            cache_dummy_values = {}
-        dictrepr = rodct.OrderedDictRepr(
-                       PseudoRTyper(), string_repr, string_repr,
-                       DictKey(None, annmodel.SomeString(key_can_be_none)),
-                       DictValue(None, annmodel.SomeString(value_can_be_none)))
-        dictrepr.setup()
-        print dictrepr.lowleveltype
-        #for key, value in dictrepr.DICTENTRY._adtmeths.items():
-        #    print '    %s = %s' % (key, value)
-        l_dict = rodct.ll_newdict(dictrepr.DICT)
-        referencetable = [None] * 400
-        referencelength = 0
-        values = not_really_random()
-        keytable = [string_repr.convert_const("foo%d" % n)
-                    for n in range(len(referencetable))]
-
-        def complete_check():
-            for n, refvalue in zip(range(len(referencetable)), referencetable):
-                try:
-                    gotvalue = rodct.ll_dict_getitem(l_dict, keytable[n])
-                except KeyError:
-                    assert refvalue is None
-                else:
-                    assert gotvalue == refvalue
-
-        for x in not_really_random():
-            n = int(x*100.0)    # 0 <= x < 400
-            op = repr(x)[-1]
-            if op <= '2' and referencetable[n] is not None:
-                rodct.ll_dict_delitem(l_dict, keytable[n])
-                referencetable[n] = None
-                referencelength -= 1
-            elif op <= '6':
-                ll_value = string_repr.convert_const(str(values.next()))
-                rodct.ll_dict_setitem(l_dict, keytable[n], ll_value)
-                if referencetable[n] is None:
-                    referencelength += 1
-                referencetable[n] = ll_value
-            else:
-                try:
-                    gotvalue = rodct.ll_dict_getitem(l_dict, keytable[n])
-                except KeyError:
-                    assert referencetable[n] is None
-                else:
-                    assert gotvalue == referencetable[n]
-            if 1.38 <= x <= 1.39:
-                complete_check()
-                print 'current dict length:', referencelength
-            assert l_dict.num_live_items == referencelength
-        complete_check()
+def test_hypothesis():
+    run_state_machine_as_test(
+        ODictSM, settings(max_examples=500, stateful_step_count=100))
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to