github.com/whamcloud/lemur@v0.0.0-20190827193804-4655df8a52af/packaging/ci/lambda/GitPullS3/cffi/cffi_opcode.py (about) 1 2 class CffiOp(object): 3 def __init__(self, op, arg): 4 self.op = op 5 self.arg = arg 6 7 def as_c_expr(self): 8 if self.op is None: 9 assert isinstance(self.arg, str) 10 return '(_cffi_opcode_t)(%s)' % (self.arg,) 11 classname = CLASS_NAME[self.op] 12 return '_CFFI_OP(_CFFI_OP_%s, %s)' % (classname, self.arg) 13 14 def as_python_bytes(self): 15 if self.op is None and self.arg.isdigit(): 16 value = int(self.arg) # non-negative: '-' not in self.arg 17 if value >= 2**31: 18 raise OverflowError("cannot emit %r: limited to 2**31-1" 19 % (self.arg,)) 20 return format_four_bytes(value) 21 if isinstance(self.arg, str): 22 from .ffiplatform import VerificationError 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 30 def 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 37 OP_PRIMITIVE = 1 38 OP_POINTER = 3 39 OP_ARRAY = 5 40 OP_OPEN_ARRAY = 7 41 OP_STRUCT_UNION = 9 42 OP_ENUM = 11 43 OP_FUNCTION = 13 44 OP_FUNCTION_END = 15 45 OP_NOOP = 17 46 OP_BITFIELD = 19 47 OP_TYPENAME = 21 48 OP_CPYTHON_BLTN_V = 23 # varargs 49 OP_CPYTHON_BLTN_N = 25 # noargs 50 OP_CPYTHON_BLTN_O = 27 # O (i.e. a single arg) 51 OP_CONSTANT = 29 52 OP_CONSTANT_INT = 31 53 OP_GLOBAL_VAR = 33 54 OP_DLOPEN_FUNC = 35 55 OP_DLOPEN_CONST = 37 56 OP_GLOBAL_VAR_F = 39 57 OP_EXTERN_PYTHON = 41 58 59 PRIM_VOID = 0 60 PRIM_BOOL = 1 61 PRIM_CHAR = 2 62 PRIM_SCHAR = 3 63 PRIM_UCHAR = 4 64 PRIM_SHORT = 5 65 PRIM_USHORT = 6 66 PRIM_INT = 7 67 PRIM_UINT = 8 68 PRIM_LONG = 9 69 PRIM_ULONG = 10 70 PRIM_LONGLONG = 11 71 PRIM_ULONGLONG = 12 72 PRIM_FLOAT = 13 73 PRIM_DOUBLE = 14 74 PRIM_LONGDOUBLE = 15 75 76 PRIM_WCHAR = 16 77 PRIM_INT8 = 17 78 PRIM_UINT8 = 18 79 PRIM_INT16 = 19 80 PRIM_UINT16 = 20 81 PRIM_INT32 = 21 82 PRIM_UINT32 = 22 83 PRIM_INT64 = 23 84 PRIM_UINT64 = 24 85 PRIM_INTPTR = 25 86 PRIM_UINTPTR = 26 87 PRIM_PTRDIFF = 27 88 PRIM_SIZE = 28 89 PRIM_SSIZE = 29 90 PRIM_INT_LEAST8 = 30 91 PRIM_UINT_LEAST8 = 31 92 PRIM_INT_LEAST16 = 32 93 PRIM_UINT_LEAST16 = 33 94 PRIM_INT_LEAST32 = 34 95 PRIM_UINT_LEAST32 = 35 96 PRIM_INT_LEAST64 = 36 97 PRIM_UINT_LEAST64 = 37 98 PRIM_INT_FAST8 = 38 99 PRIM_UINT_FAST8 = 39 100 PRIM_INT_FAST16 = 40 101 PRIM_UINT_FAST16 = 41 102 PRIM_INT_FAST32 = 42 103 PRIM_UINT_FAST32 = 43 104 PRIM_INT_FAST64 = 44 105 PRIM_UINT_FAST64 = 45 106 PRIM_INTMAX = 46 107 PRIM_UINTMAX = 47 108 109 _NUM_PRIM = 48 110 _UNKNOWN_PRIM = -1 111 _UNKNOWN_FLOAT_PRIM = -2 112 _UNKNOWN_LONG_DOUBLE = -3 113 114 _IO_FILE_STRUCT = -1 115 116 PRIMITIVE_TO_INDEX = { 117 'char': PRIM_CHAR, 118 'short': PRIM_SHORT, 119 'int': PRIM_INT, 120 'long': PRIM_LONG, 121 'long long': PRIM_LONGLONG, 122 'signed char': PRIM_SCHAR, 123 'unsigned char': PRIM_UCHAR, 124 'unsigned short': PRIM_USHORT, 125 'unsigned int': PRIM_UINT, 126 'unsigned long': PRIM_ULONG, 127 'unsigned long long': PRIM_ULONGLONG, 128 'float': PRIM_FLOAT, 129 'double': PRIM_DOUBLE, 130 'long double': PRIM_LONGDOUBLE, 131 '_Bool': PRIM_BOOL, 132 'wchar_t': PRIM_WCHAR, 133 'int8_t': PRIM_INT8, 134 'uint8_t': PRIM_UINT8, 135 'int16_t': PRIM_INT16, 136 'uint16_t': PRIM_UINT16, 137 'int32_t': PRIM_INT32, 138 'uint32_t': PRIM_UINT32, 139 'int64_t': PRIM_INT64, 140 'uint64_t': PRIM_UINT64, 141 'intptr_t': PRIM_INTPTR, 142 'uintptr_t': PRIM_UINTPTR, 143 'ptrdiff_t': PRIM_PTRDIFF, 144 'size_t': PRIM_SIZE, 145 'ssize_t': PRIM_SSIZE, 146 'int_least8_t': PRIM_INT_LEAST8, 147 'uint_least8_t': PRIM_UINT_LEAST8, 148 'int_least16_t': PRIM_INT_LEAST16, 149 'uint_least16_t': PRIM_UINT_LEAST16, 150 'int_least32_t': PRIM_INT_LEAST32, 151 'uint_least32_t': PRIM_UINT_LEAST32, 152 'int_least64_t': PRIM_INT_LEAST64, 153 'uint_least64_t': PRIM_UINT_LEAST64, 154 'int_fast8_t': PRIM_INT_FAST8, 155 'uint_fast8_t': PRIM_UINT_FAST8, 156 'int_fast16_t': PRIM_INT_FAST16, 157 'uint_fast16_t': PRIM_UINT_FAST16, 158 'int_fast32_t': PRIM_INT_FAST32, 159 'uint_fast32_t': PRIM_UINT_FAST32, 160 'int_fast64_t': PRIM_INT_FAST64, 161 'uint_fast64_t': PRIM_UINT_FAST64, 162 'intmax_t': PRIM_INTMAX, 163 'uintmax_t': PRIM_UINTMAX, 164 } 165 166 F_UNION = 0x01 167 F_CHECK_FIELDS = 0x02 168 F_PACKED = 0x04 169 F_EXTERNAL = 0x08 170 F_OPAQUE = 0x10 171 172 G_FLAGS = dict([('_CFFI_' + _key, globals()[_key]) 173 for _key in ['F_UNION', 'F_CHECK_FIELDS', 'F_PACKED', 174 'F_EXTERNAL', 'F_OPAQUE']]) 175 176 CLASS_NAME = {} 177 for _name, _value in list(globals().items()): 178 if _name.startswith('OP_') and isinstance(_value, int): 179 CLASS_NAME[_value] = _name[3:]