Store intermediate variables as symbols instead of strings
authorDavid Vázquez <davazp@gmail.com>
Fri, 5 Jul 2013 16:47:27 +0000 (18:47 +0200)
committerDavid Vázquez <davazp@gmail.com>
Fri, 5 Jul 2013 16:47:27 +0000 (18:47 +0200)
src/compiler.lisp

index 2c8269c..7f63074 100644 (file)
@@ -94,7 +94,7 @@
 (defun gvarname (symbol)
   (declare (ignore symbol))
   (incf *variable-counter*)
-  (concat "v" (integer-to-string *variable-counter*)))
+  (make-symbol (concat "v" (integer-to-string *variable-counter*))))
 
 (defun translate-variable (symbol)
   (awhen (lookup-in-lexenv symbol *environment* 'variable)
                   (dotimes (idx n-optional-arguments)
                     (let ((arg (nth idx optional-arguments)))
                       (collect `(case ,(+ idx n-required-arguments)))
-                      (collect `(= ,(make-symbol (translate-variable (car arg)))
+                      (collect `(= ,(translate-variable (car arg))
                                    ,(convert (cadr arg))))
                       (collect (when (third arg)
-                                 `(= ,(make-symbol (translate-variable (third arg)))
+                                 `(= ,(translate-variable (third arg))
                                      ,(convert nil))))))
                   (collect 'default)
                   (collect '(break)))))))
        (n-optional-arguments (length (ll-optional-arguments ll)))
        (rest-argument (ll-rest-argument ll)))
     (when rest-argument
-      (let ((js!rest (make-symbol (translate-variable rest-argument))))
+      (let ((js!rest (translate-variable rest-argument)))
         `(progn
            (var (,js!rest ,(convert nil)))
            (var i)
             (destructuring-bind ((keyword-name var) &optional initform svar)
                 keyword-argument
               (declare (ignore keyword-name initform))
-              (collect `(var ,(make-symbol (translate-variable var))))
+              (collect `(var ,(translate-variable var)))
               (when svar
                 (collect
-                    `(var (,(make-symbol (translate-variable svar))
+                    `(var (,(translate-variable svar)
                             ,(convert nil))))))))
        
        ;; Parse keywords
                           (if (=== (property |arguments| (+ i 2))
                                    ,(convert keyword-name))
                               (progn
-                                (= ,(make-symbol (translate-variable var))
+                                (= ,(translate-variable var)
                                    (property |arguments| (+ i 3)))
-                                ,(when svar `(= ,(make-symbol (translate-variable svar))
+                                ,(when svar `(= ,(translate-variable svar)
                                                 ,(convert t)))
                                 (break))))
                      (if (== i |nargs|)
-                         (= ,(make-symbol (translate-variable var))
-                            ,(convert initform)))))))
+                         (= ,(translate-variable var) ,(convert initform)))))))
          (when keyword-arguments
            `(progn
               (var i)
                                     (ll-svars ll)))))
         (lambda-name/docstring-wrapper name documentation
          `(function (|values| |nargs| ,@(mapcar (lambda (x)
-                                                  (make-symbol (translate-variable x)))
+                                                  (translate-variable x))
                                                 (append required-arguments optional-arguments)))
                      ;; Check number of arguments
                     ,(lambda-check-argument-count n-required-arguments
             (not (member 'constant (binding-declarations b))))
        ;; TODO: Unnecesary make-symbol when codegen migration is
        ;; finished.
-       `(= ,(make-symbol (binding-value b)) ,(convert val)))
+       `(= ,(binding-value b) ,(convert val)))
       ((and b (eq (binding-type b) 'macro))
        (convert `(setf ,var ,val)))
       (t
 
 (defun genlit ()
   (incf *literal-counter*)
-  (concat "l" (integer-to-string *literal-counter*)))
+  (make-symbol (concat "l" (integer-to-string *literal-counter*))))
 
 (defun dump-symbol (symbol)
   #-jscl
            (if (and recursive (not (symbolp sexp)))
                dumped
                (let ((jsvar (genlit)))
-                 (push (cons sexp (make-symbol jsvar)) *literal-table*)
-                 (toplevel-compilation `(var (,(make-symbol jsvar) ,dumped)))
+                 (push (cons sexp jsvar) *literal-table*)
+                 (toplevel-compilation `(var (,jsvar ,dumped)))
                  (when (keywordp sexp)
-                   (toplevel-compilation `(= ,(get (make-symbol jsvar) "value") ,(make-symbol jsvar))))
-                 (make-symbol jsvar))))))))
+                   (toplevel-compilation `(= ,(get jsvar "value") ,jsvar)))
+                 jsvar)))))))
 
 
 (define-compilation quote (sexp)
     ((symbolp x)
      (let ((b (lookup-in-lexenv x *environment* 'function)))
        (if b
-          (make-symbol (binding-value b))
+          (binding-value b)
           (convert `(symbol-function ',x)))))))
 
 (defun make-function-binding (fname)
           (extend-lexenv (mapcar #'make-function-binding fnames)
                          *environment*
                          'function)))
-    `(call (function ,(mapcar #'make-symbol (mapcar #'translate-function fnames))
+    `(call (function ,(mapcar #'translate-function fnames)
                 ,(convert-block body t))
            ,@cfuncs)))
 
                          'function)))
     `(selfcall
       ,@(mapcar (lambda (func)
-                  `(var (,(make-symbol (translate-function (car func)))
+                  `(var (,(translate-function (car func))
                           ,(compile-lambda (cadr func)
                                            `((block ,(car func) ,@(cddr func)))))))
                 definitions)
     `(call (function ,(mapcar (lambda (x)
                                 (if (special-variable-p x)
                                     (let ((v (gvarname x)))
-                                      (push (cons x (make-symbol v)) dynamic-bindings)
-                                      (make-symbol v))
-                                    (make-symbol (translate-variable x))))
+                                      (push (cons x v) dynamic-bindings)
+                                      v)
+                                    (translate-variable x)))
                               variables)
                      ,(let ((body (convert-block body t t)))
                            `,(let-binding-wrapper dynamic-bindings body)))
         (convert `(setq ,var ,value))
         (let* ((v (gvarname var))
                (b (make-binding :name var :type 'variable :value v)))
-          (prog1 `(var (,(make-symbol v) ,(convert value)))
+          (prog1 `(var (,v ,(convert value)))
             (push-to-lexenv b *environment* 'variable))))))
 
 ;;; Wrap BODY to restore the symbol values of SYMBOLS after body. It
        (try
         ,@(mapcar (lambda (b)
                     (let ((s (convert `(quote ,(car b)))))
-                      `(var (,(make-symbol (cdr b)) (get ,s "value")))))
+                      `(var (,(cdr b) (get ,s "value")))))
                   store)
         ,body)
        (finally
         ,@(mapcar (lambda (b)
                     (let ((s (convert `(quote ,(car b)))))
-                      `(= (get ,s "value") ,(make-symbol (cdr b)))))
+                      `(= (get ,s "value") ,(cdr b))))
                   store)))))
 
 (define-compilation let* (bindings &rest body)
       (if (member 'used (binding-declarations b))
           `(selfcall
             (try
-             (var (,(make-symbol idvar) #()))
+             (var (,idvar #()))
              ,cbody)
             (catch (cf)
               (if (and (== (get cf "type") "block")
-                       (== (get cf "id") ,(make-symbol idvar)))
+                       (== (get cf "id") ,idvar))
                   ,(if *multiple-value-p*
                        `(return (call (get |values| "apply") this (call |forcemv| (get cf "values"))))
                        `(return (get cf "values")))
       (throw
           (object
            "type" "block"
-           "id" ,(make-symbol (binding-value b))
+           "id" ,(binding-value b)
            "values" ,(convert value multiple-value-p)
            "message" ,(concat "Return from unknown block '" (symbol-name name) "'."))))))
 
         (setq initag (second (binding-value b))))
       `(selfcall
         ;; TAGBODY branch to take
-        (var (,(make-symbol branch) ,initag))
-        (var (,(make-symbol tbidx) #()))
+        (var (,branch ,initag))
+        (var (,tbidx #()))
         (label tbloop
                (while true
                  (try
-                  (switch ,(make-symbol branch)
+                  (switch ,branch
                           ,@(with-collect
                              (collect `(case ,initag))
                              (dolist (form (cdr body))
                           (break tbloop)))
                  (catch (jump)
                    (if (and (== (get jump "type") "tagbody")
-                            (== (get jump "id") ,(make-symbol tbidx)))
-                       (= ,(make-symbol branch) (get jump "label"))
+                            (== (get jump "id") ,tbidx))
+                       (= ,branch (get jump "label"))
                        (throw jump)))))
         (return ,(convert nil))))))
 
       (throw
           (object
            "type" "tagbody"
-           "id" ,(make-symbol (first (binding-value b)))
+           "id" ,(first (binding-value b))
            "label" ,(second (binding-value b))
            "message" ,(concat "Attempt to GO to non-existing tag " n))))))
 
       (error "Bad function designator `~S'" function))
     (cond
       ((translate-function function)
-       `(call ,(make-symbol (translate-function function)) ,@arglist))
+       `(call ,(translate-function function) ,@arglist))
       ((and (symbolp function)
             #+jscl (eq (symbol-package function) (find-package "COMMON-LISP"))
             #-jscl t)
          (let ((b (lookup-in-lexenv sexp *environment* 'variable)))
            (cond
              ((and b (not (member 'special (binding-declarations b))))
-              (make-symbol (binding-value b)))
+              (binding-value b))
              ((or (keywordp sexp)
                   (and b (member 'constant (binding-declarations b))))
               `(get ,(convert `',sexp) "value"))