File: system.py

package info (click to toggle)
pypy3 7.0.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 111,848 kB
  • sloc: python: 1,291,746; ansic: 74,281; asm: 5,187; cpp: 3,017; sh: 2,533; makefile: 544; xml: 243; lisp: 45; csh: 21; awk: 4
file content (140 lines) | stat: -rw-r--r-- 4,563 bytes parent folder | download | duplicates (2)
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
"""Information about the current system."""
import sys
import os

from pypy.objspace.std.complexobject import HASH_IMAG
from pypy.objspace.std.floatobject import HASH_INF, HASH_NAN
from pypy.objspace.std.intobject import HASH_MODULUS
from pypy.interpreter import gateway
from rpython.rlib import rbigint, rfloat
from rpython.rtyper.lltypesystem import lltype, rffi

PLATFORM = 'linux' if sys.platform.startswith('linux') else sys.platform

app = gateway.applevel("""
"NOT_RPYTHON"
from _structseq import structseqtype, structseqfield
class float_info(metaclass=structseqtype):

    max = structseqfield(0)
    max_exp = structseqfield(1)
    max_10_exp = structseqfield(2)
    min = structseqfield(3)
    min_exp = structseqfield(4)
    min_10_exp = structseqfield(5)
    dig = structseqfield(6)
    mant_dig = structseqfield(7)
    epsilon = structseqfield(8)
    radix = structseqfield(9)
    rounds = structseqfield(10)

class int_info(metaclass=structseqtype):
    bits_per_digit = structseqfield(0)
    sizeof_digit = structseqfield(1)

class hash_info(metaclass=structseqtype):
    width = structseqfield(0)
    modulus = structseqfield(1)
    inf = structseqfield(2)
    nan = structseqfield(3)
    imag = structseqfield(4)
    algorithm = structseqfield(5)
    hash_bits = structseqfield(6)
    seed_bits = structseqfield(7)
    cutoff = structseqfield(8)

class thread_info(metaclass=structseqtype):
    name = structseqfield(0)
    lock = structseqfield(1)
    version = structseqfield(2)
""")


def get_float_info(space):
    info_w = [
        space.newfloat(rfloat.DBL_MAX),
        space.newint(rfloat.DBL_MAX_EXP),
        space.newint(rfloat.DBL_MAX_10_EXP),
        space.newfloat(rfloat.DBL_MIN),
        space.newint(rfloat.DBL_MIN_EXP),
        space.newint(rfloat.DBL_MIN_10_EXP),
        space.newint(rfloat.DBL_DIG),
        space.newint(rfloat.DBL_MANT_DIG),
        space.newfloat(rfloat.DBL_EPSILON),
        space.newint(rfloat.FLT_RADIX),
        space.newint(rfloat.FLT_ROUNDS),
    ]
    w_float_info = app.wget(space, "float_info")
    return space.call_function(w_float_info, space.newtuple(info_w))

def get_int_info(space):
    bits_per_digit = rbigint.SHIFT
    sizeof_digit = rffi.sizeof(rbigint.STORE_TYPE)
    info_w = [
        space.newint(bits_per_digit),
        space.newint(sizeof_digit),
    ]
    w_int_info = app.wget(space, "int_info")
    return space.call_function(w_int_info, space.newtuple(info_w))

def get_hash_info(space):
    HASH_ALGORITHM = space.config.objspace.hash
    if space.config.objspace.hash == "fnv":
        HASH_HASH_BITS = 8 * rffi.sizeof(lltype.Signed)
        HASH_SEED_BITS = 0
        #   CPython has  ^ > 0  here, but the seed of "fnv" is of limited
        #   use, so we don't implement it
    elif space.config.objspace.hash == "siphash24":
        HASH_HASH_BITS = 64
        HASH_SEED_BITS = 128
    else:
        assert 0, "please add the parameters for this different hash function"

    HASH_WIDTH = 8 * rffi.sizeof(lltype.Signed)
    HASH_CUTOFF = 0
    info_w = [
        space.newint(HASH_WIDTH),
        space.newint(HASH_MODULUS),
        space.newint(HASH_INF),
        space.newint(HASH_NAN),
        space.newint(HASH_IMAG),
        space.newtext(HASH_ALGORITHM),
        space.newint(HASH_HASH_BITS),
        space.newint(HASH_SEED_BITS),
        space.newint(HASH_CUTOFF),
    ]
    w_hash_info = app.wget(space, "hash_info")
    return space.call_function(w_hash_info, space.newtuple(info_w))

def get_float_repr_style(space):
    return space.newtext("short")

def get_thread_info(space):
    if not space.config.objspace.usemodules.thread:
        return None
    from rpython.rlib import rthread
    w_version = space.w_None
    if rthread.RPYTHREAD_NAME == "pthread":
        w_lock = space.newtext("semaphore" if rthread.USE_SEMAPHORES
                               else "mutex+cond")
        if rthread.CS_GNU_LIBPTHREAD_VERSION is not None:
            try:
                name = os.confstr(rthread.CS_GNU_LIBPTHREAD_VERSION)
            except OSError:
                pass
            else:
                w_version = space.newtext(name)
    else:
        w_lock = space.w_None
    info_w = [
        space.newtext(rthread.RPYTHREAD_NAME),
        w_lock, w_version,
    ]
    w_thread_info = app.wget(space, "thread_info")
    return space.call_function(w_thread_info, space.newtuple(info_w))

def getdlopenflags(space):
    return space.newint(space.sys.dlopenflags)

def setdlopenflags(space, w_flags):
    space.sys.dlopenflags = space.int_w(w_flags)