optimize fmt-c-writer type unwrapping
This commit is contained in:
@@ -46,6 +46,12 @@
|
||||
(unkebabify atom)
|
||||
atom))))
|
||||
|
||||
(define (maybe-unwrap-type type)
|
||||
(if (and (list? type)
|
||||
(= 1 (length type)))
|
||||
(car type)
|
||||
type))
|
||||
|
||||
(define (make-field-access form)
|
||||
(assert
|
||||
(= 2 (length form)) "Wrong field access format")
|
||||
@@ -111,19 +117,13 @@
|
||||
(if (integer? (last array-type))
|
||||
;; sized array
|
||||
(let* ((type-list (drop-right array-type 1))
|
||||
(type (if (and (list? (car type-list))
|
||||
(= 1 (length type-list)))
|
||||
(car type-list)
|
||||
type-list))
|
||||
(type (maybe-unwrap-type type-list))
|
||||
(size (last array-type)))
|
||||
`(%array ,(walk-type type)
|
||||
,size))
|
||||
;; sugar for pointer... Do we really need it? Guess why not,
|
||||
;; it's a strong semantic cue
|
||||
`(%array ,(walk-type (if (and (list? (car array-type))
|
||||
(= 1 (length array-type)))
|
||||
(car array-type)
|
||||
array-type)))))
|
||||
`(%array ,(walk-type (maybe-unwrap-type array-type)))))
|
||||
(('fn arglist ret-type)
|
||||
`(%fun ,(walk-type ret-type) ,(walk-arglist arglist)))
|
||||
|
||||
@@ -179,9 +179,7 @@
|
||||
;; 1 element args are always type
|
||||
((_) (walk-type x))
|
||||
|
||||
((var . type) (append (list (walk-type (if (= 1 (length type))
|
||||
(car type)
|
||||
type)))
|
||||
((var . type) (append (list (walk-type (maybe-unwrap-type type)))
|
||||
(list (walk-type var))))))
|
||||
form))
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
(walk-type '(¤ (const char))))
|
||||
|
||||
(test
|
||||
'(%array (float) 8)
|
||||
'(%array float 8)
|
||||
(walk-type '(¤ float 8)))
|
||||
|
||||
(test
|
||||
@@ -40,16 +40,16 @@
|
||||
(walk-type '(const * const char)))
|
||||
|
||||
(test
|
||||
'(%fun void ((int) (float) (struct what *)))
|
||||
(walk-type '(fn ((int) (float) (* struct what)) void)))
|
||||
'(%fun void ((int) (float) (%array (struct what * const))))
|
||||
(walk-type '(fn ((int) (float) (¤ (const * struct what))) void)))
|
||||
|
||||
(test
|
||||
'(%fun void ((int) (%array (float)) (struct what *)))
|
||||
(walk-type '(fn ((int) (¤ float) (* struct what)) void)))
|
||||
'(%fun void ((int) (%array float) (%array (struct what * const))))
|
||||
(walk-type '(fn ((int) (¤ float) (¤ (const * struct what))) void)))
|
||||
|
||||
;;; Variable defs
|
||||
(test
|
||||
'(%var (%array (float) 8) a)
|
||||
'(%var (%array float 8) a)
|
||||
(walk-var '(var a (¤ float 8))))
|
||||
|
||||
(test
|
||||
@@ -82,7 +82,7 @@
|
||||
|
||||
;;; Fn defs
|
||||
(test
|
||||
'(%fun void puk ((int) (%array (float) 8)))
|
||||
'(%fun void puk ((int) (%array float 8)))
|
||||
(walk-fn-def '(fn puk ((int) (¤ float 8)) void)))
|
||||
|
||||
(test
|
||||
@@ -129,7 +129,7 @@
|
||||
(test
|
||||
'(struct mega_kebab ((int a)
|
||||
((struct ((int year) (int month) (int day))) dob)
|
||||
((%fun int ((int) (%array (int)))) min)))
|
||||
((%fun int ((int) (%array int))) min)))
|
||||
(walk-struct '(struct mega-kebab
|
||||
((a int)
|
||||
(dob (struct ((year int)
|
||||
|
||||
Reference in New Issue
Block a user