From 1391927ab44c40d45ee7825a4ce0a5d2b8394d72 Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 19 Aug 2022 17:25:43 +0200 Subject: some rough edges.. --- src/fold.cff | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/fold.cff') diff --git a/src/fold.cff b/src/fold.cff index a2c95b8..c9991b7 100644 --- a/src/fold.cff +++ b/src/fold.cff @@ -53,6 +53,37 @@ fn numcast(ex *Expr, to *const Type) void { } fn funary(ex *Expr) void { + let r = ex.u.UnOp.ex; + let ty = ex.ty; + let iu = &ex.u.IntLit; + let f = &ex.u.FloLit; + let b = &ex.u.BoolLit; + + if !fold(r) { + return; + } + switch ex.u.UnOp.op { + case :neg; + *ex = *r; + if r.ty->is(:Int) { + iu.i = -iu.i; + } else if r.ty->is(:Flo) { + *f = -*f; + } else { + assert(#f, "neg"); + } + numcast(ex, ty); + case :compl; + *ex = *r; + iu.i = ~iu.i; + assert(r.ty->is(:Int), "compl"); + numcast(ex, ty); + case :not; + *ex = *r; + *b = !*b; + assert(r.ty->is(:Bool), "not"); + } + ex.ty = ty; } fn fbinary(ex *Expr) void { -- cgit v1.2.3