mescc: allow complicated enums expressions.
* module/language/c99/compiler.mes (p-expr->number): Support lshift, rshift, ash. (enum-def-list->constants): Refactor using p-expr->number.
This commit is contained in:
parent
3f188d7268
commit
ae9ce4e645
|
@ -1503,6 +1503,10 @@
|
||||||
((sizeof-expr (i-sel (ident ,field) (p-expr (ident ,struct))))
|
((sizeof-expr (i-sel (ident ,field) (p-expr (ident ,struct))))
|
||||||
(let ((type (ident->type info struct)))
|
(let ((type (ident->type info struct)))
|
||||||
(field-size info type field)))
|
(field-size info type field)))
|
||||||
|
((lshift ,x ,y)
|
||||||
|
(ash (p-expr->number info x) (p-expr->number info y)))
|
||||||
|
((rshift ,x ,y)
|
||||||
|
(ash (p-expr->number info x) (- (p-expr->number info y))))
|
||||||
((p-expr (ident ,name))
|
((p-expr (ident ,name))
|
||||||
(let ((value (assoc-ref (.constants info) name)))
|
(let ((value (assoc-ref (.constants info) name)))
|
||||||
(or value
|
(or value
|
||||||
|
@ -2353,12 +2357,8 @@
|
||||||
(name (pmatch field
|
(name (pmatch field
|
||||||
((enum-defn (ident ,name) . _) name)))
|
((enum-defn (ident ,name) . _) name)))
|
||||||
(i (pmatch field
|
(i (pmatch field
|
||||||
((enum-defn ,name (p-expr (fixed ,value))) (cstring->number value))
|
|
||||||
((enum-defn ,name) i)
|
((enum-defn ,name) i)
|
||||||
((enum-defn ,name (add (p-expr (fixed ,a)) (p-expr (fixed ,b))))
|
((enum-defn ,name ,exp) (p-expr->number #f exp))
|
||||||
(+ (cstring->number a) (cstring->number b)))
|
|
||||||
((enum-defn ,name (sub (p-expr (fixed ,a)) (p-expr (fixed ,b))))
|
|
||||||
(- (cstring->number a) (cstring->number b)))
|
|
||||||
(_ (error "not supported enum field=~s\n" field)))))
|
(_ (error "not supported enum field=~s\n" field)))))
|
||||||
(loop (cdr fields)
|
(loop (cdr fields)
|
||||||
(1+ i)
|
(1+ i)
|
||||||
|
|
Loading…
Reference in a new issue