(define impc:ti:memzone
(lambda (ast)
(define zone_returns_void? (impc:ti:check-memzone-void? ast))
(if zone_returns_void?
`(begin (push_new_zone ,(cadr ast))
,(if (= (length ast) 3) (caddr ast) (cadddr ast))
(pop_zone)
void)
(begin
(define resname (string->symbol (string-append "res" (number->string (modulo *xtm_mz_num* 100)))))
(define zonename (string->symbol (string-append "zone" (number->string (modulo *xtm_mz_num* 100)))))
(define newzname (string->symbol (string-append "newz" (number->string (modulo *xtm_mz_num* 100)))))
(define rescopyname (string->symbol (string-append "rescopy" (number->string (modulo *xtm_mz_num* 100)))))
(set! *xtm_mz_num* (+ *xtm_mz_num* 1))
(if (or (> (length ast) 4)
(< (length ast) 3))
(impc:compiler:print-bad-arity-error ast))
`(begin (push_new_zone ,(cadr ast))
(let ((,resname ,(if (= (length ast) 3) (caddr ast) (cadddr ast)))
(,zonename (pop_zone))
(,newzname (llvm_peek_zone_stack)))
;; this extra let seems redundant! BUT is needed
;; because rescopyname should go in newzone not zonename
;; i.e. needs to go into a *new* let after pop_zone is called
(let ((,rescopyname (zcopy ,resname ,zonename ,newzname)))
,(if (= (length ast) 3)
`(llvm_zone_destroy ,zonename)
`(llvm_destroy_zone_after_delay ,zonename ,(caddr ast)))
,rescopyname)))))))