mescc: Cache text generation.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 18 Mar 2017 22:00:04 +0000 (23:00 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 18 Mar 2017 22:00:04 +0000 (23:00 +0100)
* module/mes/elf-util.mes (functions->text): Add cache.

module/mes/elf-util.mes

index 7a8eeb0ee6af6b07fd378ebf0e6faad8b26f67c0..1af8b21128fb5e558cbe85feed8310f13da98e28 100644 (file)
 (define (text->list o)
   (append-map (lambda/label->list '() '() 0 0 0) o))
 
-(define (functions->text functions globals ta t d)
-  (let loop ((lambdas/labels (functions->lambdas functions)) (text '()))
-    (if (null? lambdas/labels) text
-        (loop (cdr lambdas/labels)
-              (append text ((lambda/label->list functions globals ta (- (length text)) d) (car lambdas/labels)))))))
+(define functions->text
+  (let ((cache '()))
+    (lambda (functions globals ta t d)
+      (or (assoc-ref cache (cons ta (map car functions)))
+          (let ((text (let loop ((lambdas/labels (functions->lambdas functions)) (text '()))
+                        (if (null? lambdas/labels) text
+                            (loop (cdr lambdas/labels)
+                                  (append text ((lambda/label->list functions globals ta (- (length text)) d) (car lambdas/labels))))))))
+            (set! cache (assoc-set! cache (cons ta (map car functions)) text))
+            text)))))
 
 (define (function-prefix name functions)
   ;; FIXME