mescc: Cache data-offset too.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 18 Mar 2017 07:58:15 +0000 (08:58 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 18 Mar 2017 07:58:15 +0000 (08:58 +0100)
* module/mes/elf-util.mes (data-offset): Add cache.

module/mes/elf-util.mes

index 53db0f8c36a2d51d51b7b2eb658e133fc0bb2c79..82e5aca4e26377955a9b72f522c3a63f5832add1 100644 (file)
         (loop (cdr lambdas/labels)
               (append text ((lambda/label->list functions globals ta (- (length text)) d) (car lambdas/labels)))))))
 
-;; (define (functions->text functions globals ta t d)
-;;   (let loop ((functions functions) (text '()))
-;;     (if (null? functions) text
-;;         (loop (cdr functions)
-;;               (append '() ;;text
-;;                       (function->text functions globals ta t d text (car functions)))))))
-
-;; (define (function->text functions globals ta t d text function)
-;;   (format (current-error-port) "elf func=~a\n" (car function))
-;;   (let loop ((lambdas/labels (cdr function)) (text 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 (function-prefix name functions)
   ;; FIXME
   ;;(member name (reverse functions) (lambda (a b) (equal? (car b) name)))
                                             (n (length t)))
                                        (+ (loop (cdr text)) n))))))
                   (when (> offset 0)
-                      (set! cache (assoc-set! cache (cons function label) offset)))
+                    (set! cache (assoc-set! cache (cons function label) offset)))
                   offset)))))))
 
 (define (globals->data globals)
   (append-map (compose global:value cdr) globals))
 
-(define (data-offset name globals)
-  (let* ((prefix (member name (reverse globals)
-                         (lambda (a b)
-                           (equal? (car b) name)))))
-    (if prefix (length (globals->data (cdr prefix)))
-        0)))
+(define data-offset
+  (let ((cache '()))
+    (lambda (name globals)
+      (or (assoc-ref cache name)
+          (let* ((prefix (member name (reverse globals)
+                                 (lambda (a b)
+                                   (equal? (car b) name)))))
+            (if (not prefix) 0
+                (let ((offset (length (globals->data (cdr prefix)))))
+                 (set! cache (assoc-set! cache name offset))
+                 offset)))))))