summaryrefslogtreecommitdiff
path: root/Lisp/libobjcl.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'Lisp/libobjcl.lisp')
-rw-r--r--Lisp/libobjcl.lisp27
1 files changed, 27 insertions, 0 deletions
diff --git a/Lisp/libobjcl.lisp b/Lisp/libobjcl.lisp
index c4b9d18..1364c58 100644
--- a/Lisp/libobjcl.lisp
+++ b/Lisp/libobjcl.lisp
@@ -747,6 +747,33 @@ separating parts by hyphens works nicely in all of the `:INVERT`,
(defun objcl-class-superclass (class)
(objcl-class-superclass/pointer (pointer-to class)))
+(defun objcl-create-class (class-name superclass
+ protocol-names
+ ivar-names ivar-typespecs)
+ (let* ((ivar-typestrings (mapcar #'print-typespec-to-string ivar-typespecs)))
+ (with-foreign-string-pool (register-temporary-string
+ allocate-temporary-string)
+ (with-foreign-objects ((%protocol-names :pointer (length protocol-names))
+ (%ivar-names :pointer (length ivar-names))
+ (%ivar-typestrings :pointer (length ivar-typestrings)))
+ (flet ((fill-foreign-array-from-list (array list type)
+ (loop for element in list
+ for i from 0
+ do (setf (mem-aref array type i) element))))
+ (loop for (array . list) in (list (cons %protocol-names protocol-names)
+ (cons %ivar-names ivar-names)
+ (cons %ivar-typestrings ivar-typestrings))
+ do (fill-foreign-array-from-list array
+ (mapcar #'allocate-temporary-string
+ list)
+ :pointer)))
+ (%objcl-create-class class-name
+ (pointer-to superclass)
+ (length protocol-names)
+ %protocol-names
+ (length ivar-names)
+ %ivar-names
+ %ivar-typestrings)))))
;;; (@* "Low-level Data Conversion")
(eval-when (:compile-toplevel :load-toplevel)