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:]