summaryrefslogtreecommitdiffstats
path: root/match.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-08-07 06:25:55 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-08-07 06:25:55 -0700
commit7abdb7132afa0f5d8351c1a04d8fc819de3f1ea1 (patch)
tree7646a67b462a9f0673a06eb504abc229abffa934 /match.c
parentfae5d29a6548c4eacfc2f463d220857d1d1f05a5 (diff)
downloadtxr-7abdb7132afa0f5d8351c1a04d8fc819de3f1ea1.tar.gz
txr-7abdb7132afa0f5d8351c1a04d8fc819de3f1ea1.tar.bz2
txr-7abdb7132afa0f5d8351c1a04d8fc819de3f1ea1.zip
@(collect)/@(coll): streamline list accumulation code.
* match.c (h_coll, v_collect): Revising the code for accumulating items into lists. Duplicate assoc lookups via assoc and acons_new are eliminated in favor of doing rplacd or acons. We don't call assoc to look up a binding if have_vars is false. car(binding) is called once and captured in the local vaiable sym.
Diffstat (limited to 'match.c')
-rw-r--r--match.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/match.c b/match.c
index a543634f..5937130f 100644
--- a/match.c
+++ b/match.c
@@ -1087,13 +1087,16 @@ static val h_coll(match_line_ctx *c)
for (iter = strictly_new_bindings; iter; iter = cdr(iter))
{
val binding = car(iter);
- val vars_binding = assoc(car(binding), vars);
+ val sym = car(binding);
- if (!have_vars || vars_binding) {
- val existing = assoc(car(binding), bindings_coll);
- bindings_coll = acons_new(car(binding),
- cons(cdr(binding), cdr(existing)),
- bindings_coll);
+ if (!have_vars || assoc(sym, vars)) {
+ val existing = assoc(sym, bindings_coll);
+ val newlist = cons(cdr(binding), cdr(existing));
+
+ if (existing)
+ rplacd(existing, newlist);
+ else
+ bindings_coll = acons(sym, newlist, bindings_coll);
}
}
}
@@ -3429,12 +3432,16 @@ static val v_collect(match_files_ctx *c)
for (iter = strictly_new_bindings; iter; iter = cdr(iter))
{
val binding = car(iter);
- val vars_binding = assoc(car(binding), vars);
+ val sym = car(binding);
- if (!have_vars || vars_binding) {
- val existing = assoc(car(binding), bindings_coll);
+ if (!have_vars || assoc(sym, vars)) {
+ val existing = assoc(sym, bindings_coll);
+ val newlist = cons(cdr(binding), cdr(existing));
- bindings_coll = acons_new(car(binding), cons(cdr(binding), cdr(existing)), bindings_coll);
+ if (existing)
+ rplacd(existing, newlist);
+ else
+ bindings_coll = acons(sym, newlist, bindings_coll);
}
}
}