Author: Antonio Cuni <[email protected]>
Branch: ffistruct
Changeset: r55120:cd0a99a4c058
Date: 2012-05-17 09:26 +0200
http://bitbucket.org/pypy/pypy/changeset/cd0a99a4c058/
Log: merge heads
diff --git a/pypy/jit/metainterp/optimizeopt/fficall.py
b/pypy/jit/metainterp/optimizeopt/fficall.py
--- a/pypy/jit/metainterp/optimizeopt/fficall.py
+++ b/pypy/jit/metainterp/optimizeopt/fficall.py
@@ -9,13 +9,7 @@
from pypy.rpython.annlowlevel import cast_base_ptr_to_instance
from pypy.rpython.lltypesystem import lltype, llmemory, rffi
from pypy.rlib.objectmodel import we_are_translated
-from pypy.rlib.libffi import Func
-from pypy.rlib.debug import debug_print
-from pypy.rlib import libffi, clibffi
-from pypy.jit.codewriter.effectinfo import EffectInfo
-from pypy.jit.metainterp.resoperation import rop, ResOperation
-from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from pypy.jit.metainterp.optimizeopt.optimizer import Optimization
+from pypy.rlib.rarithmetic import intmask
class FuncInfo(object):
@@ -242,7 +236,7 @@
else:
assert False, "unsupported ffitype or kind"
#
- fieldsize = ffitype.c_size
+ fieldsize = intmask(ffitype.c_size)
return self.optimizer.cpu.fielddescrof_dynamic(offset, fieldsize,
is_pointer, is_float,
is_signed)
diff --git a/pypy/module/_ffi/interp_struct.py
b/pypy/module/_ffi/interp_struct.py
--- a/pypy/module/_ffi/interp_struct.py
+++ b/pypy/module/_ffi/interp_struct.py
@@ -230,12 +230,14 @@
get_pointer = get_unsigned
def get_char(self, w_ffitype):
- return libffi.struct_getfield_int(w_ffitype.get_ffitype(),
- self.rawmem, self.offset)
+ intval = libffi.struct_getfield_int(w_ffitype.get_ffitype(),
+ self.rawmem, self.offset)
+ return rffi.cast(rffi.UCHAR, intval)
def get_unichar(self, w_ffitype):
- return libffi.struct_getfield_int(w_ffitype.get_ffitype(),
- self.rawmem, self.offset)
+ intval = libffi.struct_getfield_int(w_ffitype.get_ffitype(),
+ self.rawmem, self.offset)
+ return rffi.cast(rffi.WCHAR_T, intval)
def get_float(self, w_ffitype):
return libffi.struct_getfield_float(w_ffitype.get_ffitype(),
@@ -247,7 +249,8 @@
def get_struct(self, w_ffitype, w_structdescr):
assert isinstance(w_structdescr, W__StructDescr)
- innermem = rffi.ptradd(self.rawmem, self.offset)
+ rawmem = rffi.cast(rffi.CCHARP, self.rawmem)
+ innermem = rffi.cast(rffi.VOIDP, rffi.ptradd(rawmem, self.offset))
# we return a reference to the inner struct, not a copy
# autofree=False because it's still owned by the parent struct
return W__StructInstance(w_structdescr, allocate=False, autofree=False,
@@ -293,7 +296,8 @@
self.rawmem, self.offset,
singlefloatval)
def handle_struct(self, w_ffitype, w_structinstance):
- dst = rffi.ptradd(self.rawmem, self.offset)
+ rawmem = rffi.cast(rffi.CCHARP, self.rawmem)
+ dst = rffi.cast(rffi.VOIDP, rffi.ptradd(rawmem, self.offset))
src = w_structinstance.rawmem
length = w_ffitype.sizeof()
rffi.c_memcpy(dst, src, length)
diff --git a/pypy/module/_ffi/type_converter.py
b/pypy/module/_ffi/type_converter.py
--- a/pypy/module/_ffi/type_converter.py
+++ b/pypy/module/_ffi/type_converter.py
@@ -89,6 +89,7 @@
unicodeval = self.space.unicode_w(w_obj)
self.handle_unichar_p(w_ffitype, w_obj, unicodeval)
return True
+ return False
def convert_pointer_arg_maybe(self, w_arg, w_argtype):
"""
diff --git a/pypy/rlib/clibffi.py b/pypy/rlib/clibffi.py
--- a/pypy/rlib/clibffi.py
+++ b/pypy/rlib/clibffi.py
@@ -11,6 +11,7 @@
from pypy.rlib.rdynload import dlopen, dlclose, dlsym, dlsym_byordinal
from pypy.rlib.rdynload import DLOpenError, DLLHANDLE
from pypy.rlib import jit
+from pypy.rlib.objectmodel import specialize
from pypy.tool.autopath import pypydir
from pypy.translator.tool.cbuild import ExternalCompilationInfo
from pypy.translator.platform import platform
@@ -347,6 +348,7 @@
('ffistruct', FFI_TYPE_P.TO),
('members', lltype.Array(FFI_TYPE_P))))
[email protected](3)
def make_struct_ffitype_e(size, aligment, field_types, track_allocation=True):
"""Compute the type of a structure. Returns a FFI_STRUCT_P out of
which the 'ffistruct' member is a regular FFI_TYPE.
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit