File: version.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 (147 lines) | stat: -rw-r--r-- 4,776 bytes parent folder | download
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
141
142
143
144
145
146
147
"""
Version numbers exposed by PyPy through the 'sys' module.
"""

# Push imports into the functions so this can be imported by python3
# to fish out CPYTHON_VERSION

import os

#XXX # the release serial 42 is not in range(16)
CPYTHON_VERSION            = (3, 11, 11, "final", 0)
#XXX # sync CPYTHON_VERSION with patchlevel.h, package.py
CPYTHON_API_VERSION        = 1013   #XXX # sync with include/modsupport.h

# make sure to keep PYPY_VERSION in sync with:
#    module/cpyext/include/patchlevel.h
#    doc/conf.py
PYPY_VERSION               = (7, 3, 19, "final", 0)

import pypy
pypydir = pypy.pypydir
pypyroot = os.path.dirname(pypydir)
del pypy
from rpython.tool.version import get_repo_version_info

import time as t
gmtime = t.gmtime()
date = t.strftime("%b %d %Y", gmtime)
time = t.strftime("%H:%M:%S", gmtime)
del t

# ____________________________________________________________

def get_api_version(space):
    return space.newint(CPYTHON_API_VERSION)

def get_version_info(space):
    from pypy.interpreter import gateway
    app = gateway.applevel('''
    "NOT_RPYTHON"
    from _structseq import structseqtype, structseqfield
    class version_info(metaclass=structseqtype):
        __module__ = 'sys'
        name = 'sys.version_info'

        major        = structseqfield(0, "Major release number")
        minor        = structseqfield(1, "Minor release number")
        micro        = structseqfield(2, "Patch release number")
        releaselevel = structseqfield(3,
                           "'alpha', 'beta', 'candidate', or 'release'")
        serial       = structseqfield(4, "Serial release number")
    ''')

    w_version_info = app.wget(space, "version_info")
    # run at translation time
    return space.call_function(w_version_info, space.wrap(CPYTHON_VERSION))

def _make_version_template(PYPY_VERSION=PYPY_VERSION):
    ver = "%d.%d.%d" % (PYPY_VERSION[0], PYPY_VERSION[1], PYPY_VERSION[2])
    if PYPY_VERSION[3] != "final":
        ver = ver + "-%s%d" %(PYPY_VERSION[3], PYPY_VERSION[4])
    template = "%d.%d.%d (%s, %s, %s)\n[PyPy %s with %%s]" % (
        CPYTHON_VERSION[0],
        CPYTHON_VERSION[1],
        CPYTHON_VERSION[2],
        get_repo_version_info(root=pypyroot)[1],
        date,
        time,
        ver)
    assert template.count('%') == 1     # only for the "%s" near the end
    return template

_VERSION_TEMPLATE = _make_version_template()

def get_version(space):
    from rpython.rlib import compilerinfo
    return space.newtext(_VERSION_TEMPLATE % compilerinfo.get_compiler_info())

def get_winver(space):
    return space.newtext("%d.%d" % (
        CPYTHON_VERSION[0],
        CPYTHON_VERSION[1]))

def get_hexversion(space):
    return space.newint(tuple2hex(CPYTHON_VERSION))

def get_pypy_version_info(space):
    from pypy.interpreter import gateway
    app = gateway.applevel('''
    "NOT_RPYTHON"
    from _structseq import structseqtype, structseqfield
    class pypy_version_info(metaclass=structseqtype):
        __module__ = 'sys'
        name = 'sys.pypy_version_info'

        major        = structseqfield(0, "Major release number")
        minor        = structseqfield(1, "Minor release number")
        micro        = structseqfield(2, "Patch release number")
        releaselevel = structseqfield(3,
                           "'alpha', 'beta', 'candidate', or 'release'")
        serial       = structseqfield(4, "Serial release number")
    ''')

    ver = PYPY_VERSION
    w_pypy_version_info = app.wget(space, "pypy_version_info")
    # run at translation time
    return space.call_function(w_pypy_version_info, space.wrap(ver))

def get_subversion_info(space):
    # run at translation time
    return space.wrap(('PyPy', '', ''))

def get_repo_info(space):
    return space.wrap(('PyPy', '', ''))
    info = get_repo_version_info(root=pypyroot)
    if info:
        repo_tag, repo_version = info
        return space.newtuple([space.newtext('PyPy'),
                               space.newtext(repo_tag),
                               space.newtext(repo_version)])
    else:
        return space.w_None

def get_git_info(space):
    info = get_repo_version_info(root=pypyroot)
    if info:
        repo_tag, repo_version = info
        return space.newtuple([space.newtext('PyPy'),
                               space.newtext(repo_tag),
                               space.newtext(repo_version)])
    else:
        return space.w_None

def tuple2hex(ver):
    d = {'alpha':     0xA,
         'beta':      0xB,
         'candidate': 0xC,
         'final':     0xF,
         }
    subver = ver[4]
    if not (0 <= subver <= 9):
        subver = 0
    return (ver[0] << 24   |
            ver[1] << 16   |
            ver[2] << 8    |
            d[ver[3]] << 4 |
            subver)