summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2012-03-06 22:22:31 +0100
committerAndy Wingo <wingo@pobox.com>2012-03-06 22:22:31 +0100
commit3c12fc359561aedb179a524667ba03481333f482 (patch)
treeea71431a666f0e1fd964f0ecf0121bcfa9586cff
parent24ea9f9c3abb8d9398df4810b815075593ba67c8 (diff)
downloadguile-3c12fc359561aedb179a524667ba03481333f482.tar.gz
micro-optimization in (web server)
* module/web/server.scm (extend-response): Micro-optimize to not mutate data, and to copy as little as possible.
-rw-r--r--module/web/server.scm6
1 files changed, 4 insertions, 2 deletions
diff --git a/module/web/server.scm b/module/web/server.scm
index 42887e67f..fbd5d95ab 100644
--- a/module/web/server.scm
+++ b/module/web/server.scm
@@ -198,11 +198,13 @@ values."
(display str port)))))
(define (extend-response r k v . additional)
+ (define (extend-alist alist k v)
+ (let ((pair (assq k alist)))
+ (acons k v (if pair (delq pair alist) alist))))
(let ((r (build-response #:version (response-version r)
#:code (response-code r)
#:headers
- (assoc-set! (copy-tree (response-headers r))
- k v)
+ (extend-alist (response-headers r) k v)
#:port (response-port r))))
(if (null? additional)
r