diff options
Diffstat (limited to 'module/language/ecmascript/impl.scm')
-rw-r--r-- | module/language/ecmascript/impl.scm | 52 |
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))) |