[pypy-commit] cffi cffi-1.0: Killing OP_TYPENAME was a bad idea. Test and fix.

arigo noreply at buildbot.pypy.org
Thu Apr 16 10:32:02 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: cffi-1.0
Changeset: r1727:228423fdb5a5
Date: 2015-04-16 10:32 +0200
http://bitbucket.org/cffi/cffi/changeset/228423fdb5a5/

Log:	Killing OP_TYPENAME was a bad idea. Test and fix.

diff --git a/new/cffi_opcode.py b/new/cffi_opcode.py
--- a/new/cffi_opcode.py
+++ b/new/cffi_opcode.py
@@ -27,6 +27,7 @@
 OP_CPYTHON_BLTN_V  = 23   # varargs
 OP_CPYTHON_BLTN_N  = 25   # noargs
 OP_CPYTHON_BLTN_O  = 27   # O  (i.e. a single arg)
+OP_TYPENAME        = 29
 
 PRIM_VOID          = 0
 PRIM_BOOL          = 1
diff --git a/new/parse_c_type.c b/new/parse_c_type.c
--- a/new/parse_c_type.c
+++ b/new/parse_c_type.c
@@ -568,8 +568,7 @@
         {
             int n = search_in_typenames(tok->info->ctx, tok->p, tok->size);
             if (n >= 0) {
-                t1 = _CFFI_OP(_CFFI_OP_NOOP,
-                              tok->info->ctx->typenames[n].type_index);
+                t1 = _CFFI_OP(_CFFI_OP_TYPENAME, n);
                 break;
             }
             n = search_standard_typename(tok->p, tok->size);
diff --git a/new/parse_c_type.h b/new/parse_c_type.h
--- a/new/parse_c_type.h
+++ b/new/parse_c_type.h
@@ -21,6 +21,7 @@
 #define _CFFI_OP_CPYTHON_BLTN_V 23   // varargs
 #define _CFFI_OP_CPYTHON_BLTN_N 25   // noargs
 #define _CFFI_OP_CPYTHON_BLTN_O 27   // O  (i.e. a single arg)
+#define _CFFI_OP_TYPENAME       29
 
 #define _CFFI_PRIM_VOID          0
 #define _CFFI_PRIM_BOOL          1
diff --git a/new/realize_c_type.c b/new/realize_c_type.c
--- a/new/realize_c_type.c
+++ b/new/realize_c_type.c
@@ -190,6 +190,16 @@
         x = _realize_c_type_or_func(ctx, opcodes, _CFFI_GETARG(op));
         break;
 
+    case _CFFI_OP_TYPENAME:
+    {
+        /* essential: the TYPENAME opcode resolves the type index looked
+           up in the 'ctx->typenames' array, but it does so in 'ctx->types'
+           instead of in 'opcodes'! */
+        int type_index = ctx->typenames[_CFFI_GETARG(op)].type_index;
+        x = _realize_c_type_or_func(ctx, ctx->types, type_index);
+        break;
+    }
+
     default:
         PyErr_Format(PyExc_NotImplementedError, "op=%d", (int)_CFFI_GETOP(op));
         return NULL;
diff --git a/new/recompiler.py b/new/recompiler.py
--- a/new/recompiler.py
+++ b/new/recompiler.py
@@ -431,11 +431,15 @@
     outputfilename = ffiplatform.compile(tmpdir, ext)
     return outputfilename
 
-def verify(ffi, module_name, preamble, *args, **kwds):
+def verify2(ffi, module_name, preamble, *args, **kwds):
     import imp
     assert module_name not in sys.modules, "module name conflict: %r" % (
         module_name,)
     outputfilename = recompile(ffi, module_name, preamble, *args, **kwds)
     module = imp.load_dynamic(module_name, outputfilename)
-    ffi._verified(module.ffi)
-    return module.lib
+    return module.ffi, module.lib
+
+def verify(ffi, module_name, preamble, *args, **kwds):
+    ffi2, lib = verify2(ffi, module_name, preamble, *args, **kwds)
+    ffi._verified(ffi2)
+    return lib
diff --git a/new/test_parse_c_type.py b/new/test_parse_c_type.py
--- a/new/test_parse_c_type.py
+++ b/new/test_parse_c_type.py
@@ -93,6 +93,7 @@
 Func = make_getter('FUNCTION')
 FuncEnd = make_getter('FUNCTION_END')
 Struct = make_getter('STRUCT_UNION')
+Typename = make_getter('TYPENAME')
 
 
 def test_simple():
@@ -239,8 +240,8 @@
 
 def test_identifier():
     for i in range(len(identifier_names)):
-        assert parse("%s" % (identifier_names[i])) == ['->', NoOp(100 + i)]
-        assert parse("%s*" % (identifier_names[i])) == [NoOp(100 + i),
+        assert parse("%s" % (identifier_names[i])) == ['->', Typename(i)]
+        assert parse("%s*" % (identifier_names[i])) == [Typename(i),
                                                         '->', Pointer(0)]
 
 def test_cffi_opcode_sync():
diff --git a/new/test_recompiler.py b/new/test_recompiler.py
--- a/new/test_recompiler.py
+++ b/new/test_recompiler.py
@@ -1,5 +1,5 @@
 import py
-from recompiler import Recompiler, verify
+from recompiler import Recompiler, verify, verify2
 from cffi1 import FFI
 
 
@@ -79,7 +79,8 @@
 def test_verify_typedef():
     ffi = FFI()
     ffi.cdef("typedef int **foo_t;")
-    lib = verify(ffi, 'test_verify_typedef', 'typedef int **foo_t;')
+    ffi2, lib = verify2(ffi, 'test_verify_typedef', 'typedef int **foo_t;')
+    assert ffi2.sizeof("foo_t") == ffi.sizeof("void *")
 
 def test_global_var_int():
     ffi = FFI()


More information about the pypy-commit mailing list