From: David Vázquez Date: Sun, 23 Jun 2013 20:47:40 +0000 (+0200) Subject: Migrate storage vector primitives X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=51f2f4c852be16da996c99b6ee687dd0ceef475f;p=jscl.git Migrate storage vector primitives --- diff --git a/src/compiler-codegen.lisp b/src/compiler-codegen.lisp index 332e51f..14113c6 100644 --- a/src/compiler-codegen.lisp +++ b/src/compiler-codegen.lisp @@ -161,7 +161,7 @@ (unless (or (symbolp x) (nth-value 1 (valid-js-identifier x)) (and (consp x) - (member (car x) '(get =)))) + (member (car x) '(get = property)))) (error "Bad Javascript lvalue ~S" x))) ;;; Process the Javascript AST to reduce some syntax sugar. @@ -230,6 +230,11 @@ (js-expr operand))))) (js-format ")")) ;; Accessors + (property + (js-expr (car args)) + (js-format "[") + (js-expr (cadr args)) + (js-format "]")) (get (multiple-value-bind (identifier identifierp) (valid-js-identifier (car args)) diff --git a/src/compiler.lisp b/src/compiler.lisp index 3d31ab2..f58fe1a 100644 --- a/src/compiler.lisp +++ b/src/compiler.lisp @@ -1245,42 +1245,43 @@ (define-builtin storage-vector-p (x) (js!bool - (js!selfcall - "var x = " x ";" - "return typeof x === 'object' && 'length' in x;"))) + (js!selfcall* + `(var (x ,x)) + `(return (and (=== (typeof x) "object") (in "length" x)))))) (define-builtin make-storage-vector (n) - (js!selfcall - "var r = [];" - "r.length = " n ";" - "return r;" )) + (js!selfcall* + `(var (r #())) + `(= (get r "length") ,n) + `(return r))) (define-builtin storage-vector-size (x) - `(code ,x ".length")) + `(get ,x "length")) (define-builtin resize-storage-vector (vector new-size) - `(code "(" ,vector ".length = " ,new-size ")")) + `(= (get ,vector "length") ,new-size)) (define-builtin storage-vector-ref (vector n) - (js!selfcall - "var x = " "(" vector ")[" n "];" - "if (x === undefined) throw 'Out of range';" - "return x;" )) + (js!selfcall* + `(var (x (get ,vector ,n))) + `(if (=== x undefined) (throw "Out of range.")) + `(return x))) (define-builtin storage-vector-set (vector n value) - (js!selfcall - "var x = " vector ";" - "var i = " n ";" - "if (i < 0 || i >= x.length) throw 'Out of range';" - "return x[i] = " value ";" )) + (js!selfcall* + `(var (x ,vector)) + `(var (i ,n)) + `(if (or (< i 0) (>= i (get x "length"))) + (throw "Out of range.")) + `(return (= (property x i) ,value)))) (define-builtin concatenate-storage-vector (sv1 sv2) - (js!selfcall - "var sv1 = " sv1 ";" - "var r = sv1.concat(" sv2 ");" - "r.type = sv1.type;" - "r.stringp = sv1.stringp;" - "return r;" )) + (js!selfcall* + `(var (sv1 ,sv1)) + `(var (r (call (get sv1 "concat") ,sv2))) + `(= (get r "type") (get sv1 "type")) + `(= (get r "stringp") (get sv1 "stringp")) + `(return r))) (define-builtin get-internal-real-time () "(new Date()).getTime()")