diff --git a/module/language/ecmascript/compile-ghil.scm b/module/language/ecmascript/compile-ghil.scm index 880c79e35..825599d05 100644 --- a/module/language/ecmascript/compile-ghil.scm +++ b/module/language/ecmascript/compile-ghil.scm @@ -114,10 +114,14 @@ args))) ((pref ,obj ,prop) (@impl e l pget (list (comp obj e) (make-ghil-quote e l prop)))) + ((aref ,obj ,index) + (@impl e l pget (list (comp obj e) (comp index e)))) ((= (ref ,name) ,val) (make-ghil-set e l (ghil-var-for-set! e name) (comp val e))) ((= (pref ,obj ,prop) ,val) (@impl e l pput (list (comp obj e) (make-ghil-quote e l prop) (comp val e)))) + ((= (aref ,obj ,prop) ,val) + (@impl e l pput (list (comp obj e) (comp prop e) (comp val e)))) (else (error "compilation not yet implemented:" x))))) diff --git a/module/language/ecmascript/impl.scm b/module/language/ecmascript/impl.scm index 81aa0a661..b770ea668 100644 --- a/module/language/ecmascript/impl.scm +++ b/module/language/ecmascript/impl.scm @@ -47,13 +47,14 @@ (value #:getter js-value #:init-value #f #:init-keyword #:value)) (define-method (pget (o ) p) - (let ((h (hashq-get-handle (js-props o) p))) - (if h - (cdr h) - (let ((proto (js-prototype o))) - (if proto - (pget proto p) - *undefined*))))) + (let ((p (if (string? p) (string->symbol p) p))) + (let ((h (hashq-get-handle (js-props o) p))) + (if h + (cdr h) + (let ((proto (js-prototype o))) + (if proto + (pget proto p) + *undefined*)))))) (define-method (prop-attrs (o ) p) (or (let ((attrs (js-prop-attrs o))) @@ -67,22 +68,18 @@ (memq attr (prop-attrs o p))) (define-method (pput (o ) p v) - (if (prop-has-attr? o p 'ReadOnly) - (throw 'ReferenceError o p) - (hashq-set! (js-props o) p v))) - -;; what the hell is this -(define-method (has-property? (o ) p v) - (if (prop-has-attr? o p 'ReadOnly) - (throw 'ReferenceError o p) - (hashq-set! (js-props o) p v))) + (let ((p (if (string? p) (string->symbol p) p))) + (if (prop-has-attr? o p 'ReadOnly) + (throw 'ReferenceError o p) + (hashq-set! (js-props o) p v)))) (define-method (pdel (o ) p) - (if (prop-has-attr? o p 'DontDelete) - #f - (begin - (pput o p *undefined*) - #t))) + (let ((p (if (string? p) (string->symbol p) p))) + (if (prop-has-attr? o p 'DontDelete) + #f + (begin + (pput o p *undefined*) + #t)))) (define (object->string o error?) (let ((toString (pget o 'toString))) @@ -197,7 +194,8 @@ (if (< p (vector-length v)) (vector-ref v p) (next-method)))) - ((eq? p 'length) + ((or (and (symbol? p) (eq? p 'length)) + (and (string? p) (string=? p "length"))) (vector-length (js-array-vector o))) (else (next-method)))) @@ -211,7 +209,8 @@ (vector-move-left! vect 0 (vector-length vect) new 0) (set! (js-array-vector o) new) (vector-set! new p))))) - ((eq? p 'length) + ((or (and (symbol? p) (eq? p 'length)) + (and (string? p) (string=? p "length"))) (let ((vect (js-array-vector o))) (let ((new (make-vector (->uint32 v) 0))) (vector-move-left! vect 0 (min (vector-length vect) (->uint32 v)) diff --git a/module/language/ecmascript/parse.scm b/module/language/ecmascript/parse.scm index 4c3d447bc..50d70ed3f 100644 --- a/module/language/ecmascript/parse.scm +++ b/module/language/ecmascript/parse.scm @@ -58,8 +58,8 @@ (SourceElement (Statement) -> $1 (FunctionDeclaration) -> $1) - (FunctionDeclaration (function Identifier lparen rparen lbrace FunctionBody rbrace) -> `(var ,$2 (lambda () ,$6)) - (function Identifier lparen FormalParameterList rparen lbrace FunctionBody rbrace) -> `(var ,$2 (lambda ,$4 ,$7))) + (FunctionDeclaration (function Identifier lparen rparen lbrace FunctionBody rbrace) -> `(var (,$2 (lambda () ,$6))) + (function Identifier lparen FormalParameterList rparen lbrace FunctionBody rbrace) -> `(var (,$2 (lambda ,$4 ,$7)))) (FunctionExpression (function lparen rparen lbrace FunctionBody rbrace) -> `(lambda () ,$5) (function Identifier lparen rparen lbrace FunctionBody rbrace) -> `(lambda () ,$6) (function lparen FormalParameterList rparen lbrace FunctionBody rbrace) -> `(lambda ,$3 ,$6)