File: support.py

package info (click to toggle)
pypy 7.3.3%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 113,660 kB
  • sloc: python: 1,419,707; ansic: 64,313; cpp: 3,290; sh: 2,763; makefile: 540; xml: 256; asm: 213; lisp: 45; awk: 4
file content (36 lines) | stat: -rw-r--r-- 922 bytes parent folder | download | duplicates (5)
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
from rpython.rtyper.lltypesystem import llmemory
from rpython.rlib.rarithmetic import r_uint, intmask

def adr2int(addr):
    """
    Cast an address to an int.

    Returns an AddressAsInt object which can be cast back to an address.
    """
    return llmemory.cast_adr_to_int(addr, "symbolic")

def int2adr(int):
    """
    Cast an int back to an address.

    Inverse of adr2int().
    """
    return llmemory.cast_int_to_adr(int)

def ptr2int(ptr):
    """
    Cast a pointer to int.

    Returns an AddressAsInt object.
    """
    addr = llmemory.cast_ptr_to_adr(ptr)
    return llmemory.cast_adr_to_int(addr, "symbolic")
ptr2int._annspecialcase_ = 'specialize:arglltype(0)'

def int_signext(value, numbytes):
    b8 = numbytes * 8
    a = r_uint(value)
    a += r_uint(1 << (b8 - 1))     # a += 128
    a &= r_uint((1 << b8) - 1)     # a &= 255
    a -= r_uint(1 << (b8 - 1))     # a -= 128
    return intmask(a)