[cffi-devel] CFFI:FOREIGN-ALLOC Problem
Volkan YAZICI
yazicivo at ttmail.com
Mon Sep 7 12:45:50 UTC 2009
Hi,
I use below macro to allocate foreign vectors.
(defmacro with-foreign-vectors ((&rest bindings) &body body)
"Convenient macro to create foreign vector bindings. `BINDIGS' are of `(NAME
TYPE INITIAL-CONTENTS)' format."
`(let* ,(loop with val = (gensym)
for (name type initial-contents) in bindings
collect `(,name
(let ((,val ,initial-contents))
; (let ((*print-length* 10))
; (format *trace-output* "~S => ~D ~S (~A)~%"
; ',name (when ,val (length ,val))
; ,val (find nil ,val)))
(foreign-alloc ,type
:count (length ,val)
:initial-contents ,val))))
(unwind-protect (progn , at body)
,@(mapcar
(lambda (name) `(foreign-free ,name))
(mapcar #'car bindings)))))
But while running the program, it throws below error message. (I
experience same situation in both SBCL and CCL.)
NALP> (compare-partitionings
"/home/vy/bilkent/projects/xml/t/xmark-1024-20091006-1314-small/"
"/home/vy/bilkent/projects/xml/t/xmark-1024-20091006-1314-small/sanitized-logs.out"
"/home/vy/bilkent/projects/xml/t/xmark-1024-20091006-1314-small/weights.out"
40 16 0.2)
N-PTR => 1 #(7536) (NIL)
XADJ-PTR => 7537 #(0 1 3 5 6 8 10 12 14 16 ...) (NIL)
ADJNCY-PTR => 8011 #(1 80 2 5666 3 4 2044 5 2292 6 ...) (NIL)
; Evaluation aborted.
; The value NIL is not of type (SIGNED-BYTE 32).
; [Condition of type TYPE-ERROR]
;
; Restarts:
; 0: [RETRY] Retry SLIME REPL evaluation request.
; 1: [ABORT] Return to SLIME's top level.
; 2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-thread" RUNNING {AA75079}>)
;
; Backtrace:
; 0: (CFFI-SYS:%MEM-SET NIL #.(SB-SYS:INT-SAP #X080C8850) :INT 16620)
; Locals:
; CFFI-SYS::OFFSET = 16620
; CFFI-SYS::PTR = #.(SB-SYS:INT-SAP #X080C8850)
; TYPE = :INT
; CFFI-SYS::VALUE = NIL
; 1: (FOREIGN-ALLOC :INT)[:EXTERNAL]
; Locals:
; SB-DEBUG::ARG-0 = 5
; SB-DEBUG::ARG-1 = :INT
; 2: (METIS-BIPARTITION-GRAPH-FFI #(0 1 3 5 6 8 ...) #(1 80 2 5666 3 4 ...) #(1 1 1 1 1 1 ...) #(20 7 13 1 19 20 ...) 0.2)
; Locals:
; SB-DEBUG::ARG-0 = #(0 1 3 5 6 8 ...)
; SB-DEBUG::ARG-1 = #(1 80 2 5666 3 4 ...)
; SB-DEBUG::ARG-2 = #(1 1 1 1 1 1 ...)
; SB-DEBUG::ARG-3 = #(20 7 13 1 19 20 ...)
; SB-DEBUG::ARG-4 = 0.2
When I look at the printed results, there doesn't appear any `NIL'
values in any of the `:INITIAL-CONTENTS' vectors. But error tells that
one of the `VALUE' arguments passed to `CFFI-SYS:%MEM-SET' is `NIL'.
Below are some of the detailed macroexpansions related to
`CFFI-SYS:%MEM-SET'.
(define-mem-accessors
(:char sb-sys:signed-sap-ref-8)
(:unsigned-char sb-sys:sap-ref-8)
(:short sb-sys:signed-sap-ref-16)
(:unsigned-short sb-sys:sap-ref-16)
(:int sb-sys:signed-sap-ref-32)
(:unsigned-int sb-sys:sap-ref-32)
(:long sb-sys:signed-sap-ref-word)
(:unsigned-long sb-sys:sap-ref-word)
(:long-long sb-sys:signed-sap-ref-64)
(:unsigned-long-long sb-sys:sap-ref-64)
(:float sb-sys:sap-ref-single)
(:double sb-sys:sap-ref-double)
(:pointer sb-sys:sap-ref-sap))
Which turns into below form if I macroexpand the `DEFINE-MEM-ACCESSORS'.
...
(DEFUN %MEM-SET (VALUE PTR TYPE &OPTIONAL (OFFSET 0))
(ECASE TYPE
(:CHAR (SETF (SB-SYS:SIGNED-SAP-REF-8 PTR OFFSET) VALUE))
(:UNSIGNED-CHAR (SETF (SB-SYS:SAP-REF-8 PTR OFFSET) VALUE))
(:SHORT (SETF (SB-SYS:SIGNED-SAP-REF-16 PTR OFFSET) VALUE))
(:UNSIGNED-SHORT (SETF (SB-SYS:SAP-REF-16 PTR OFFSET) VALUE))
(:INT (SETF (SB-SYS:SIGNED-SAP-REF-32 PTR OFFSET) VALUE))
(:UNSIGNED-INT (SETF (SB-SYS:SAP-REF-32 PTR OFFSET) VALUE))
(:LONG (SETF (SB-SYS:SIGNED-SAP-REF-WORD PTR OFFSET) VALUE))
(:UNSIGNED-LONG (SETF (SB-SYS:SAP-REF-WORD PTR OFFSET) VALUE))
(:LONG-LONG (SETF (SB-SYS:SIGNED-SAP-REF-64 PTR OFFSET) VALUE))
(:UNSIGNED-LONG-LONG (SETF (SB-SYS:SAP-REF-64 PTR OFFSET) VALUE))
(:FLOAT (SETF (SB-SYS:SAP-REF-SINGLE PTR OFFSET) VALUE))
(:DOUBLE (SETF (SB-SYS:SAP-REF-DOUBLE PTR OFFSET) VALUE))
(:POINTER (SETF (SB-SYS:SAP-REF-SAP PTR OFFSET) VALUE))))
...
To be honest, I need some urgent assistance. Any helps will be really
appreciated.
Regards.
More information about the cffi-devel
mailing list