0.9.1.2:
[sbcl.git] / src / code / host-alieneval.lisp
index bc0100b..9c343d5 100644 (file)
 (define-alien-type-class (enum :include (integer (bits 32))
                               :include-args (signed))
   name         ; name of this enum (if any)
-  from         ; alist from keywords to integers
-  to           ; alist or vector from integers to keywords
+  from         ; alist from symbols to integers
+  to           ; alist or vector from integers to symbols
   kind         ; kind of from mapping, :VECTOR or :ALIST
   offset)      ; offset to add to value for :VECTOR from mapping
 
              (values (first el) (second el))
              (values el (1+ prev)))
        (setf prev val)
-       (unless (keywordp sym)
-         (error "The enumeration element ~S is not a keyword." sym))
+       (unless (symbolp sym)
+         (error "The enumeration element ~S is not a symbol." sym))
        (unless (integerp val)
          (error "The element value ~S is not an integer." val))
        (unless (and max (> max val)) (setq max val))
        ;; If range is at least 20% dense, use vector mapping. Crossover
        ;; point solely on basis of space would be 25%. Vector mapping
        ;; is always faster, so give the benefit of the doubt.
-       ((< 0.2 (/ (float (length from-alist)) (float (- max min))))
+       ((< 0.2 (/ (float (length from-alist)) (float (1+ (- max min)))))
        ;; If offset is small and ignorable, ignore it to save time.
        (when (< 0 min 10) (setq min 0))
        (let ((to (make-array (1+ (- max min)))))
     (:alist
      `(ecase ,alien
        ,@(mapcar (lambda (mapping)
-                   `(,(car mapping) ,(cdr mapping)))
+                   `(,(car mapping) ',(cdr mapping)))
                  (alien-enum-type-to type))))))
 
 (define-alien-type-method (enum :deport-gen) (type value)
   `(sap+ ,sap (/ ,offset sb!vm:n-byte-bits)))
 
 (define-alien-type-method (mem-block :deposit-gen) (type sap offset value)
-  (let ((bits (alien-mem-block-type-bits type)))
-    (unless bits
+  (let ((bytes (truncate (alien-mem-block-type-bits type) sb!vm:n-byte-bits)))
+    (unless bytes
       (error "can't deposit aliens of type ~S (unknown size)" type))
-    `(sb!kernel:system-area-copy ,value 0 ,sap ,offset ',bits)))
+    `(sb!kernel:system-area-ub8-copy ,value 0 ,sap ,offset ',bytes)))
 \f
 ;;;; the ARRAY type