File: test_slist.py

package info (click to toggle)
pypy 7.0.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 107,216 kB
  • sloc: python: 1,201,787; ansic: 62,419; asm: 5,169; cpp: 3,017; sh: 2,534; makefile: 545; xml: 243; lisp: 45; awk: 4
file content (99 lines) | stat: -rw-r--r-- 3,217 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import py
from rpython.jit.metainterp.test.support import LLJitMixin
from rpython.rlib.jit import JitDriver

class ListTests(object):

    def test_basic_list(self):
        myjitdriver = JitDriver(greens = [], reds = ['n', 'lst'])
        def f(n):
            lst = []
            while n > 0:
                myjitdriver.can_enter_jit(n=n, lst=lst)
                myjitdriver.jit_merge_point(n=n, lst=lst)
                lst.append(n)
                n -= len(lst)
            return len(lst)
        res = self.meta_interp(f, [42], listops=True)
        assert res == 9

    def test_list_operations(self):
        class FooBar:
            def __init__(self, z):
                self.z = z
        def f(n):
            lst = [41, 42]
            lst[0] = len(lst)     # [2, 42]
            lst.append(lst[1])    # [2, 42, 42]
            m = lst.pop()         # 42
            m += lst.pop(0)       # 44
            lst2 = [FooBar(3)]
            lst2.append(FooBar(5))
            m += lst2.pop().z     # 49
            return m
        res = self.interp_operations(f, [11], listops=True)
        assert res == 49
        self.check_operations_history(call_i=1, call_n=2)

    def test_list_of_voids(self):
        myjitdriver = JitDriver(greens = [], reds = ['n', 'lst'])
        def f(n):
            lst = [None]
            while n > 0:
                myjitdriver.can_enter_jit(n=n, lst=lst)
                myjitdriver.jit_merge_point(n=n, lst=lst)
                lst = [None, None]
                n -= 1
            return len(lst)
        res = self.meta_interp(f, [21], listops=True)
        assert res == 2

    def test_make_list(self):
        myjitdriver = JitDriver(greens = [], reds = ['n', 'lst'])
        def f(n):
            lst = None
            while n > 0:
                lst = [0] * 10
                myjitdriver.can_enter_jit(n=n, lst=lst)
                myjitdriver.jit_merge_point(n=n, lst=lst)
                n -= 1
            return lst[n]
        res = self.meta_interp(f, [21], listops=True, enable_opts='')
        assert res == 0

    def test_getitem(self):
        myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'lst'])
        def f(n):
            lst = []
            for i in range(n):
                lst.append(i)
            i = 0
            while n > 0:
                myjitdriver.can_enter_jit(n=n, lst=lst, i=i)
                myjitdriver.jit_merge_point(n=n, lst=lst, i=i)
                n -= lst[i]
                i += 1
            return lst[i]
        res = self.meta_interp(f, [21], listops=True)
        assert res == f(21)
        self.check_resops(call=0)

    def test_getitem_neg(self):
        myjitdriver = JitDriver(greens = [], reds = ['i', 'n'])
        def f(n):
            x = i = 0
            while i < 10:
                myjitdriver.can_enter_jit(n=n, i=i)
                myjitdriver.jit_merge_point(n=n, i=i)
                lst = [41]
                lst.append(42)
                x = lst[n]
                i += 1
            return x
        res = self.meta_interp(f, [-2], listops=True)
        assert res == 41
        self.check_resops(call=0, guard_value=0)


class TestLLtype(ListTests, LLJitMixin):
    pass