WebAssembly: Wasm functions should have either JSFunctionType or TypeOfShouldCallGetC...
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Oct 2017 02:13:20 +0000 (02:13 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Oct 2017 02:13:20 +0000 (02:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=178210

Reviewed by Saam Barati.

JSTests:

* wasm/function-tests/trap-from-start-async.js:
(async.StartTrapsAsync):
* wasm/function-tests/trap-from-start.js:
(StartTraps):
* wasm/js-api/web-assembly-function.js:
(assert.eq.Object.getPrototypeOf):
* wasm/js-api/wrapper-function.js:
(return.new.WebAssembly.Module):
(assert.throws.makeInstance): Deleted.
(assert.throws.Bar): Deleted.
(assert.throws): Deleted.

Source/JavaScriptCore:

In Wasm, we have two JS functions exposed to users: WebAssemblyFunction and WebAssemblyWrapperFunction.
The former is an exported wasm function and the latter is an imported & exported function. Since they
have [[Call]], they should be categorized into "function" in typeof operation.

However, these functions do not implement our function protocol correctly. They inherit JSFunction.
But JSType of WebAssemblyFunction is WebAssemblyFunctionType, and one of WebAssemblyWrapperFunction is
ObjectType. Since both do not have TypeOfShouldCallGetCallData, they return "object" when performing
typeof operation.

In this patch, we address the above issue by the following 2 fixes.

1. We add TypeOfShouldCallGetCallData to WebAssemblyFunction. This is the same way how we implement
InternalFunction. Since WebAssemblyFunction requires WebAssemblyFunctionType for fast checking in Wasm
implementation, we cannot make this JSFunctionType.

2. On the other hand, WebAssemblyWrapperFunction does not require a specific JSType. So this patch
changes JSType of WebAssemblyWrapperFunction to JSFunctionType. JSFunctionType can be usable for derived
classes of JSFunction (e.g. JSCustomGetterSetterFunction).

* wasm/js/WebAssemblyFunction.h:
(JSC::WebAssemblyFunction::signatureIndex const): Deleted.
(JSC::WebAssemblyFunction::wasmEntrypointLoadLocation const): Deleted.
(JSC::WebAssemblyFunction::callableFunction const): Deleted.
(JSC::WebAssemblyFunction::jsEntrypoint): Deleted.
(JSC::WebAssemblyFunction::offsetOfWasmEntrypointLoadLocation): Deleted.
* wasm/js/WebAssemblyWrapperFunction.cpp:
(JSC::WebAssemblyWrapperFunction::createStructure):
* wasm/js/WebAssemblyWrapperFunction.h:
(JSC::WebAssemblyWrapperFunction::signatureIndex const): Deleted.
(JSC::WebAssemblyWrapperFunction::wasmEntrypointLoadLocation const): Deleted.
(JSC::WebAssemblyWrapperFunction::callableFunction const): Deleted.
(JSC::WebAssemblyWrapperFunction::function): Deleted.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@223274 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/wasm/function-tests/trap-from-start-async.js
JSTests/wasm/function-tests/trap-from-start.js
JSTests/wasm/js-api/web-assembly-function.js
JSTests/wasm/js-api/wrapper-function.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/wasm/js/WebAssemblyFunction.h
Source/JavaScriptCore/wasm/js/WebAssemblyWrapperFunction.cpp
Source/JavaScriptCore/wasm/js/WebAssemblyWrapperFunction.h

index c4c092c..6da4d8e 100644 (file)
@@ -1,3 +1,22 @@
+2017-10-12  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        WebAssembly: Wasm functions should have either JSFunctionType or TypeOfShouldCallGetCallData
+        https://bugs.webkit.org/show_bug.cgi?id=178210
+
+        Reviewed by Saam Barati.
+
+        * wasm/function-tests/trap-from-start-async.js:
+        (async.StartTrapsAsync):
+        * wasm/function-tests/trap-from-start.js:
+        (StartTraps):
+        * wasm/js-api/web-assembly-function.js:
+        (assert.eq.Object.getPrototypeOf):
+        * wasm/js-api/wrapper-function.js:
+        (return.new.WebAssembly.Module):
+        (assert.throws.makeInstance): Deleted.
+        (assert.throws.Bar): Deleted.
+        (assert.throws): Deleted.
+
 2017-09-29  Filip Pizlo  <fpizlo@apple.com>
 
         Enable gigacage on iOS
index e902d80..83c7f89 100644 (file)
@@ -62,8 +62,8 @@ async function StartTrapsAsync() {
 
     for (let i = 0; i < table.length; ++i) {
         switch (i) {
-        case 4:  assert.isObject(table.get(i)); break;
-        case 5:  assert.isObject(table.get(i)); break;
+        case 4:  assert.isFunction(table.get(i)); break;
+        case 5:  assert.isFunction(table.get(i)); break;
         default: assert.eq(table.get(i), null); break;
         }
     }
index 8d76d9c..ea5a0ac 100644 (file)
@@ -61,8 +61,8 @@ const tableInfo = { element: "anyfunc", initial: 8 };
 
     for (let i = 0; i < table.length; ++i) {
         switch (i) {
-        case 4:  assert.isObject(table.get(i)); break;
-        case 5:  assert.isObject(table.get(i)); break;
+        case 4:  assert.isFunction(table.get(i)); break;
+        case 5:  assert.isFunction(table.get(i)); break;
         default: assert.eq(table.get(i), null); break;
         }
     }
index f9aac9f..3195662 100644 (file)
@@ -18,3 +18,8 @@ const module = new WebAssembly.Module(bin);
 const instance = new WebAssembly.Instance(module);
 
 assert.eq(Object.getPrototypeOf(instance.exports.foo), Function.prototype);
+{
+    assert.truthy(typeof instance.exports.foo === "function", "is_function bytecode should handle wasm function.");
+    let value = typeof instance.exports.foo;
+    assert.eq(value, "function", "the result of typeof should be 'function'");
+}
index 46294e7..e3bc398 100644 (file)
@@ -48,6 +48,11 @@ function exportImport(type) {
         assert.throws(() => new WebAssembly.Instance(module, {imp: {f: instance.exports.func}}), WebAssembly.LinkError, "imported function imp:f signature doesn't match the provided WebAssembly function's signature");
     }
 
+    {
+        assert.truthy(typeof instance.exports.func === "function", "is_function bytecode should handle wrapper function.");
+        let value = typeof instance.exports.func;
+        assert.eq(value, "function", "the result of typeof should be 'function'");
+    }
 }
 
 {
index 9fe00d4..57bee9a 100644 (file)
@@ -1,3 +1,43 @@
+2017-10-12  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        WebAssembly: Wasm functions should have either JSFunctionType or TypeOfShouldCallGetCallData
+        https://bugs.webkit.org/show_bug.cgi?id=178210
+
+        Reviewed by Saam Barati.
+
+        In Wasm, we have two JS functions exposed to users: WebAssemblyFunction and WebAssemblyWrapperFunction.
+        The former is an exported wasm function and the latter is an imported & exported function. Since they
+        have [[Call]], they should be categorized into "function" in typeof operation.
+
+        However, these functions do not implement our function protocol correctly. They inherit JSFunction.
+        But JSType of WebAssemblyFunction is WebAssemblyFunctionType, and one of WebAssemblyWrapperFunction is
+        ObjectType. Since both do not have TypeOfShouldCallGetCallData, they return "object" when performing
+        typeof operation.
+
+        In this patch, we address the above issue by the following 2 fixes.
+
+        1. We add TypeOfShouldCallGetCallData to WebAssemblyFunction. This is the same way how we implement
+        InternalFunction. Since WebAssemblyFunction requires WebAssemblyFunctionType for fast checking in Wasm
+        implementation, we cannot make this JSFunctionType.
+
+        2. On the other hand, WebAssemblyWrapperFunction does not require a specific JSType. So this patch
+        changes JSType of WebAssemblyWrapperFunction to JSFunctionType. JSFunctionType can be usable for derived
+        classes of JSFunction (e.g. JSCustomGetterSetterFunction).
+
+        * wasm/js/WebAssemblyFunction.h:
+        (JSC::WebAssemblyFunction::signatureIndex const): Deleted.
+        (JSC::WebAssemblyFunction::wasmEntrypointLoadLocation const): Deleted.
+        (JSC::WebAssemblyFunction::callableFunction const): Deleted.
+        (JSC::WebAssemblyFunction::jsEntrypoint): Deleted.
+        (JSC::WebAssemblyFunction::offsetOfWasmEntrypointLoadLocation): Deleted.
+        * wasm/js/WebAssemblyWrapperFunction.cpp:
+        (JSC::WebAssemblyWrapperFunction::createStructure):
+        * wasm/js/WebAssemblyWrapperFunction.h:
+        (JSC::WebAssemblyWrapperFunction::signatureIndex const): Deleted.
+        (JSC::WebAssemblyWrapperFunction::wasmEntrypointLoadLocation const): Deleted.
+        (JSC::WebAssemblyWrapperFunction::callableFunction const): Deleted.
+        (JSC::WebAssemblyWrapperFunction::function): Deleted.
+
 2017-10-12  Per Arne Vollan  <pvollan@apple.com>
 
         [Win64] JSC compile error.
index d2f9196..4c6a4c0 100644 (file)
@@ -41,11 +41,11 @@ namespace B3 {
 class Compilation;
 }
 
-class WebAssemblyFunction : public WebAssemblyFunctionBase {
+class WebAssemblyFunction final : public WebAssemblyFunctionBase {
 public:
     using Base = WebAssemblyFunctionBase;
 
-    const static unsigned StructureFlags = Base::StructureFlags;
+    const static unsigned StructureFlags = Base::StructureFlags | TypeOfShouldCallGetCallData;
 
     DECLARE_EXPORT_INFO;
 
index 021c618..f5f8f9c 100644 (file)
@@ -79,7 +79,7 @@ void WebAssemblyWrapperFunction::finishCreation(VM& vm, NativeExecutable* execut
 Structure* WebAssemblyWrapperFunction::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
 {
     ASSERT(globalObject);
-    return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
+    return Structure::create(vm, globalObject, prototype, TypeInfo(JSFunctionType, StructureFlags), info());
 }
 
 void WebAssemblyWrapperFunction::visitChildren(JSCell* cell, SlotVisitor& visitor)
index 5c6c677..e100f71 100644 (file)
@@ -32,7 +32,7 @@
 
 namespace JSC {
 
-class WebAssemblyWrapperFunction : public WebAssemblyFunctionBase {
+class WebAssemblyWrapperFunction final : public WebAssemblyFunctionBase {
 public:
     using Base = WebAssemblyFunctionBase;