summaryrefslogtreecommitdiff
path: root/module/language
diff options
context:
space:
mode:
Diffstat (limited to 'module/language')
-rw-r--r--module/language/lua/compile-tree-il.scm11
-rw-r--r--module/language/lua/parser.scm15
2 files changed, 19 insertions, 7 deletions
diff --git a/module/language/lua/compile-tree-il.scm b/module/language/lua/compile-tree-il.scm
index 48c1a58b1..72c0d1b77 100644
--- a/module/language/lua/compile-tree-il.scm
+++ b/module/language/lua/compile-tree-il.scm
@@ -156,7 +156,7 @@ dropped silently"
src (make-primitive-ref src 'return/values)
(if (list? exp) (map-compile exp #t) (list (compile exp))))))
- ((ast-function src name arguments argument-gensyms variable-arguments? body)
+ ((ast-function src name arguments argument-gensyms variable-arguments? vararg-gensym body)
;; ... is always attached because lua functions must ignore
;; variable arguments; the parser will catch it if ... is used in a
;; function that doesn't have ... in the parameter list
@@ -165,7 +165,7 @@ dropped silently"
src meta
(make-lambda-case src '() arguments '... #f
(map (lambda (x) (make-const src #nil)) arguments)
- (append argument-gensyms (list (gensym "...")))
+ (append argument-gensyms (list vararg-gensym))
(compile body)
#f))))
@@ -476,7 +476,12 @@ dropped silently"
(make-lexical-ref src 'and-tmp tmp)
right
(make-lexical-ref src 'and-tmp tmp)))))
- (else (error #:COMPILE "unknown binary operator" operator)))))))
+ (else (error #:COMPILE "unknown binary operator" operator)))))
+ ((ast-variable-arguments src gensym)
+ (make-application src
+ (make-primitive-ref src 'apply)
+ (list (make-primitive-ref src 'values)
+ (make-lexical-ref src '... gensym))))))
;; exported compiler function
(define (compile-tree-il exp env opts)
diff --git a/module/language/lua/parser.scm b/module/language/lua/parser.scm
index dbe73f66f..2ee81ce0f 100644
--- a/module/language/lua/parser.scm
+++ b/module/language/lua/parser.scm
@@ -106,10 +106,10 @@
(numeric-for-loop named initial limit step body)
(list-for-loop names gs-names exps body)
(break)
- (function name arguments argument-gensyms variable-arguments? body)
+ (function name arguments argument-gensyms variable-arguments? vararg-gensym body)
(function-call operator operands)
(binary-operation operator left right)
- (variable-arguments))
+ (variable-arguments gensym))
) ; letrec-syntax
@@ -219,6 +219,9 @@
;; True if inside a function and the function accepts variable arguments
(define *vararg-function* #f)
+ ;; refers to the gensym for '...' in a function that accepts variable arguments
+ (define *vararg-gensym* #f)
+
;;;;; ENVIRONMENTS
(define (enter-environment!)
"Create a new environment, and set ENVIRONMENT to it"
@@ -482,8 +485,10 @@
(enforce-next! #\()
;; parameter-list
(receive (parameters variable-arguments?) (parameter-list name)
- (let* ((old-vararg-function *vararg-function*))
+ (let* ((old-vararg-function *vararg-function*)
+ (old-vararg-gensym *vararg-gensym*))
(set! *vararg-function* variable-arguments?)
+ (set! *vararg-gensym* (and variable-arguments? (gensym "...")))
(enforce-next! #\))
;; create function
(enter-environment!)
@@ -504,11 +509,13 @@
(list (environment-lookup-gensym 'self)))
parameter-gensyms)
variable-arguments?
+ *vararg-gensym*
(if (null? body) *void-literal* body))))
(leave-environment!)
;; END
(enforce-next! #:end)
(set! *vararg-function* old-vararg-function)
+ (set! *vararg-gensym* old-vararg-gensym)
result))))
;; expression-list -> expression { ',' expression }
@@ -535,7 +542,7 @@
((#:varargs)
(unless *vararg-function*
(syntax-error src "cannot use '...' outside of a variable arguments function"))
- (advance! (make-ast-variable-arguments src)))
+ (advance! (make-ast-variable-arguments src *vararg-gensym*)))
;; FUNCTION function-body
((#:function) (advance!) (function-body src))
;; primary-expression