Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r2127:4d3306c3afcc Date: 2015-05-28 21:01 +0200 http://bitbucket.org/cffi/cffi/changeset/4d3306c3afcc/
Log: Better compatibility: detect if we have an old cffi running a new ABI mode script that makes use of the new OP_CONSTANT feature --- now renamed to OP_DLOPEN_CONST. diff --git a/c/lib_obj.c b/c/lib_obj.c --- a/c/lib_obj.c +++ b/c/lib_obj.c @@ -250,6 +250,7 @@ } case _CFFI_OP_CONSTANT: + case _CFFI_OP_DLOPEN_CONST: { /* a constant which is not of integer type */ char *data; @@ -264,6 +265,7 @@ } if (g->address == NULL) { /* for dlopen() style */ + assert(_CFFI_GETOP(g->type_op) == _CFFI_OP_DLOPEN_CONST); data = cdlopen_fetch(lib->l_libname, lib->l_libhandle, s); if (data == NULL) return NULL; @@ -275,6 +277,7 @@ in a CFFI C extension module. CPython never unloads its C extension modules anyway. Note that we used to do alloca(), but see issue #198. */ + assert(_CFFI_GETOP(g->type_op) == _CFFI_OP_CONSTANT); data = PyMem_Malloc(ct->ct_size); if (data == NULL) { PyErr_NoMemory(); diff --git a/cffi/cffi_opcode.py b/cffi/cffi_opcode.py --- a/cffi/cffi_opcode.py +++ b/cffi/cffi_opcode.py @@ -52,6 +52,7 @@ OP_CONSTANT_INT = 31 OP_GLOBAL_VAR = 33 OP_DLOPEN_FUNC = 35 +OP_DLOPEN_CONST = 37 PRIM_VOID = 0 PRIM_BOOL = 1 diff --git a/cffi/parse_c_type.h b/cffi/parse_c_type.h --- a/cffi/parse_c_type.h +++ b/cffi/parse_c_type.h @@ -25,6 +25,7 @@ #define _CFFI_OP_CONSTANT_INT 31 #define _CFFI_OP_GLOBAL_VAR 33 #define _CFFI_OP_DLOPEN_FUNC 35 +#define _CFFI_OP_DLOPEN_CONST 37 #define _CFFI_PRIM_VOID 0 #define _CFFI_PRIM_BOOL 1 diff --git a/cffi/recompiler.py b/cffi/recompiler.py --- a/cffi/recompiler.py +++ b/cffi/recompiler.py @@ -982,8 +982,12 @@ raise ffiplatform.VerificationError( "constant '%s' is of type '%s', whose size is not known" % (name, tp._get_c_name())) + if self.target_is_python: + const_kind = OP_DLOPEN_CONST + else: + const_kind = OP_CONSTANT type_index = self._typesdict[tp] - type_op = CffiOp(OP_CONSTANT, type_index) + type_op = CffiOp(const_kind, type_index) self._lsts["global"].append( GlobalExpr(name, '_cffi_const_%s' % name, type_op)) diff --git a/testing/cffi1/test_dlopen.py b/testing/cffi1/test_dlopen.py --- a/testing/cffi1/test_dlopen.py +++ b/testing/cffi1/test_dlopen.py @@ -30,7 +30,7 @@ ffi = _cffi_backend.FFI('test_valid_global_constant', _version = 0x2601, _types = b'\x00\x00\x0D\x01\x00\x00\x09\x01', - _globals = (b'\x00\x00\x01\x1DBB',0,b'\x00\x00\x00\x1DBF',0), + _globals = (b'\x00\x00\x01\x25BB',0,b'\x00\x00\x00\x25BF',0), ) """ _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit