[cffi-devel] CFFI problem in Lispworks 5.1 32-bit with :long-long emulation
Chun Tian (binghe)
binghe.lisp at gmail.com
Wed Dec 23 21:04:08 UTC 2009
Hi, Luis
I think you should keep this change, because it really works.
Before this change, the IOlib project [1] cannot be compiled by 32-bit LispWorks, because some UNIX system calls are taken 64bit integers as arguments. Now with your change, IOlib can be compiled & loaded correctly on 32-bit LispWorks.
Regards,
Chun Tian (binghe)
> On Wed, Dec 23, 2009 at 4:07 AM, Matt Lamari <matt.lamari at gmail.com> wrote:
>>
>> Sorry for the late response.
>>
>> I don't have the code/opportunity to test all the cases; but wonder if
>> the enclosed patch - touching all the #+lispworks-64bit, is what's
>> really needed. . . ?
>
> Well, could you tell me whether my previous patch works for you and
> why you need this one?
>
>
>> I.e. every 64-bit replaced with (or lispworks5.1 lispworks-64bit)
>> or the like
>>
>>
>>
>>
>> Luís Oliveira wrote:
>>> On Thu, Nov 19, 2009 at 5:33 PM, Matt Lamari <matt.lamari at gmail.com> wrote:
>>>
>>>> (defcfun test :int64)
>>>>
>>> [...]
>>>
>>>> The long-long gets through and fails in the lispworks-specific "Ecase"
>>>> (that has them removed for non-64-bit lispworks).
>>>>
>>>
>>> Long-long emulation is not implemented for DEFCFUN, DEFCALLBACK, etc.
>>> It turns out that Lispworks does in fact support long-long on 32-bit
>>> platforms for DEFCFUN at least. Please let me know if the attached
>>> patch works for you.
>>>
>>>
>>
>>
>> --- cffi-lispworks.lisp 2009-06-16 11:20:08.000000000 -0500
>> +++ c:\t\cffi-lispworks.lisp 2009-12-22 22:04:10.350220400 -0600
>> @@ -62,7 +62,7 @@
>>
>> ;;;# Misfeatures
>>
>> -#-lispworks-64bit (pushnew 'no-long-long *features*)
>> +#-(or lispworks5.1 lispworks-64bit) (pushnew 'no-long-long *features*)
>>
>> ;;;# Symbol Case
>>
>> @@ -156,9 +156,9 @@
>> (:unsigned-int '(:unsigned :int))
>> (:long :long)
>> (:unsigned-long '(:unsigned :long))
>> - #+lispworks-64bit
>> + #+(or lispworks5.1 lispworks-64bit)
>> (:long-long '(:long :long))
>> - #+lispworks-64bit
>> + #+(or lispworks5.1 lispworks-64bit)
>> (:unsigned-long-long '(:unsigned :long :long))
>> (:float :float)
>> (:double :double)
>> @@ -170,10 +170,10 @@
>> #+#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or))
>> (defun convert-foreign-typed-aref-type (cffi-type)
>> (ecase cffi-type
>> - ((:char :short :int :long #+lispworks-64bit :long-long)
>> + ((:char :short :int :long #+(or lispworks5.1 lispworks-64bit) :long-long)
>> `(signed-byte ,(* 8 (%foreign-type-size cffi-type))))
>> ((:unsigned-char :unsigned-short :unsigned-int :unsigned-long
>> - #+lispworks-64bit :unsigned-long-long)
>> + #+(or lispworks5.1 lispworks-64bit) :unsigned-long-long)
>> `(unsigned-byte ,(* 8 (%foreign-type-size cffi-type))))
>> (:float 'single-float)
>> (:double 'double-float)))
>> @@ -186,7 +186,7 @@
>>
>> ;; Lispworks 5.0 on 64-bit platforms doesn't have [u]int64 support in
>> ;; FOREIGN-TYPED-AREF. That was implemented in 5.1.
>> -#+(and lispworks-64bit lispworks5.0)
>> +#+(and (or lispworks5.1 lispworks-64bit) lispworks5.0)
>> (defun 64-bit-type-p (type)
>> (member type '(:long :unsigned-long :long-long :unsigned-long-long)))
>>
>> @@ -196,7 +196,7 @@
>> (define-compiler-macro %mem-ref (&whole form ptr type &optional (off 0))
>> (if (constantp type)
>> (let ((type (eval type)))
>> - (if (or #+(and lispworks-64bit lispworks5.0) (64-bit-type-p type)
>> + (if (or #+(and (or lispworks5.1 lispworks-64bit) lispworks5.0) (64-bit-type-p type)
>> (eql type :pointer))
>> (let ((fli-type (convert-foreign-type type))
>> (ptr-form (if (eql off 0) ptr `(inc-pointer ,ptr ,off))))
>> @@ -230,7 +230,7 @@
>> (if (constantp type)
>> (once-only (val)
>> (let ((type (eval type)))
>> - (if (or #+(and lispworks-64bit lispworks5.0) (64-bit-type-p type)
>> + (if (or #+(and (or lispworks5.1 lispworks-64bit) lispworks5.0) (64-bit-type-p type)
>> (eql type :pointer))
>> (let ((fli-type (convert-foreign-type type))
>> (ptr-form (if (eql off 0) ptr `(inc-pointer ,ptr ,off))))
>>
>>
>
>
>
> --
> Luís Oliveira
> http://r42.eu/~luis/
>
> _______________________________________________
> cffi-devel mailing list
> cffi-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2603 bytes
Desc: not available
URL: <https://mailman.common-lisp.net/pipermail/cffi-devel/attachments/20091224/a82d44c6/attachment.bin>
More information about the cffi-devel
mailing list