mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 03:30:27 +02:00
compile ecmascript's parser. yay! instant load-time!
* module/language/ghil/compile-glil.scm (codegen): If there are more than 255 arguments, make a list and use apply instead of calling directly. * module/language/Makefile.am: Now we can compile parse.scm. Yay! * module/language/scheme/compile-ghil.scm: Add a note. * module/language/ecmascript/compile-ghil.scm: Add a note.
This commit is contained in:
parent
594d9d4c48
commit
aec8febc46
4 changed files with 13 additions and 5 deletions
|
@ -2,15 +2,12 @@ SUBDIRS=scheme ghil glil assembly bytecode objcode value
|
||||||
SOURCES=ghil.scm glil.scm assembly.scm \
|
SOURCES=ghil.scm glil.scm assembly.scm \
|
||||||
ecmascript/parse-lalr.scm \
|
ecmascript/parse-lalr.scm \
|
||||||
ecmascript/tokenize.scm \
|
ecmascript/tokenize.scm \
|
||||||
|
ecmascript/parse.scm \
|
||||||
ecmascript/spec.scm \
|
ecmascript/spec.scm \
|
||||||
ecmascript/impl.scm \
|
ecmascript/impl.scm \
|
||||||
ecmascript/base.scm \
|
ecmascript/base.scm \
|
||||||
ecmascript/function.scm \
|
ecmascript/function.scm \
|
||||||
ecmascript/array.scm \
|
ecmascript/array.scm \
|
||||||
ecmascript/compile-ghil.scm
|
ecmascript/compile-ghil.scm
|
||||||
# unfortunately, the one that we want to compile can't yet be compiled
|
|
||||||
# -- too many external vars, or something. seems like we need to do
|
|
||||||
# closure elimination or something.
|
|
||||||
NOCOMP_SOURCES = ecmascript/parse.scm
|
|
||||||
modpath = language
|
modpath = language
|
||||||
include $(top_srcdir)/am/guilec
|
include $(top_srcdir)/am/guilec
|
||||||
|
|
|
@ -46,6 +46,8 @@
|
||||||
(@implv ,e ,l ,sym)
|
(@implv ,e ,l ,sym)
|
||||||
,args))
|
,args))
|
||||||
|
|
||||||
|
;; The purpose, you ask? To avoid non-tail recursion when expanding a
|
||||||
|
;; long pmatch sequence.
|
||||||
(define-macro (ormatch x . clauses)
|
(define-macro (ormatch x . clauses)
|
||||||
(let ((X (gensym)))
|
(let ((X (gensym)))
|
||||||
`(let ((,X ,x))
|
`(let ((,X ,x))
|
||||||
|
|
|
@ -382,7 +382,14 @@
|
||||||
;; ARGS...
|
;; ARGS...
|
||||||
;; ([tail-]call NARGS)
|
;; ([tail-]call NARGS)
|
||||||
(comp-push proc)
|
(comp-push proc)
|
||||||
(push-call! loc (if tail 'goto/args 'call) args)
|
(let ((nargs (length args)))
|
||||||
|
(cond ((< nargs 255)
|
||||||
|
(push-call! loc (if tail 'goto/args 'call) args))
|
||||||
|
(else
|
||||||
|
(push-call! loc 'mark '())
|
||||||
|
(for-each comp-push args)
|
||||||
|
(push-call! loc 'list-mark '())
|
||||||
|
(push-code! loc (make-glil-call (if tail 'goto/apply 'apply) 2)))))
|
||||||
(maybe-drop))
|
(maybe-drop))
|
||||||
|
|
||||||
((<ghil-mv-call> env loc producer consumer)
|
((<ghil-mv-call> env loc producer consumer)
|
||||||
|
|
|
@ -381,6 +381,8 @@
|
||||||
;; FIXME: not hygienic, relies on @apply not being shadowed
|
;; FIXME: not hygienic, relies on @apply not being shadowed
|
||||||
(,args (retrans `(@apply ,@args))))
|
(,args (retrans `(@apply ,@args))))
|
||||||
|
|
||||||
|
;; FIXME: we could add inliners for `list' and `vector'
|
||||||
|
|
||||||
(define-scheme-translator @apply
|
(define-scheme-translator @apply
|
||||||
((,proc ,arg1 . ,args)
|
((,proc ,arg1 . ,args)
|
||||||
(let ((args (cons (retrans arg1) (map retrans args))))
|
(let ((args (cons (retrans arg1) (map retrans args))))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue