File: test_llop.py

package info (click to toggle)
pypy3 7.3.19%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 212,236 kB
  • sloc: python: 2,098,316; ansic: 540,565; sh: 21,462; asm: 14,419; cpp: 4,451; makefile: 4,209; objc: 761; xml: 530; exp: 499; javascript: 314; pascal: 244; lisp: 45; csh: 12; awk: 4
file content (72 lines) | stat: -rw-r--r-- 2,845 bytes parent folder | download | duplicates (7)
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
import py
import sys
import struct
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rtyper.test.test_llop import (BaseLLOpTest, str_gc_load,
                                           newlist_and_gc_store)
from rpython.jit.codewriter import longlong
from rpython.jit.metainterp.history import getkind
from rpython.jit.metainterp.test.support import LLJitMixin


class TestLLOp(BaseLLOpTest, LLJitMixin):

    # for the individual tests see
    # ====> ../../../rtyper/test/test_llop.py
    TEST_BLACKHOLE = True

    def gc_load_from_string(self, TYPE, buf, offset):
        def f(offset):
            return str_gc_load(TYPE, buf, offset)
        res = self.interp_operations(f, [offset], supports_singlefloats=True)
        #
        kind = getkind(TYPE)[0] # 'i' or 'f'
        self.check_operations_history({'gc_load_indexed_%s' % kind: 1,
                                       'finish': 1})
        #
        if TYPE == lltype.SingleFloat:
            # interp_operations returns the int version of r_singlefloat, but
            # our tests expects to receive an r_singlefloat: let's convert it
            # back!
            return longlong.int2singlefloat(res)
        return res

    def newlist_and_gc_store(self, TYPE, value, expected):
        def f(value):
            lst = newlist_and_gc_store(TYPE, value)
            got = ''.join(lst)
            if got != expected:
                # I'm not sure why, but if I use an assert, the test doesn't fail
                raise ValueError('got != expected')
            return len(got)
        #
        if self.TEST_BLACKHOLE:
            # we pass a big inline_threshold to ensure that
            # newlist_and_gc_store is inlined, else the blackhole does not see
            # (and thus we do not test!) the llop.gc_store_indexed
            threshold = 33
        else:
            threshold = 0
        return self.interp_operations(f, [value], supports_singlefloats=True,
                                      backendopt_inline_threshold=threshold)


    def test_force_virtual_str_storage(self):
        byteorder = sys.byteorder
        size = rffi.sizeof(lltype.Signed)
        def f(val):
            if byteorder == 'little':
                x = chr(val) + '\x00'*(size-1)
            else:
                x = '\x00'*(size-1) + chr(val)
            return str_gc_load(lltype.Signed, x, 0)
        res = self.interp_operations(f, [42], supports_singlefloats=True)
        assert res == 42
        self.check_operations_history({
            'newstr': 1,              # str forcing
            'strsetitem': 1,          # str forcing
            'call_pure_r': 1,         # str forcing (copystrcontent)
            'guard_no_exception': 1,  # str forcing
            'gc_load_indexed_i': 1,   # str_storage_getitem
            'finish': 1
            })