X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler.lisp;h=57248f746d565aa058cc84c6917d79566bf7b76e;hb=495b4eb54403d32d69d575550f8718da044ca1f1;hp=10783e90728b13253e56d16cd85b227a7e519f41;hpb=56611cbe6cc64ad65dd5e4421296efe102e31550;p=jscl.git diff --git a/src/compiler.lisp b/src/compiler.lisp index 10783e9..57248f7 100644 --- a/src/compiler.lisp +++ b/src/compiler.lisp @@ -228,7 +228,7 @@ (flet ((canonicalize (keyarg) ;; Build a canonical keyword argument descriptor, filling ;; the optional fields. The result is a list of the form - ;; ((keyword-name var) init-form). + ;; ((keyword-name var) init-form svar). (let ((arg (ensure-list keyarg))) (cons (if (listp (car arg)) (car arg) @@ -265,50 +265,44 @@ (block nil ;; Special case: a positive exact number of arguments. (when (and (< 0 min) (eql min max)) - (return `(code "checkArgs(nargs, " ,min ");"))) + (return `(call |checkArgs| |nargs| ,min))) ;; General case: - `(code - ,(when (< 0 min) - `(code "checkArgsAtLeast(nargs, " ,min ");")) - ,(when (numberp max) - `(code "checkArgsAtMost(nargs, " ,max ");")))))) + `(progn + ,(when (< 0 min) `(call |checkArgsAtLeast| |nargs| ,min)) + ,(when (numberp max) `(call |checkArgsAtMost| |nargs| ,max)))))) (defun compile-lambda-optional (ll) (let* ((optional-arguments (ll-optional-arguments-canonical ll)) (n-required-arguments (length (ll-required-arguments ll))) (n-optional-arguments (length optional-arguments))) (when optional-arguments - `(code "switch(nargs){" - ,(let ((cases nil) - (idx 0)) - (progn - (while (< idx n-optional-arguments) - (let ((arg (nth idx optional-arguments))) - (push `(code "case " ,(+ idx n-required-arguments) ":" - (code ,(translate-variable (car arg)) - "=" - ,(ls-compile (cadr arg)) ";") - ,(when (third arg) - `(code ,(translate-variable (third arg)) - "=" - ,(ls-compile nil) - ";"))) - cases) - (incf idx))) - (push `(code "default: break;") cases) - `(code ,@(reverse cases)))) - "}")))) + `(switch |nargs| + ,@(with-collect + (dotimes (idx n-optional-arguments) + (let ((arg (nth idx optional-arguments))) + (collect `(case ,(+ idx n-required-arguments))) + (collect `(= ,(make-symbol (translate-variable (car arg))) + ,(ls-compile (cadr arg)))) + (collect (when (third arg) + `(= ,(make-symbol (translate-variable (third arg))) + ,(ls-compile nil)))))) + (collect 'default) + (collect '(break))))))) (defun compile-lambda-rest (ll) (let ((n-required-arguments (length (ll-required-arguments ll))) (n-optional-arguments (length (ll-optional-arguments ll))) (rest-argument (ll-rest-argument ll))) (when rest-argument - (let ((js!rest (translate-variable rest-argument))) - `(code "var " ,js!rest "= " ,(ls-compile nil) ";" - "for (var i = nargs-1; i>=" ,(+ n-required-arguments n-optional-arguments) - "; i--)" - (code ,js!rest " = {car: arguments[i+2], cdr: " ,js!rest "};")))))) + (let ((js!rest (make-symbol (translate-variable rest-argument)))) + `(progn + (var (,js!rest ,(ls-compile nil))) + (var i) + (for ((= i (- |nargs| 1)) + (>= i ,(+ n-required-arguments n-optional-arguments)) + (post-- i)) + (= ,js!rest (object "car" (property |arguments| (+ i 2)) + "cdr" ,js!rest)))))))) (defun compile-lambda-parse-keywords (ll) (let ((n-required-arguments @@ -317,55 +311,62 @@ (length (ll-optional-arguments ll))) (keyword-arguments (ll-keyword-arguments-canonical ll))) - `(code - ;; Declare variables - ,@(mapcar (lambda (arg) - (let ((var (second (car arg)))) - `(code "var " ,(translate-variable var) "; " - ,(when (third arg) - `(code "var " ,(translate-variable (third arg)) - " = " ,(ls-compile nil) - ";" ))))) - keyword-arguments) - ;; Parse keywords - ,(flet ((parse-keyword (keyarg) - ;; ((keyword-name var) init-form) - `(code "for (i=" ,(+ n-required-arguments n-optional-arguments) - "; i