codekingpro/portable-devtools
115k
1from .error import VerificationError2 3class CffiOp(object):4 def __init__(self, op, arg):5 self.op = op6 self.arg = arg7 8 def as_c_expr(self):9 if self.op is None:10 assert isinstance(self.arg, str)11 return '(_cffi_opcode_t)(%s)' % (self.arg,)12 classname = CLASS_NAME[self.op]13 return '_CFFI_OP(_CFFI_OP_%s, %s)' % (classname, self.arg)14 15 def as_python_bytes(self):16 if self.op is None and self.arg.isdigit():17 value = int(self.arg) # non-negative: '-' not in self.arg18 if value >= 2**31:19 raise OverflowError("cannot emit %r: limited to 2**31-1"20 % (self.arg,))21 return format_four_bytes(value)22 if isinstance(self.arg, str):23 raise VerificationError("cannot emit to Python: %r" % (self.arg,))24 return format_four_bytes((self.arg << 8) | self.op)25 26 def __str__(self):27 classname = CLASS_NAME.get(self.op, self.op)28 return '(%s %s)' % (classname, self.arg)29 30def format_four_bytes(num):31 return '\\x%02X\\x%02X\\x%02X\\x%02X' % (32 (num >> 24) & 0xFF,33 (num >> 16) & 0xFF,34 (num >> 8) & 0xFF,35 (num ) & 0xFF)36 37OP_PRIMITIVE = 138OP_POINTER = 339OP_ARRAY = 540OP_OPEN_ARRAY = 741OP_STRUCT_UNION = 942OP_ENUM = 1143OP_FUNCTION = 1344OP_FUNCTION_END = 1545OP_NOOP = 1746OP_BITFIELD = 1947OP_TYPENAME = 2148OP_CPYTHON_BLTN_V = 23 # varargs49OP_CPYTHON_BLTN_N = 25 # noargs50OP_CPYTHON_BLTN_O = 27 # O (i.e. a single arg)51OP_CONSTANT = 2952OP_CONSTANT_INT = 3153OP_GLOBAL_VAR = 3354OP_DLOPEN_FUNC = 3555OP_DLOPEN_CONST = 3756OP_GLOBAL_VAR_F = 3957OP_EXTERN_PYTHON = 4158 59PRIM_VOID = 060PRIM_BOOL = 161PRIM_CHAR = 262PRIM_SCHAR = 363PRIM_UCHAR = 464PRIM_SHORT = 565PRIM_USHORT = 666PRIM_INT = 767PRIM_UINT = 868PRIM_LONG = 969PRIM_ULONG = 1070PRIM_LONGLONG = 1171PRIM_ULONGLONG = 1272PRIM_FLOAT = 1373PRIM_DOUBLE = 1474PRIM_LONGDOUBLE = 1575 76PRIM_WCHAR = 1677PRIM_INT8 = 1778PRIM_UINT8 = 1879PRIM_INT16 = 1980PRIM_UINT16 = 2081PRIM_INT32 = 2182PRIM_UINT32 = 2283PRIM_INT64 = 2384PRIM_UINT64 = 2485PRIM_INTPTR = 2586PRIM_UINTPTR = 2687PRIM_PTRDIFF = 2788PRIM_SIZE = 2889PRIM_SSIZE = 2990PRIM_INT_LEAST8 = 3091PRIM_UINT_LEAST8 = 3192PRIM_INT_LEAST16 = 3293PRIM_UINT_LEAST16 = 3394PRIM_INT_LEAST32 = 3495PRIM_UINT_LEAST32 = 3596PRIM_INT_LEAST64 = 3697PRIM_UINT_LEAST64 = 3798PRIM_INT_FAST8 = 3899PRIM_UINT_FAST8 = 39100PRIM_INT_FAST16 = 40101PRIM_UINT_FAST16 = 41102PRIM_INT_FAST32 = 42103PRIM_UINT_FAST32 = 43104PRIM_INT_FAST64 = 44105PRIM_UINT_FAST64 = 45106PRIM_INTMAX = 46107PRIM_UINTMAX = 47108PRIM_FLOATCOMPLEX = 48109PRIM_DOUBLECOMPLEX = 49110PRIM_CHAR16 = 50111PRIM_CHAR32 = 51112 113_NUM_PRIM = 52114_UNKNOWN_PRIM = -1115_UNKNOWN_FLOAT_PRIM = -2116_UNKNOWN_LONG_DOUBLE = -3117 118_IO_FILE_STRUCT = -1119 120PRIMITIVE_TO_INDEX = {121 'char': PRIM_CHAR,122 'short': PRIM_SHORT,123 'int': PRIM_INT,124 'long': PRIM_LONG,125 'long long': PRIM_LONGLONG,126 'signed char': PRIM_SCHAR,127 'unsigned char': PRIM_UCHAR,128 'unsigned short': PRIM_USHORT,129 'unsigned int': PRIM_UINT,130 'unsigned long': PRIM_ULONG,131 'unsigned long long': PRIM_ULONGLONG,132 'float': PRIM_FLOAT,133 'double': PRIM_DOUBLE,134 'long double': PRIM_LONGDOUBLE,135 '_cffi_float_complex_t': PRIM_FLOATCOMPLEX,136 '_cffi_double_complex_t': PRIM_DOUBLECOMPLEX,137 '_Bool': PRIM_BOOL,138 'wchar_t': PRIM_WCHAR,139 'char16_t': PRIM_CHAR16,140 'char32_t': PRIM_CHAR32,141 'int8_t': PRIM_INT8,142 'uint8_t': PRIM_UINT8,143 'int16_t': PRIM_INT16,144 'uint16_t': PRIM_UINT16,145 'int32_t': PRIM_INT32,146 'uint32_t': PRIM_UINT32,147 'int64_t': PRIM_INT64,148 'uint64_t': PRIM_UINT64,149 'intptr_t': PRIM_INTPTR,150 'uintptr_t': PRIM_UINTPTR,151 'ptrdiff_t': PRIM_PTRDIFF,152 'size_t': PRIM_SIZE,153 'ssize_t': PRIM_SSIZE,154 'int_least8_t': PRIM_INT_LEAST8,155 'uint_least8_t': PRIM_UINT_LEAST8,156 'int_least16_t': PRIM_INT_LEAST16,157 'uint_least16_t': PRIM_UINT_LEAST16,158 'int_least32_t': PRIM_INT_LEAST32,159 'uint_least32_t': PRIM_UINT_LEAST32,160 'int_least64_t': PRIM_INT_LEAST64,161 'uint_least64_t': PRIM_UINT_LEAST64,162 'int_fast8_t': PRIM_INT_FAST8,163 'uint_fast8_t': PRIM_UINT_FAST8,164 'int_fast16_t': PRIM_INT_FAST16,165 'uint_fast16_t': PRIM_UINT_FAST16,166 'int_fast32_t': PRIM_INT_FAST32,167 'uint_fast32_t': PRIM_UINT_FAST32,168 'int_fast64_t': PRIM_INT_FAST64,169 'uint_fast64_t': PRIM_UINT_FAST64,170 'intmax_t': PRIM_INTMAX,171 'uintmax_t': PRIM_UINTMAX,172 }173 174F_UNION = 0x01175F_CHECK_FIELDS = 0x02176F_PACKED = 0x04177F_EXTERNAL = 0x08178F_OPAQUE = 0x10179 180G_FLAGS = dict([('_CFFI_' + _key, globals()[_key])181 for _key in ['F_UNION', 'F_CHECK_FIELDS', 'F_PACKED',182 'F_EXTERNAL', 'F_OPAQUE']])183 184CLASS_NAME = {}185for _name, _value in list(globals().items()):186 if _name.startswith('OP_') and isinstance(_value, int):187 CLASS_NAME[_value] = _name[3:]188 