diff options
author | Matthias Benkard <code@mail.matthias.benkard.de> | 2007-08-04 15:18:12 +0200 |
---|---|---|
committer | Matthias Benkard <code@mail.matthias.benkard.de> | 2007-08-04 15:18:12 +0200 |
commit | 5cbcd439f32529596ef929a7def75bc054dfc3e4 (patch) | |
tree | 9d603af0d955e38e59e056920f827b076d2232bf /Lisp/type-conversion.lisp | |
parent | 4765624c39dffb085554b1459b3e80bcbf347791 (diff) |
More file and directory layout refactoring.
darcs-hash:9efff3ff2e22c9d8a85f8fcc7fa4487937ddd62f
Diffstat (limited to 'Lisp/type-conversion.lisp')
-rw-r--r-- | Lisp/type-conversion.lisp | 35 |
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 |