File: rnone.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 (84 lines) | stat: -rw-r--r-- 2,632 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
73
74
75
76
77
78
79
80
81
82
83
84
from rpython.flowspace.model import Constant
from rpython.annotator.model import SomeNone
from rpython.rtyper.rmodel import Repr, TyperError, inputconst
from rpython.rtyper.lltypesystem.lltype import Void, Bool, Ptr, Char
from rpython.rtyper.lltypesystem.llmemory import Address
from rpython.rtyper.rpbc import SmallFunctionSetPBCRepr
from rpython.rtyper.annlowlevel import llstr
from rpython.tool.pairtype import pairtype

class NoneRepr(Repr):
    lowleveltype = Void

    def rtype_bool(self, hop):
        return Constant(False, Bool)

    def none_call(self, hop):
        raise TyperError("attempt to call constant None")

    def ll_str(self, none):
        return llstr("None")

    def get_ll_eq_function(self):
        return None

    def get_ll_hash_function(self):
        return ll_none_hash

    get_ll_fasthash_function = get_ll_hash_function

    rtype_simple_call = none_call
    rtype_call_args = none_call

none_repr = NoneRepr()

class __extend__(SomeNone):
    def rtyper_makerepr(self, rtyper):
        return none_repr

    def rtyper_makekey(self):
        return self.__class__,

def ll_none_hash(_):
    return 0


class __extend__(pairtype(Repr, NoneRepr)):

    def convert_from_to((r_from, _), v, llops):
        return inputconst(Void, None)

    def rtype_is_((robj1, rnone2), hop):
        if hop.s_result.is_constant():
            return hop.inputconst(Bool, hop.s_result.const)
        return rtype_is_None(robj1, rnone2, hop)

class __extend__(pairtype(NoneRepr, Repr)):

    def convert_from_to((_, r_to), v, llops):
        return inputconst(r_to, None)

    def rtype_is_((rnone1, robj2), hop):
        if hop.s_result.is_constant():
            return hop.inputconst(Bool, hop.s_result.const)
        return rtype_is_None(robj2, rnone1, hop, pos=1)

def rtype_is_None(robj1, rnone2, hop, pos=0):
    if isinstance(robj1.lowleveltype, Ptr):
        v1 = hop.inputarg(robj1, pos)
        return hop.genop('ptr_iszero', [v1], resulttype=Bool)
    elif robj1.lowleveltype == Address:
        v1 = hop.inputarg(robj1, pos)
        cnull = hop.inputconst(Address, robj1.null_instance())
        return hop.genop('adr_eq', [v1, cnull], resulttype=Bool)
    elif robj1 == none_repr:
        return hop.inputconst(Bool, True)
    elif isinstance(robj1, SmallFunctionSetPBCRepr):
        if robj1.s_pbc.can_be_None:
            v1 = hop.inputarg(robj1, pos)
            return hop.genop('char_eq', [v1, inputconst(Char, '\000')],
                             resulttype=Bool)
        else:
            return inputconst(Bool, False)
    else:
        raise TyperError('rtype_is_None of %r' % (robj1))