diff options
Diffstat (limited to 'csc/linker.csc')
| -rw-r--r-- | csc/linker.csc | 28 |
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))))))) |
