Better GET and PROPERTY handling
authorDavid Vázquez <davazp@gmail.com>
Sat, 29 Jun 2013 16:26:39 +0000 (18:26 +0200)
committerDavid Vázquez <davazp@gmail.com>
Sat, 29 Jun 2013 16:26:39 +0000 (18:26 +0200)
src/compiler-codegen.lisp
src/compiler.lisp

index d8d442f..4552430 100644 (file)
        (js-format "~a" (apply #'code args)))
       ;; Accessors
       (property
-       (js-expr (car args))
+       (js-expr (car args) 0)
        (js-format "[")
        (js-expr (cadr args) no-comma)
        (js-format "]"))
       (get
-       (multiple-value-bind (identifier identifierp)
-           (valid-js-identifier (car args))
-         (multiple-value-bind (accessor accessorp)
-             (valid-js-identifier (cadr args))
-           (cond
-             ((and identifierp accessorp)
-              (js-identifier identifier)
-              (js-format ".")
-              (js-identifier accessor))
-             (t
-              (js-expr (car args))
-              (js-format "[")
-              (js-expr (cadr args))
-              (js-format "]"))))))      
+       (multiple-value-bind (accessor accessorp)
+           (valid-js-identifier (cadr args))
+         (unless accessorp
+           (error "Invalid accessor ~S" (cadr args)))
+         (js-expr (car args) 0)
+         (js-format ".")
+         (js-identifier accessor)))      
       ;; Function call
       (call
        (js-expr (car args) 1)
index 09ca814..0a01e5d 100644 (file)
   (if (or name docstring)
       (js!selfcall*
         `(var (func ,code))
-        (when name      `(= (get func |fname|) ,name))
-        (when docstring `(= (get func |docstring|) ,docstring))
+        (when name      `(= (get func "fname") ,name))
+        (when docstring `(= (get func "docstring") ,docstring))
         `(return func))
       code))
 
     `(try
       ,(ls-compile-block body t))
     `(catch (|cf|)
-       (if (and (== (get |cf| |type|) "catch")
-                (== (get |cf| |id|) |id|))
+       (if (and (== (get |cf| "type") "catch")
+                (== (get |cf| "id") |id|))
            ,(if *multiple-value-p*
-                `(return (call (get |values| |apply|)
+                `(return (call (get |values| "apply")
                                this
-                               (call |forcemv| (get |cf| |values|))))
-                `(return (call (get |pv| |apply|)
+                               (call |forcemv| (get |cf| "values"))))
+                `(return (call (get |pv| "apply")
                                this
-                               (call |forcemv| (get |cf| |values|)))))
+                               (call |forcemv| (get |cf| "values")))))
            (throw |cf|)))))
 
 (define-compilation throw (id value)
 
 (define-builtin storage-vector-ref (vector n)
   (js!selfcall*
-    `(var (x (get ,vector ,n)))
+    `(var (x (property ,vector ,n)))
     `(if (=== x undefined) (throw "Out of range."))
     `(return x)))
 
 (define-raw-builtin oget* (object key &rest keys)
   (js!selfcall*
     `(progn
-       (var (tmp (get ,(ls-compile object) (call |xstring| ,(ls-compile key)))))
+       (var (tmp (property ,(ls-compile object) (call |xstring| ,(ls-compile key)))))
        ,@(mapcar (lambda (key)
                    `(progn
                       (if (=== tmp undefined) (return ,(ls-compile nil)))
-                      (= tmp (get tmp (call |xstring| ,(ls-compile key))))))
+                      (= tmp (property tmp (call |xstring| ,(ls-compile key))))))
                  keys))
     `(return (if (=== tmp undefined) ,(ls-compile nil) tmp))))
 
          (var (obj ,(ls-compile object)))
          ,@(mapcar (lambda (key)
                      `(progn
-                        (= obj (get obj (call |xstring| ,(ls-compile key))))
+                        (= obj (property obj (call |xstring| ,(ls-compile key))))
                         (if (=== object undefined)
                             (throw "Impossible to set object property."))))
                    (butlast keys))
          (var (tmp
-               (= (get obj (call |xstring| ,(ls-compile (car (last keys)))))
+               (= (property obj (call |xstring| ,(ls-compile (car (last keys)))))
                   ,(ls-compile value))))
          (return (if (=== tmp undefined)
                      ,(ls-compile nil)