[pypy-commit] pypy cffi-1.0: non-integer constants
arigo
noreply at buildbot.pypy.org
Fri May 8 10:25:08 CEST 2015
Author: Armin Rigo <arigo at tunes.org>
Branch: cffi-1.0
Changeset: r77198:4180e31602c9
Date: 2015-05-08 10:24 +0200
http://bitbucket.org/pypy/pypy/changeset/4180e31602c9/
Log: non-integer constants
diff --git a/pypy/module/_cffi_backend/lib_obj.py b/pypy/module/_cffi_backend/lib_obj.py
--- a/pypy/module/_cffi_backend/lib_obj.py
+++ b/pypy/module/_cffi_backend/lib_obj.py
@@ -1,5 +1,5 @@
from rpython.rlib import jit
-from rpython.rtyper.lltypesystem import rffi
+from rpython.rtyper.lltypesystem import lltype, rffi
from pypy.interpreter.error import oefmt
from pypy.interpreter.baseobjspace import W_Root
@@ -43,20 +43,16 @@
# A function: in the PyPy version, these are all equivalent
# and 'g->address' is a pointer to a function of exactly the
# C type specified
- type_index = getarg(g.c_type_op)
- opcodes = self.ctx.c_types
- w_ct = realize_c_type.realize_c_type_or_func(self.ffi, opcodes,
- type_index)
+ w_ct = realize_c_type.realize_c_type_or_func(
+ self.ffi, self.ctx.c_types, getarg(g.c_type_op))
w_ct = realize_c_type.unwrap_fn_as_fnptr(w_ct)
ptr = rffi.cast(rffi.CCHARP, g.c_address)
w_result = W_CData(space, ptr, w_ct)
#
elif op == cffi_opcode.OP_GLOBAL_VAR:
# A global variable of the exact type specified here
- type_index = getarg(g.c_type_op)
- opcodes = self.ctx.c_types
- w_ct = realize_c_type.realize_c_type(self.ffi, opcodes,
- type_index)
+ w_ct = realize_c_type.realize_c_type(
+ self.ffi, self.ctx.c_types, getarg(g.c_type_op))
g_size = rffi.getintfield(g, 'c_size')
if g_size != w_ct.size and g_size != 0 and w_ct.size > 0:
raise oefmt(self.ffi.w_FFIError,
@@ -72,6 +68,18 @@
# is obtained by calling the function at g->address
w_result = realize_c_type.realize_global_int(self.ffi, g)
#
+ elif op == cffi_opcode.OP_CONSTANT:
+ # A constant which is not of integer type
+ w_ct = realize_c_type.realize_c_type(
+ self.ffi, self.ctx.c_types, getarg(g.c_type_op))
+ fetch_funcptr = rffi.cast(
+ realize_c_type.FUNCPTR_FETCH_CHARP,
+ g.c_address)
+ assert w_ct.size > 0
+ with lltype.scoped_alloc(rffi.CCHARP.TO, w_ct.size) as ptr:
+ fetch_funcptr(ptr)
+ w_result = w_ct.convert_to_object(ptr)
+ #
else:
raise oefmt(space.w_NotImplementedError,
"in lib_build_attr: op=%d", op)
diff --git a/pypy/module/_cffi_backend/realize_c_type.py b/pypy/module/_cffi_backend/realize_c_type.py
--- a/pypy/module/_cffi_backend/realize_c_type.py
+++ b/pypy/module/_cffi_backend/realize_c_type.py
@@ -87,6 +87,7 @@
return newtype._new_array_type(ffi.space, w_ctitemptr, length)
+FUNCPTR_FETCH_CHARP = lltype.Ptr(lltype.FuncType([rffi.CCHARP], lltype.Void))
FUNCPTR_FETCH_LONGLONG = lltype.Ptr(lltype.FuncType([rffi.ULONGLONGP],
rffi.INT))
def realize_global_int(ffi, g):
More information about the pypy-commit
mailing list