1
Fork 0
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:
Andy Wingo 2009-02-21 19:25:35 +01:00
parent 81d677eb12
commit 594d9d4c48
9 changed files with 138 additions and 41 deletions

View file

@ -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 '()))