mescc: Refactor function-offset.
[mes.git] / module / mes / elf-util.mes
index 82e5aca4e26377955a9b72f522c3a63f5832add1..7a8eeb0ee6af6b07fd378ebf0e6faad8b26f67c0 100644 (file)
   (let ((cache '()))
     (lambda (name functions)
       (or (assoc-ref cache name)
-          (let* ((prefix (function-prefix name functions))
-                 (offset (if prefix (length (functions->text (cdr prefix) '() 0 0 0))
-                             0)))
-            (if (and prefix (or (equal? name "exit") (> offset 0))) (set! cache (assoc-set! cache name offset)))
-            offset)))))
+          (let* ((functions (if (and (pair? functions) (equal? (caar functions) "exit")) functions (reverse functions)))
+                 (prefix (and=> (function-prefix name functions) cdr))
+                 (offset (and prefix
+                              (if (null? prefix) 0
+                                  (+ (length (functions->text (list (car prefix)) '() 0 0 0))
+                                     (if (null? (cdr prefix)) 0
+                                         (function-offset (caar prefix) functions)))))))
+            (if (and offset (or (equal? name "exit") (> offset 0))) (set! cache (assoc-set! cache name offset)))
+            (or offset 0))))))
 
 (define label-offset
   (let ((cache '()))