guile-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]