diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-24 14:44:07 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-24 14:44:07 +0000 |
commit | 0a706b5b413aa96a944f45f28fb948c62e763555 (patch) | |
tree | a6855bf51b7280b14db85320d2e698ddd9db5c3e | |
parent | ef55dad27294cc01671d3c7b0f8091968dc72884 (diff) |
Reduce size of the Term struct from about 72 bytes to 48
-rw-r--r-- | dat.h | 21 | ||||
-rw-r--r-- | parser.c | 4 |
2 files changed, 16 insertions, 9 deletions
@@ -18,18 +18,25 @@ struct Operator Operator *next; }; -struct Term +struct Compound { - int tag; - Rune *text; int arity; - Term *next; Term *children; - vlong ival; - double dval; +}; + +struct Term +{ + u8int tag; + u8int inparens; uvlong clausenr; - int inparens; /* kinda bad hack needed for the current parser */ + Term *next; + + union { + vlong ival; + double dval; + struct Compound; + }; }; struct Binding @@ -211,8 +211,8 @@ parseoperators(Term *list) OpInfo *infos = gmalloc(sizeof(OpInfo) * length); for(i = 0, t = list; i < length; i++){ - Operator *op = getoperator(t->text, currentmod); - if(op && t->tag == AtomTerm && !t->inparens){ + Operator *op; + if(t->tag == AtomTerm && !t->inparens && (op = getoperator(t->text, currentmod))){ infos[i].type = op->type; infos[i].level = op->level; }else{ |