From bf4fd5a5239efe4931e03f7174a0907aba6f07ef Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20V=C3=A1zquez?= Date: Fri, 26 Apr 2013 18:49:09 +0100 Subject: [PATCH] Simplify literal object dumping --- jscl.lisp | 2 +- src/boot.lisp | 2 ++ src/compiler.lisp | 35 +++++++++++++---------------------- src/toplevel.lisp | 4 ++-- 4 files changed, 18 insertions(+), 25 deletions(-) diff --git a/jscl.lisp b/jscl.lisp index 3a70e2e..51a6ba6 100644 --- a/jscl.lisp +++ b/jscl.lisp @@ -64,7 +64,7 @@ (defun bootstrap () (setq *environment* (make-lexenv)) - (setq *literal-symbols* nil) + (setq *literal-table* nil) (setq *variable-counter* 0 *gensym-counter* 0 *literal-counter* 0 diff --git a/src/boot.lisp b/src/boot.lisp index de32e75..2149308 100644 --- a/src/boot.lisp +++ b/src/boot.lisp @@ -679,7 +679,9 @@ `((,(ecase (car c) (integer 'integerp) (cons 'consp) + (symbol 'symbolp) (string 'stringp) + (array 'arrayp) (atom 'atom) (null 'null)) ,value) diff --git a/src/compiler.lisp b/src/compiler.lisp index 6b334df..36510f9 100644 --- a/src/compiler.lisp +++ b/src/compiler.lisp @@ -527,7 +527,7 @@ output)) -(defvar *literal-symbols* nil) +(defvar *literal-table* nil) (defvar *literal-counter* 0) (defun genlit () @@ -565,27 +565,18 @@ ((integerp sexp) (integer-to-string sexp)) ((floatp sexp) (float-to-string sexp)) ((stringp sexp) (code "\"" (escape-string sexp) "\"")) - ((symbolp sexp) - (or (cdr (assoc sexp *literal-symbols*)) - (let ((v (genlit)) - (s (dump-symbol sexp))) - (push (cons sexp v) *literal-symbols*) - (toplevel-compilation (code "var " v " = " s)) - v))) - ((consp sexp) - (let ((c (dump-cons sexp))) - (if recursive - c - (let ((v (genlit))) - (toplevel-compilation (code "var " v " = " c)) - v)))) - ((arrayp sexp) - (let ((c (dump-array sexp))) - (if recursive - c - (let ((v (genlit))) - (toplevel-compilation (code "var " v " = " c)) - v)))))) + (t + (or (cdr (assoc sexp *literal-table*)) + (let ((dumped (typecase sexp + (symbol (dump-symbol sexp)) + (cons (dump-cons sexp)) + (array (dump-array sexp))))) + (if recursive + dumped + (let ((jsvar (genlit))) + (push (cons sexp jsvar) *literal-table*) + (toplevel-compilation (code "var " jsvar " = " dumped)) + jsvar))))))) (define-compilation quote (sexp) (literal sexp)) diff --git a/src/toplevel.lisp b/src/toplevel.lisp index 0a1b4dd..e5f73f9 100644 --- a/src/toplevel.lisp +++ b/src/toplevel.lisp @@ -97,8 +97,8 @@ (ls-compile `(progn ,@(mapcar (lambda (s) `(%intern-symbol (%js-vref ,(cdr s)))) - *literal-symbols*) - (setq *literal-symbols* ',*literal-symbols*) + *literal-table*) + (setq *literal-table* ',*literal-table*) (setq *variable-counter* ,*variable-counter*) (setq *gensym-counter* ,*gensym-counter*) (setq *block-counter* ,*block-counter*))))) -- 1.7.10.4