Happy new year!
On 64-bit Allegro, run
(cffi:defcfun strerror :string (errnum :int))
(strerror 1)
and you will probably get
Received signal number 4 (Illegal instruction)
[Condition of type EXCL:SYNCHRONOUS-OPERATING-SYSTEM-SIGNAL]
at least if the returned pointer is more than 32-bits.
The problem is that without this patch, cffi-allegro.lisp does not
support 64-bit pointers. Does the patch address the problem properly?
It seems to work for us.
The use of :unsigned-nat instead of :unsigned-long is recommended by
Franz because on Windows 64-bit :unsigned-long is still 32-bits.
--- a/addons/cffi_0.10.3/src/cffi-allegro.lisp
+++ b/addons/cffi_0.10.3/src/cffi-allegro.lisp
@@ -135,7 +135,7 @@ SIZE-VAR is supplied, it will be bound to SIZE during BODY."
;; stack allocation pattern
`(let ((,size-var ,size))
(declare (ignorable ,size-var))
- (ff:with-stack-fobject (,var '(:array :char ,size))
+ (ff:with-stack-fobject (,var '(:array :char ,size) :allocation :foreign-static-gc)
(let ((,var (ff:fslot-address ,var)))
;; (excl::stack-allocated-p var) => T
,@body))))
@@ -263,12 +263,12 @@ SIZE-VAR is supplied, it will be bound to SIZE during BODY."
:unsigned-long) 'integer)
(:float 'single-float)
(:double 'double-float)
- (:foreign-address :foreign-address)
+ (:foreign-address 'integer)
(:void 'null))))
(defun foreign-allegro-type (type)
(if (eq type :foreign-address)
- nil
+ :unsigned-nat
type))
(defun allegro-type-pair (type)