summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-01-29 18:45:33 -0800
committerKaz Kylheku <kaz@kylheku.com>2017-01-29 18:45:33 -0800
commit2089c88f97314c3d6c00b56408bb06fcf376100c (patch)
treec3a29dde29cd31095f7b6cf6e4bfef32f689b39e
parentf0a0b06ea5e62f46343652acbff32d331c6a3b56 (diff)
downloadtxr-2089c88f97314c3d6c00b56408bb06fcf376100c.tar.gz
txr-2089c88f97314c3d6c00b56408bb06fcf376100c.tar.bz2
txr-2089c88f97314c3d6c00b56408bb06fcf376100c.zip
Optimize merge a little.
* lib.c (merge): Eliminate extra call to cdr by keeping the result of cdr_l, and working with the location.
-rw-r--r--lib.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/lib.c b/lib.c
index acf4e54c..ee406c0e 100644
--- a/lib.c
+++ b/lib.c
@@ -7637,13 +7637,15 @@ val merge(val list1, val list2, val lessfun, val keyfun)
val el2 = funcall1(keyfun, first(list2));
if (funcall2(lessfun, el2, el1)) {
- val next = cdr(list2);
- deref(cdr_l(list2)) = nil;
+ loc pnext = cdr_l(list2);
+ val next = deref(pnext);
+ deref(pnext) = nil;
ptail = list_collect_nconc(ptail, list2);
list2 = next;
} else {
- val next = cdr(list1);
- deref(cdr_l(list1)) = nil;
+ loc pnext = cdr_l(list1);
+ val next = deref(pnext);
+ deref(pnext) = nil;
ptail = list_collect_nconc(ptail, list1);
list1 = next;
}