sb-alien-internals: ALIEN-VALUE to extract value of a symbol bound to an alien
authorNikodemus Siivola <nikodemus@random-state.net>
Sat, 31 Mar 2012 08:48:13 +0000 (11:48 +0300)
committerNikodemus Siivola <nikodemus@random-state.net>
Sat, 9 Jun 2012 12:04:43 +0000 (15:04 +0300)
  Used in the evaluators. Also allows the simple evaluator to process alien
  variables without invoking the compiler.

src/code/eval.lisp
src/code/full-eval.lisp
src/code/target-alieneval.lisp

index 1839520..cafbb1c 100644 (file)
              ;; with DEFINE-SYMBOL-MACRO, keeping the code walkers
              ;; happy.
              (:alien
-              (%simple-eval original-exp lexenv))))
+              (sb!alien-internals:alien-value exp))))
           (list
            (let ((name (first exp))
                  (n-args (1- (length exp))))
index 718f5f1..08af268 100644 (file)
           (t (values (cdr binding) :variable)))
         (case (sb!int:info :variable :kind symbol)
           (:macro (values (macroexpand-1 symbol) :expansion))
-          (:alien (let ((type (sb!int:info :variable :alien-info symbol)))
-                    (values (sb!alien::%heap-alien type)
-                            :variable)))
+          (:alien (values (sb!alien-internals:alien-value symbol) :variable))
           (t (values (symbol-value symbol) :variable))))))
 
 ;;; Retrieve the function/macro binding of the symbol NAME in
index a446c87..c66e364 100644 (file)
           (make-heap-alien-info :type type
                                 :sap-form `(foreign-symbol-sap ',alien-name t)))))
 
+(defun alien-value (symbol)
+  #!+sb-doc
+  "Returns the value of the alien variable bound to SYMBOL. Signals an
+error if SYMBOL is not bound to an alien variable, or if the alien
+variable is undefined."
+  (%heap-alien (or (info :variable :alien-info symbol)
+                   (error 'unbound-variable :name symbol))))
+
 (defmacro extern-alien (name type &environment env)
   #!+sb-doc
   "Access the alien variable named NAME, assuming it is of type TYPE. This