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