I have been playing a little with cells-gtk and have run into some problems between SBCL and CFFI.
I was using CFFI 0.9.2 but this triggers a package lock violation with SBCL 1.0.22 (on x86 linux) so I upgraded to the most recent CFFI version (0.10.4), but then cells-gtk stopped working. The error I get when trying to run a little simple demo is this: The value of STRING is #(71 85 73 32 68 101 109 111), which is not of type STRING. ultimately coming from a call to GTK-FFI:GTK-WINDOW-SET-TITLE with a string argument ("GUI Demo"). Presumably CFFI used to accept octet sequences as string arguments but doesn't anymore. Anyway, if I then disable the sbcl code specific code in 'lisp-to-utf-8' and 'utf-8-to-lisp' in "gtk-ffi/gtk-ffi-impl.lisp", then our little demo works again. I have attached the stack trace and a diff for the aforementioned disabling to illustrate what I have done. I am however unsure as to what the proper solution is. I suspect that code was invented for a reason, but it is unclear to me if those reasons remain valid in the face of the newer CFFI and what we may lose by disabling it. I should perhaps also mention that I am running with this in my .sbclrc: (setq sb-impl::*default-external-format* :latin-1) in case that makes a difference. ------------------------+----------------------------------------------------- Christian Lynbech | christian #\@ defun #\. dk ------------------------+----------------------------------------------------- Hit the philistines three times over the head with the Elisp reference manual. - peto...@hal.com (Michael A. Petonic)
The value of STRING is #(71 85 73 32 68 101 109 111), which is not of type STRING. [Condition of type SIMPLE-TYPE-ERROR] Restarts: 0: [STORE-VALUE] Supply a new value for STRING. 1: [RETRY] Retry SLIME REPL evaluation request. 2: [ABORT] Return to SLIME's top level. 3: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-thread" RUNNING {B044AE9}>) Backtrace: 0: (SB-KERNEL:CHECK-TYPE-ERROR STRING #(71 85 73 32 68 101 ...) STRING NIL) 1: (CFFI:FOREIGN-STRING-ALLOC #(71 85 73 32 68 101 ...))[:EXTERNAL] 2: (GTK-FFI::GTK_WINDOW_SET_TITLE #.(SB-SYS:INT-SAP #X080AA558) #(71 85 73 32 68 101 ...)) 3: (GTK-FFI:GTK-WINDOW-SET-TITLE #.(SB-SYS:INT-SAP #X080AA558) "GUI Demo") 4: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1. SB-PCL::.ARG2. SB-PCL::.ARG3. SB-PCL::.ARG4. SB-PCL::.ARG5.)) ..) 5: ((SB-PCL::FAST-METHOD CELLS:MD-AWAKEN (CELLS::MODEL-OBJECT)) #<unavailable argument> #<unavailable argument> TEST-GUI) 6: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0.)) #<unavailable argument> #<unavailable argument> TEST-GUI) 7: ((SB-PCL::FAST-METHOD CELLS:MD-AWAKEN :AROUND (CELLS::MODEL-OBJECT)) ..) 8: (CELLS::CALL-WITH-INTEGRITY :AWAKEN TEST-GUI #<CLOSURE (LAMBDA #) {ACC1515}> #<unavailable argument>) 9: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) ..) 10: ((SB-PCL::FAST-METHOD SHARED-INITIALIZE :AROUND (CELLS:MODEL T)) ..)[:EXTERNAL] 11: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) #<unused argument> #<unused argument> TEST-GUI -310034821 26) 12: ((SB-PCL::FAST-METHOD MAKE-INSTANCE (CLASS)) #<unavailable argument> #<unavailable argument> #<STANDARD-CLASS CL-MDM-GUI::TEST-GUI>)[:EXTERNAL] 13: (CELLS-GTK::SHOW-WIN CL-MDM-GUI::TEST-GUI)[:EXTERNAL] 14: (CELLS-GTK:START-APP CL-MDM-GUI::TEST-GUI)[:EXTERNAL] 15: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CL-MDM-GUI:GUI-DEMO) #<NULL-LEXENV>) --more--
Index: cl/cells-gtk3/gtk-ffi/gtk-ffi-impl.lisp =================================================================== --- cl/cells-gtk3/gtk-ffi/gtk-ffi-impl.lisp (revision 91) +++ cl/cells-gtk3/gtk-ffi/gtk-ffi-impl.lisp (working copy) @@ -18,13 +18,13 @@ ;;; (defun lisp-to-utf-8 (str) - #-(or clisp sbcl) (return-from lisp-to-utf-8 str) + #-(or clisp sbcl-not-really) (return-from lisp-to-utf-8 str) (when str #+clisp (ext:convert-string-to-bytes str charset:utf-8) - #+sbcl (sb-ext:string-to-octets str :external-format :utf-8))) + #+sbcl-not-really (sb-ext:string-to-octets str :external-format :utf-8))) (defun utf-8-to-lisp (str) - #-(or clisp sbcl) (return-from utf-8-to-lisp str) + #-(or clisp sbcl-not-really) (return-from utf-8-to-lisp str) (when str (let* ((nat (lisp-to-utf-8 str)) (oct (coerce (loop for i from 0 below (length nat) @@ -34,7 +34,7 @@ if (= b 195) do (incf i 2)) '(vector (unsigned-byte 8))))) #+clisp (ext:convert-string-from-bytes oct charset:utf-8) - #+sbcl (sb-ext:octets-to-string oct :external-format :utf-8)))) + #+sbcl-not-really (sb-ext:octets-to-string oct :external-format :utf-8))))
_______________________________________________ cells-gtk-devel site list cells-gtk-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/cells-gtk-devel