aboutsummaryrefslogtreecommitdiffstats
path: root/csc/linker.csc
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2022-07-30 09:50:29 -0700
committerRose Hogenson <rhogenson@posteo.net>2022-07-30 09:50:29 -0700
commit351bcc91b53c3559309002388fd3357f5700f4b6 (patch)
tree3dac2dafa5f2842c6716864e14582fc6d15e5ffe /csc/linker.csc
parentWrite more tests for decode. (diff)
downloadchromatopelma-351bcc91b53c3559309002388fd3357f5700f4b6.tar.zst
Fix some test cases in the compiler.
Diffstat (limited to 'csc/linker.csc')
-rw-r--r--csc/linker.csc28
1 files changed, 20 insertions, 8 deletions
diff --git a/csc/linker.csc b/csc/linker.csc
index a2ab447..6502cb0 100644
--- a/csc/linker.csc
+++ b/csc/linker.csc
@@ -92,16 +92,28 @@
(_ arg))))))
+ (define (num-globals environment)
+ (define n 0)
+ (map-for-each (lambda (k v)
+ (when (<= n v)
+ (set! n (+ 1 v))))
+ environment)
+ n)
+
+
(define link
(case-lambda
((programs environment)
- (translate-globals
- (loop for prog in programs
- for off = 0 then (+ off (length converted-prog))
- for converted-prog = (translate-labels
- prog
- (make-label-map off prog))
- append converted-prog)
- environment))
+ (append
+ (list
+ (list 'alloc (list 'local 0) (list 'const (num-globals environment))))
+ (translate-globals
+ (loop for prog in programs
+ for off = 0 then (+ off (length converted-prog))
+ for converted-prog = (translate-labels
+ prog
+ (make-label-map off prog))
+ append converted-prog)
+ environment)))
((programs)
(link programs (add-to-environment (make-map compare-globals) programs)))))))