|
|
@ -403,6 +403,89 @@ |
|
|
|
(free-introspect-struct-fields (path field > field-type-metadata) |
|
|
|
current-element string-free)) |
|
|
|
(dynarray-free (deref dynarray-ptr)) |
|
|
|
(set (deref dynarray-ptr) null)) |
|
|
|
|
|
|
|
;; Dynstrings |
|
|
|
(introspect-override-register-handler 'write-s-expr |
|
|
|
(metadata-field-has-tag field "'dynstring") |
|
|
|
write-dynstring-ptr |
|
|
|
(var dynarray-ptr-write (* (* char)) |
|
|
|
(offset-pointer-to-type struct-to-write value-offset (* (* char)))) |
|
|
|
(if (and (deref dynarray-ptr-write) |
|
|
|
(dynarray-length (deref dynarray-ptr-write))) |
|
|
|
(scope ;; Non-empty |
|
|
|
(unless (escape-write-string-element write-func write-func-userdata |
|
|
|
(deref dynarray-ptr-write)) |
|
|
|
(return false))) |
|
|
|
(unless (write-func " \"\"" 0 write-func-userdata) (return false))) |
|
|
|
(return true)) |
|
|
|
|
|
|
|
(introspect-override-register-handler 'read-s-expr |
|
|
|
(metadata-field-has-tag field "'dynstring") |
|
|
|
read-dynstring-ptr |
|
|
|
(var dynarray-ptr-read (* (* char)) |
|
|
|
(offset-pointer-to-type struct-out value-offset (* (* char)))) |
|
|
|
|
|
|
|
;; You need to clean up the elements; I'd just clear them in this function, but that could lead |
|
|
|
;; to memory leaks |
|
|
|
(assert (not (dynarray-length (deref dynarray-ptr-read)))) |
|
|
|
|
|
|
|
(var value-length (unsigned int) (- value-argument-end 1 (+ 1 value-argument-start))) |
|
|
|
(when value-length |
|
|
|
(dynarray-set-length (deref dynarray-ptr-read) (+ 1 value-length)) |
|
|
|
(read-escaped-string (deref dynarray-ptr-read) value-length (+ 1 value-argument-start))) |
|
|
|
(return true)) |
|
|
|
|
|
|
|
(introspect-override-register-handler 'compare |
|
|
|
(metadata-field-has-tag field "'dynstring") |
|
|
|
compare-dynstring |
|
|
|
(var dynstsring-a (* (* char)) |
|
|
|
(offset-pointer-to-type struct-a value-offset (* (* char)))) |
|
|
|
(var dynstsring-b (* (* char)) |
|
|
|
(offset-pointer-to-type struct-b value-offset (* (* char)))) |
|
|
|
(when (!= (deref dynstsring-a) (deref dynstsring-b)) |
|
|
|
(var num-elements-a int (dynarray-length (deref dynstsring-a))) |
|
|
|
(var num-elements-b int (dynarray-length (deref dynstsring-b))) |
|
|
|
(when (!= num-elements-a num-elements-b) |
|
|
|
(when print-difference |
|
|
|
(fprintf stderr "structs differ by field '%s' [%d] length (%d vs %d)\n" |
|
|
|
(path field > name) |
|
|
|
(type-cast dispatch-value-index int) |
|
|
|
(type-cast (dynarray-length dynstsring-a) int) |
|
|
|
(type-cast (dynarray-length dynstsring-b) int))) |
|
|
|
(return (- num-elements-a num-elements-b))) |
|
|
|
|
|
|
|
(var return-value int (strcmp (deref dynstsring-a) (deref dynstsring-b))) |
|
|
|
(when (!= 0 return-value) |
|
|
|
(when print-difference |
|
|
|
(fprintf stderr "structs differ by field '%s' [%d] %d\n" |
|
|
|
(path field > name) |
|
|
|
(type-cast dispatch-value-index int) return-value)) |
|
|
|
(return return-value))) |
|
|
|
(return 0)) |
|
|
|
|
|
|
|
(introspect-override-register-handler 'copy |
|
|
|
(metadata-field-has-tag field "'dynstring") |
|
|
|
copy-dynstring |
|
|
|
(var dynarray-dest (* (* char)) |
|
|
|
(offset-pointer-to-type struct-dest value-offset (* (* char)))) |
|
|
|
(var dynarray-src (* (* char)) |
|
|
|
(offset-pointer-to-type struct-src value-offset (* (* char)))) |
|
|
|
|
|
|
|
;; Make sure the destination is empty |
|
|
|
(assert (not (dynarray-length (deref dynarray-dest)))) |
|
|
|
|
|
|
|
(when (deref dynarray-src) |
|
|
|
(dynstring-append dynarray-dest (deref dynarray-src))) |
|
|
|
(return true)) |
|
|
|
|
|
|
|
(introspect-override-register-handler 'free |
|
|
|
(metadata-field-has-tag field "'dynstring") |
|
|
|
free-dynstring-ptr |
|
|
|
(var dynarray-ptr (* (* void)) |
|
|
|
(offset-pointer-to-type struct-to-destroy value-offset (* (* void)))) |
|
|
|
(var num-elements int (dynarray-length (deref dynarray-ptr))) |
|
|
|
(dynarray-free (deref dynarray-ptr)) |
|
|
|
(set (deref dynarray-ptr) null)))) |
|
|
|
|
|
|
|
;; |
|
|
@ -488,11 +571,13 @@ |
|
|
|
value float) |
|
|
|
(def-introspect-struct my-dynarray-struct |
|
|
|
items (* array-data) (override 'dynarray) |
|
|
|
str (* char) (override 'dynstring) |
|
|
|
pod-items (* int) (ignore override 'dynarray)) ;; TODO basic types and overrides... |
|
|
|
|
|
|
|
(defun test--dynamic-array-introspection (&return int) |
|
|
|
(var baseline my-dynarray-struct (array 0)) |
|
|
|
(dynarray-set-length (field baseline items) 10) |
|
|
|
(dynstring-printf (addr (field baseline str)) "Hello, %s" "World!") |
|
|
|
(each-item-addr-in-dynarray (field baseline items) i data (* array-data) |
|
|
|
(set (path data > value) (type-cast i float))) |
|
|
|
|
|
|
|