diff options
-rw-r--r-- | module/language/ecmascript/compile-ghil.scm | 11 | ||||
-rw-r--r-- | module/language/ecmascript/impl.scm | 10 | ||||
-rw-r--r-- | module/language/ecmascript/parse.scm | 10 |
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 |