From: Lady <redacted>
Date: Tue, 5 Sep 2023 00:27:48 +0000 (-0400)
Subject: Cast to function name in createCallableFunction
X-Git-Url: https://git.ladys.computer/Pisces/commitdiff_plain/393f4d07436fec754c9863fddf98b8503afdb2c9?ds=inline

Cast to function name in createCallableFunction

This requires moving the definition of `toFunctionName` inside the same
closure as `createCallableFunction` to ensure that it is defined before
`createCallableFunction` is called (e·g when defining
`ordinaryHasInstance`).
---

diff --git a/function.js b/function.js
index d5888eb..efb3871 100644
--- a/function.js
+++ b/function.js
@@ -37,6 +37,12 @@ export const {
    * the provided value.
    */
   createIllegalConstructor,
+
+  /**
+   * Returns a string function name generated from the provided value
+   * and optional prefix.
+   */
+  toFunctionName,
 } = (() => {
   // ☡ Because these functions are used to initialize module constants,
   // they can’t depend on imports from elsewhere.
@@ -50,6 +56,7 @@ export const {
   const {
     create: objectCreate,
     defineProperties: defineOwnProperties,
+    getOwnPropertyDescriptor,
     getPrototypeOf: getPrototype,
     setPrototypeOf: setPrototype,
   } = Object;
@@ -67,6 +74,11 @@ export const {
       };
     },
   };
+  const getSymbolDescription = getOwnPropertyDescriptor(
+    Symbol.prototype,
+    "description",
+  ).get;
+
   return {
     bind: ($, boundThis, boundArgs) =>
       callBind(
@@ -80,7 +92,11 @@ export const {
     createCallableFunction: ($, name = undefined) =>
       defineOwnProperties(callBind(functionCall, $), {
         length: { value: $.length + 1 },
-        name: { value: name ?? $.name ?? "" },
+        name: {
+          value: toFunctionName(
+            name === undefined ? $.name ?? "" : name,
+          ),
+        },
       }),
     createIllegalConstructor: ($, proto = undefined) => {
       const constructor = function () {
@@ -107,6 +123,20 @@ export const {
         prototype: { value: $?.prototype ?? {}, writable: false },
       });
     },
+    toFunctionName: ($, prefix = undefined) => {
+      const name = (() => {
+        if (typeof $ === "symbol") {
+          // The provided value is a symbol; format its description.
+          const description = call(getSymbolDescription, $, []);
+          return description === undefined ? "" : `[${description}]`;
+        } else {
+          // The provided value not a symbol; convert it to a string
+          // property key.
+          return `${$}`;
+        }
+      })();
+      return prefix !== undefined ? `${prefix} ${name}` : name;
+    },
   };
 })();
 
@@ -199,33 +229,3 @@ export const ordinaryHasInstance = createCallableFunction(
   Function.prototype[Symbol.hasInstance],
   "ordinaryHasInstance",
 );
-
-export const {
-  /**
-   * Returns a string function name generated from the provided value
-   * and optional prefix.
-   */
-  toFunctionName,
-} = (() => {
-  const getSymbolDescription = Object.getOwnPropertyDescriptor(
-    Symbol.prototype,
-    "description",
-  ).get;
-
-  return {
-    toFunctionName: ($, prefix = undefined) => {
-      const name = (() => {
-        if (typeof $ === "symbol") {
-          // The provided value is a symbol; format its description.
-          const description = call(getSymbolDescription, $, []);
-          return description === undefined ? "" : `[${description}]`;
-        } else {
-          // The provided value not a symbol; convert it to a string
-          // property key.
-          return `${$}`;
-        }
-      })();
-      return prefix !== undefined ? `${prefix} ${name}` : name;
-    },
-  };
-})();