[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 3/4] Implement ecmascript function prototype.
From: |
Sean Lynch |
Subject: |
[PATCH 3/4] Implement ecmascript function prototype. |
Date: |
Wed, 28 Oct 2020 00:03:33 -0400 |
Per section 19.2.4.3 of the 2020 ECMAScript specification, functions
that can be used as a constructor must have a fresh prototype.
* module/language/ecmascript/compile-tree-il.scm: Use make-js-function
procedure when creating an ecmascript function. This provides the
function with a fresh prototype.
* module/language/ecmascript/function.scm: Adds a make-js-function
procedure that given a procedure provides a program-wrapper with a
fresh prototype object, and optionally a name property.
---
module/language/ecmascript/compile-tree-il.scm | 12 +++++++-----
module/language/ecmascript/function.scm | 7 ++++++-
2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/module/language/ecmascript/compile-tree-il.scm
b/module/language/ecmascript/compile-tree-il.scm
index 6f6af5210..48dca3166 100644
--- a/module/language/ecmascript/compile-tree-il.scm
+++ b/module/language/ecmascript/compile-tree-il.scm
@@ -19,6 +19,7 @@
;;; Code:
(define-module (language ecmascript compile-tree-il)
+ #:use-module (language ecmascript function)
#:use-module (language tree-il)
#:use-module (ice-9 receive)
#:use-module (system base pmatch)
@@ -349,12 +350,13 @@
(let ((syms (map (lambda (x)
(gensym (string-append (symbol->string x) " ")))
formals)))
- `(lambda ()
- (lambda-case
- ((() ,formals #f #f ,(map (lambda (x) (@implv *undefined*))
formals) ,syms)
- ,(with-return-prompt
+ `(call (@ (language ecmascript function) make-js-function)
(lambda ()
- (comp-body e body formals syms))))))))
+ (lambda-case
+ ((() ,formals #f #f ,(map (lambda (x) (@implv
*undefined*)) formals) ,syms)
+ ,(with-return-prompt
+ (lambda ()
+ (comp-body e body formals syms)))))))))
((try (block . ,body)
(catch ,err (block . ,catch))
,finally)
diff --git a/module/language/ecmascript/function.scm
b/module/language/ecmascript/function.scm
index 72edc4e61..fd0b980b6 100644
--- a/module/language/ecmascript/function.scm
+++ b/module/language/ecmascript/function.scm
@@ -21,8 +21,13 @@
(define-module (language ecmascript function)
#:use-module (oop goops)
#:use-module (language ecmascript base)
- #:export (*function-prototype* *program-wrappers*))
+ #:export (*function-prototype* *program-wrappers*
+ make-js-function))
+(define* (make-js-function proc #:optional name)
+ (pput proc 'prototype (make <js-object>))
+ (pput proc 'name (or name ""))
+ proc)
(define-class <js-program-wrapper> (<js-object>))
--
2.29.1