- ;; FIXME: GC safety alert! These SAPs are not safe, since the
- ;; Lisp string can move. This is not hard to arrange, for example
- ;; the following will fail very quickly on a SB-UNICODE build:
- ;;
- ;; (setf (bytes-consed-between-gcs) 4096)
- ;; (define-alien-routine "strcmp" int (s1 c-string) (s2 c-string))
- ;;
- ;; (loop
- ;; (let ((string "hello, world"))
- ;; (assert (zerop (strcmp string string)))))
- ;;
- ;; (This will appear to work on post-0.9.8.19 GENCGC, since
- ;; the GC no longer zeroes memory immediately after releasing
- ;; it after a minor GC. Either enabling the READ_PROTECT_FREE_PAGES
- ;; #define in gencgc.c or modifying the example so that a major
- ;; GC will occasionally be triggered would unmask the bug).
- ;;
- ;; The pure VECTOR-SAP branch for the SIMPLE-BASE-STRING case
- ;; will generally be very hard to trigger on GENCGC (even when
- ;; threaded) thanks to GC conservativeness. It's mostly a problem
- ;; on cheneygc. -- JES, 2006-01-13
+ (vector (vector-sap ,value))))
+
+(define-alien-type-method (c-string :deport-alloc-gen) (type value)
+ `(etypecase ,value
+ (null
+ ,(if (alien-c-string-type-not-null type)
+ `(null-error ',type)
+ nil))
+ ((alien (* char)) ,value)