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

Reply via email to