summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-02-19 17:14:16 +0100
committerAndy Wingo <wingo@pobox.com>2009-02-19 17:14:16 +0100
commitb72880eb170ccec1177a6c93b1694014ee54a453 (patch)
treec29c5d42518c60e751cb3c0d93037dc134063515
parent984dce236bd742083f3f284c9fe7b93c2df9f908 (diff)
downloadguile-b72880eb170ccec1177a6c93b1694014ee54a453.tar.gz
implement object literals
* module/language/ecmascript/impl.scm: * module/language/ecmascript/compile-ghil.scm (comp): Object literals. * module/language/ecmascript/parse.scm (parse-ecmascript): Fix some object literal parsing.
-rw-r--r--module/language/ecmascript/compile-ghil.scm11
-rw-r--r--module/language/ecmascript/impl.scm10
-rw-r--r--module/language/ecmascript/parse.scm10
3 files changed, 25 insertions, 6 deletions
diff --git a/module/language/ecmascript/compile-ghil.scm b/module/language/ecmascript/compile-ghil.scm
index 1b90f48c5..880c79e35 100644
--- a/module/language/ecmascript/compile-ghil.scm
+++ b/module/language/ecmascript/compile-ghil.scm
@@ -101,6 +101,17 @@
(make-ghil-inline e l 'return (list (comp expr e))))
((array . ,args)
(@impl e l new-array (map (lambda (x) (comp x e)) args)))
+ ((object . ,args)
+ (@impl e l new-object
+ (map (lambda (x)
+ (pmatch x
+ ((,prop ,val)
+ (make-ghil-inline e l 'cons
+ (list (make-ghil-quote e l prop)
+ (comp val e))))
+ (else
+ (error "bad prop-val pair" x))))
+ args)))
((pref ,obj ,prop)
(@impl e l pget (list (comp obj e) (make-ghil-quote e l prop))))
((= (ref ,name) ,val)
diff --git a/module/language/ecmascript/impl.scm b/module/language/ecmascript/impl.scm
index 65a46fa80..81aa0a661 100644
--- a/module/language/ecmascript/impl.scm
+++ b/module/language/ecmascript/impl.scm
@@ -31,7 +31,8 @@
->primitive ->boolean ->number ->integer ->int32 ->uint32
->uint16 ->string ->object
- new-array))
+ new-array
+ new-object))
(define *undefined* ((@@ (oop goops) make-unbound)))
@@ -227,3 +228,10 @@
(vector-set! vect i (car vals))
(lp (1+ i) (cdr vals)))
(else o))))))
+
+(define (new-object . pairs)
+ (let ((o (make <js-object>)))
+ (map (lambda (pair)
+ (pput o (car pair) (cdr pair)))
+ pairs)
+ o))
diff --git a/module/language/ecmascript/parse.scm b/module/language/ecmascript/parse.scm
index d034f7f4f..4c3d447bc 100644
--- a/module/language/ecmascript/parse.scm
+++ b/module/language/ecmascript/parse.scm
@@ -199,11 +199,11 @@
(ObjectLiteral (lbrace rbrace) -> `(object)
(lbrace PropertyNameAndValueList rbrace) -> `(object ,@$2))
- (PropertyNameAndValueList (PropertyName colon AssignmentExpression) -> `((,$1 . ,$3))
- (PropertyNameAndValueList comma PropertyName colon AssignmentExpression) -> `(,@$1 (,$3 . ,$5)))
- (PropertyName (Identifier) -> `(ref ,$1)
- (StringLiteral) -> `(string ,$1)
- (NumericLiteral) -> `(number ,$1))
+ (PropertyNameAndValueList (PropertyName colon AssignmentExpression) -> `((,$1 ,$3))
+ (PropertyNameAndValueList comma PropertyName colon AssignmentExpression) -> `(,@$1 (,$3 ,$5)))
+ (PropertyName (Identifier) -> $1
+ (StringLiteral) -> (string->symbol $1)
+ (NumericLiteral) -> $1)
(MemberExpression (PrimaryExpression) -> $1
(FunctionExpression) -> $1