blob: 6869ff94a3883914b8be4e3b53ac9fbb7f8867cb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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)))))
|