mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-16 16:50:21 +02:00
be smarter about allocating local variables, reusing slots if possible
* module/language/Makefile.am: OK, we can compile compile-ghil.scm now, thankfully. * module/language/ecmascript/compile-ghil.scm (ormatch): New macro, a wrapper around pmatch to avoid some of the more egregious non-tail recursiveness. (comp): Use ormatch. * module/language/ghil.scm (unparse-ghil): The body of bind and mv-bind is a single expression, not a list of expressions. * module/language/ghil/compile-glil.scm (codegen): Be more clever when allocating "local" variables -- if a variable goes out of scope, its index can be re-used later. * module/language/glil.scm (parse-glil, unparse-ghil): The "rest" of a mv-bind is a flag, not a list. The "ra" of an mv-call is a label, not a GLIL expression. * module/language/objcode/spec.scm (collapse-locals, decompile-value): When decompiling a value, process the bindings list differently. Comments in the code. * module/language/scheme/compile-ghil.scm (define-scheme-translator): Fix the generated error procedure. (let): Re-indent. (letrec): Re-indent. * module/system/base/syntax.scm (record-case): If the body of a clause is null, fill it with the unspecified value.
This commit is contained in:
parent
81d677eb12
commit
594d9d4c48
9 changed files with 138 additions and 41 deletions
|
@ -25,8 +25,6 @@
|
|||
#:use-module (system base pmatch)
|
||||
#:export (compile-ghil))
|
||||
|
||||
(eval-case ((load-toplevel) (debug-set! stack 0)))
|
||||
|
||||
(define (compile-ghil exp env opts)
|
||||
(values
|
||||
(call-with-ghil-environment (make-ghil-toplevel-env) '()
|
||||
|
@ -48,6 +46,15 @@
|
|||
(@implv ,e ,l ,sym)
|
||||
,args))
|
||||
|
||||
(define-macro (ormatch x . clauses)
|
||||
(let ((X (gensym)))
|
||||
`(let ((,X ,x))
|
||||
(or ,@(map (lambda (c)
|
||||
(if (eq? (car c) 'else)
|
||||
`(begin . ,(cdr c))
|
||||
`(pmatch ,X ,c (else #f))))
|
||||
clauses)))))
|
||||
|
||||
(define (comp x e)
|
||||
(let ((l (location x)))
|
||||
(define (let1 what proc)
|
||||
|
@ -62,7 +69,7 @@
|
|||
(make-ghil-begin
|
||||
e l (list (proc (car vars))
|
||||
(make-ghil-ref e l (car vars))))))))
|
||||
(pmatch x
|
||||
(ormatch x
|
||||
(null
|
||||
;; FIXME, null doesn't have much relation to EOL...
|
||||
(make-ghil-quote e l '()))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue