summaryrefslogtreecommitdiff
path: root/Lisp/type-conversion.lisp
diff options
context:
space:
mode:
authorMatthias Benkard <code@mail.matthias.benkard.de>2007-08-04 15:18:12 +0200
committerMatthias Benkard <code@mail.matthias.benkard.de>2007-08-04 15:18:12 +0200
commit5cbcd439f32529596ef929a7def75bc054dfc3e4 (patch)
tree9d603af0d955e38e59e056920f827b076d2232bf /Lisp/type-conversion.lisp
parent4765624c39dffb085554b1459b3e80bcbf347791 (diff)
More file and directory layout refactoring.
darcs-hash:9efff3ff2e22c9d8a85f8fcc7fa4487937ddd62f
Diffstat (limited to 'Lisp/type-conversion.lisp')
-rw-r--r--Lisp/type-conversion.lisp35
1 files changed, 35 insertions, 0 deletions
diff --git a/Lisp/type-conversion.lisp b/Lisp/type-conversion.lisp
new file mode 100644
index 0000000..6869ff9
--- /dev/null
+++ b/Lisp/type-conversion.lisp
@@ -0,0 +1,35 @@
+(in-package #:mulk.objective-cl)
+
+
+;;; (@* "Data conversion")
+(defun lisp->obj-data (value)
+ (let ((obj-data (foreign-alloc 'obj-data))
+ (type-name (lisp-value->type-name value)))
+ (with-foreign-slots ((type data) obj-data obj-data)
+ (setf (foreign-slot-value data
+ 'obj-data-union
+ (type-name->slot-name type-name))
+ (typecase value
+ ((or objc-id objc-class objc-selector objc-exception)
+ (pointer-to value))
+ (string (foreign-string-alloc value))
+ (otherwise value)))
+ (setf type
+ (foreign-string-alloc (type-name->type-id type-name))))
+ obj-data))
+
+
+(defun obj-data->lisp (obj-data)
+ (with-foreign-slots ((type data) obj-data obj-data)
+ (let* ((type-name (type-id->type-name (foreign-string-to-lisp type)))
+ (lisp-type (type-name->lisp-type type-name))
+ (value (if (eq 'void type-name)
+ (values)
+ (foreign-slot-value data
+ 'obj-data-union
+ (type-name->slot-name type-name)))))
+ (case lisp-type
+ ((objc-id objc-class objc-selector objc-exception)
+ (make-instance lisp-type :pointer value))
+ ((string) (foreign-string-to-lisp value))
+ (otherwise value))))) \ No newline at end of file