1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-23 12:00: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

@ -175,7 +175,7 @@
(pmatch (cdr exp)
,@clauses
,@(if (assq 'else clauses) '()
'((else
`((else
(syntax-error l (format #f "bad ~A" ',sym) exp))))))))
(define-scheme-translator quote
@ -261,8 +261,8 @@
(maybe-name-value! (retrans (cadr b)) (car b)))
bindings)))
(call-with-ghil-bindings e (map car bindings)
(lambda (vars)
(make-ghil-bind e l vars vals (trans-body e l body)))))))
(lambda (vars)
(make-ghil-bind e l vars vals (trans-body e l body)))))))
(define-scheme-translator let*
;; (let* ((SYM VAL) ...) BODY...)
@ -275,12 +275,12 @@
;; (letrec ((SYM VAL) ...) BODY...)
((,bindings . ,body) (guard (valid-bindings? bindings))
(call-with-ghil-bindings e (map car bindings)
(lambda (vars)
(let ((vals (map (lambda (b)
(maybe-name-value!
(retrans (cadr b)) (car b)))
bindings)))
(make-ghil-bind e l vars vals (trans-body e l body)))))))
(lambda (vars)
(let ((vals (map (lambda (b)
(maybe-name-value!
(retrans (cadr b)) (car b)))
bindings)))
(make-ghil-bind e l vars vals (trans-body e l body)))))))
(define-scheme-translator cond
;; (cond (CLAUSE BODY...) ...)