ref: 74270f8f47a704652ca301975da7ff88926e5cc8
parent: 650b63c3d3fbf7935cfc3db0da322b49b02f0388
author: Ori Bernstein <[email protected]>
date: Sat Oct 24 08:44:30 EDT 2015
We only need to load a value once.
--- a/mi/match.c
+++ b/mi/match.c
@@ -19,8 +19,7 @@
Node *patexpr; /* the full pattern for this node */
Node **val; /* pattern values to compare against */
size_t nval;
- Node **load; /* expression value being compared */
- size_t nload;
+ Node *load; /* expression value being compared */
Dtree **sub; /* submatch to use if if equal */
size_t nsub;
Dtree *any; /* tree for a wildcard match. */
@@ -198,8 +197,11 @@
/* otherwise create a new match */
sub = mkdtree();
sub->patexpr = pat;
- tag = mkexpr(pat->loc, Outag, val, NULL);
- tag->expr.type = mktype(pat->loc, Tyint32);
+ if (!t->load) {
+ tag = mkexpr(pat->loc, Outag, val, NULL);
+ tag->expr.type = mktype(pat->loc, Tyint32);
+ t->load = tag;
+ }
id = mkintlit(pat->loc, uc->id);
id->expr.type = mktype(pat->loc, Tyint32);
@@ -206,7 +208,6 @@
lappend(&t->val, &t->nval, id);
lappend(&t->sub, &t->nsub, sub);
- lappend(&t->load, &t->nload, tag);
if (pat->expr.nargs == 2) {
elt = uvalue(val, exprtype(pat->expr.args[1]));
sub = addpat(sub, pat->expr.args[1], elt, cap, ncap);
@@ -260,7 +261,8 @@
sub = mkdtree();
sub->patexpr = pat;
lappend(&t->val, &t->nval, pat);
- lappend(&t->load, &t->nload, val);
+ if (!t->load)
+ t->load = val;
lappend(&t->sub, &t->nsub, sub);
}
return sub;
@@ -464,7 +466,7 @@
if (dt->nsub == 0 && !dt->any)
return addcapture(dt, dt->act);
for (i = 0; i < dt->nsub; i++) {
- eq = mkexpr(loc, Oeq, dt->load[i], dt->val[i], NULL);
+ eq = mkexpr(loc, Oeq, dt->load, dt->val[i], NULL);
cmp = mkifstmt(loc, eq, genmatch(loc, dt->sub[i], lastany), NULL);
if (!pat)
pat = cmp;