summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-02-19 17:25:52 +0100
committerAndy Wingo <wingo@pobox.com>2009-02-19 17:25:52 +0100
commitcdad2166e73b91b8fce2c99d7c6878f65b349f99 (patch)
tree4e9851407642033214c49158f912082325ae9ca3
parentb72880eb170ccec1177a6c93b1694014ee54a453 (diff)
downloadguile-cdad2166e73b91b8fce2c99d7c6878f65b349f99.tar.gz
support foo["bar"] in addition to foo.bar
* module/language/ecmascript/parse.scm (parse-ecmascript): And update the function declaration forms for the new var syntax. * module/language/ecmascript/compile-ghil.scm (comp): Support foo["bar"] in addition to foo.bar. * module/language/ecmascript/impl.scm (pget, pput): Some fixes for when we get non-symbols -- it can happen, yo. I suppose we should allow for non-string keys too..
-rw-r--r--module/language/ecmascript/compile-ghil.scm4
-rw-r--r--module/language/ecmascript/impl.scm45
-rw-r--r--module/language/ecmascript/parse.scm4
3 files changed, 28 insertions, 25 deletions
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 <js-object>) 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 <js-object>) p)
(or (let ((attrs (js-prop-attrs o)))
@@ -67,22 +68,18 @@
(memq attr (prop-attrs o p)))
(define-method (pput (o <js-object>) 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 <js-object>) 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 <js-object>) 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)