summaryrefslogtreecommitdiff
path: root/module/language/ecmascript/impl.scm
diff options
context:
space:
mode:
Diffstat (limited to 'module/language/ecmascript/impl.scm')
-rw-r--r--module/language/ecmascript/impl.scm52
1 files changed, 51 insertions, 1 deletions
diff --git a/module/language/ecmascript/impl.scm b/module/language/ecmascript/impl.scm
index d4b936c6c..737639fd4 100644
--- a/module/language/ecmascript/impl.scm
+++ b/module/language/ecmascript/impl.scm
@@ -28,7 +28,7 @@
pget pput pdel has-property?
->boolean
new-object new new-array)
- #:export (get-this
+ #:export (js-init get-this
typeof
bitwise-not logical-not
shift
@@ -36,6 +36,44 @@
band bxor bior))
+(define-class <js-global-object> (<js-object>))
+(define-method (pget (o <js-global-object>) (p <string>))
+ (pget o (string->symbol p)))
+(define-method (pget (o <js-global-object>) (p <symbol>))
+ (let ((v (module-variable (current-module) p)))
+ (if v
+ (variable-ref v)
+ (next-method))))
+(define-method (pput (o <js-global-object>) (p <string>) v)
+ (pput o (string->symbol p) v))
+(define-method (pput (o <js-global-object>) (p <symbol>) v)
+ (module-define! (current-module) p v))
+(define-method (prop-attrs (o <js-global-object>) (p <symbol>))
+ (cond ((module-local-variable (current-module) p)
+ '())
+ ((module-variable (current-module) p)
+ '(DontDelete ReadOnly))
+ (else (next-method))))
+(define-method (prop-attrs (o <js-global-object>) (p <string>))
+ (prop-attrs o (string->symbol p)))
+
+(define (init-js-bindings! mod)
+ (module-define! mod 'NaN +nan.0)
+ (module-define! mod 'Infinity +inf.0)
+ (module-define! mod 'undefined *undefined*)
+ ;; isNAN, isFinite, parseFloat, parseInt, eval
+ ;; decodeURI, decodeURIComponent, encodeURI, encodeURIComponent
+ ;; Object Function Array String Boolean Number Date RegExp Error EvalError
+ ;; RangeError ReferenceError SyntaxError TypeError URIError
+ (module-define! mod 'Object *object-prototype*)
+ (module-define! mod 'Array *array-prototype*))
+
+(define (js-init)
+ (cond ((get-this))
+ (else
+ (fluid-set! *this* (make <js-global-object>))
+ (init-js-bindings! (current-module)))))
+
(define (get-this)
(fluid-ref *this*))
@@ -60,3 +98,15 @@
(define bior logior)
(define mod modulo)
+
+(define-method (+ (a <string>) (b <string>))
+ (string-append a b))
+
+(define-method (+ (a <string>) b)
+ (string-append a (->string b)))
+
+(define-method (+ a (b <string>))
+ (string-append (->string a) b))
+
+(define-method (+ a b)
+ (+ (->number a) (->number b)))