WebAssembly: exports is a getter
authorjfbastien@apple.com <jfbastien@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 May 2017 05:27:28 +0000 (05:27 +0000)
committerjfbastien@apple.com <jfbastien@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 May 2017 05:27:28 +0000 (05:27 +0000)
https://bugs.webkit.org/show_bug.cgi?id=172129

Reviewed by Saam Barati.

JSTests:

Update test to reflect new semantics.

* wasm/js-api/test_basic_api.js:
(const.c.in.constructorProperties.switch):

Source/JavaScriptCore:

As updated here: https://github.com/WebAssembly/design/pull/1062

* wasm/js/JSWebAssemblyInstance.cpp:
(JSC::JSWebAssemblyInstance::finishCreation): don't putDirect here anymore
* wasm/js/JSWebAssemblyInstance.h:
(JSC::JSWebAssemblyInstance::moduleNamespaceObject): add accessor
* wasm/js/WebAssemblyFunctionBase.cpp: squelch causing a warning
* wasm/js/WebAssemblyInstancePrototype.cpp: use LUT
(JSC::getInstance): helper, as in surrounding files
(JSC::webAssemblyInstanceProtoFuncExports): instead of putDirect
* wasm/js/WebAssemblyMemoryPrototype.cpp: pass VM around as for Table
(JSC::getMemory):
(JSC::webAssemblyMemoryProtoFuncGrow):
(JSC::webAssemblyMemoryProtoFuncBuffer):
* wasm/js/WebAssemblyTablePrototype.cpp: static everywhere as with other code
(JSC::webAssemblyTableProtoFuncLength):
(JSC::webAssemblyTableProtoFuncGrow):
(JSC::webAssemblyTableProtoFuncGet):
(JSC::webAssemblyTableProtoFuncSet):

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

JSTests/ChangeLog
JSTests/wasm/js-api/test_basic_api.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp
Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h
Source/JavaScriptCore/wasm/js/WebAssemblyInstancePrototype.cpp
Source/JavaScriptCore/wasm/js/WebAssemblyMemoryPrototype.cpp
Source/JavaScriptCore/wasm/js/WebAssemblyTablePrototype.cpp

index feeb7f6..6517676 100644 (file)
@@ -1,3 +1,15 @@
+2017-05-18  JF Bastien  <jfbastien@apple.com>
+
+        WebAssembly: exports is a getter
+        https://bugs.webkit.org/show_bug.cgi?id=172129
+
+        Reviewed by Saam Barati.
+
+        Update test to reflect new semantics.
+
+        * wasm/js-api/test_basic_api.js:
+        (const.c.in.constructorProperties.switch):
+
 2017-05-18  Saam Barati  <sbarati@apple.com>
 
         Proxy's [[Get]] passes incorrect receiver
index 6d13a4c..08e74aa 100644 (file)
@@ -14,6 +14,14 @@ const checkOwnPropertyDescriptor = (obj, prop, expect) => {
     assert.eq(descriptor.enumerable, expect.enumerable);
 };
 
+const checkAccessorOwnPropertyDescriptor = (obj, prop, expect) => {
+    const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
+    assert.eq(typeof descriptor.value, "undefined");
+    assert.eq(typeof descriptor.writable, "undefined");
+    assert.eq(descriptor.configurable, expect.configurable);
+    assert.eq(descriptor.enumerable, expect.enumerable);
+};
+
 const functionProperties = {
     "validate": { length: 1 },
     "compile":  { length: 1 },
@@ -70,7 +78,9 @@ for (const c in constructorProperties) {
         for (const invalid of invalidInstanceImports)
             assert.throws(() => new WebAssembly[c](new WebAssembly.Module(emptyModuleArray), invalid), TypeError, `second argument to WebAssembly.Instance must be undefined or an Object (evaluating 'new WebAssembly[c](new WebAssembly.Module(emptyModuleArray), invalid)')`);
         assert.isNotUndef(instance.exports);
-        checkOwnPropertyDescriptor(instance, "exports", { typeofvalue: "object", writable: true, configurable: true, enumerable: true });
+        checkAccessorOwnPropertyDescriptor(WebAssembly.Instance.prototype, "exports", { configurable: true, enumerable: false });
+        assert.throws(() => WebAssembly.Instance.prototype.exports = undefined, TypeError, `Attempted to assign to readonly property.`);
+        assert.throws(() => WebAssembly.Instance.prototype.exports, TypeError, `expected |this| value to be an instance of WebAssembly.Instance`);
         assert.isUndef(instance.exports.__proto__);
         assert.eq(Reflect.isExtensible(instance.exports), false);
         assert.eq(Symbol.iterator in instance.exports, false);
index f456a98..50a3eb8 100644 (file)
@@ -1,3 +1,30 @@
+2017-05-18  JF Bastien  <jfbastien@apple.com>
+
+        WebAssembly: exports is a getter
+        https://bugs.webkit.org/show_bug.cgi?id=172129
+
+        Reviewed by Saam Barati.
+
+        As updated here: https://github.com/WebAssembly/design/pull/1062
+
+        * wasm/js/JSWebAssemblyInstance.cpp:
+        (JSC::JSWebAssemblyInstance::finishCreation): don't putDirect here anymore
+        * wasm/js/JSWebAssemblyInstance.h:
+        (JSC::JSWebAssemblyInstance::moduleNamespaceObject): add accessor
+        * wasm/js/WebAssemblyFunctionBase.cpp: squelch causing a warning
+        * wasm/js/WebAssemblyInstancePrototype.cpp: use LUT
+        (JSC::getInstance): helper, as in surrounding files
+        (JSC::webAssemblyInstanceProtoFuncExports): instead of putDirect
+        * wasm/js/WebAssemblyMemoryPrototype.cpp: pass VM around as for Table
+        (JSC::getMemory):
+        (JSC::webAssemblyMemoryProtoFuncGrow):
+        (JSC::webAssemblyMemoryProtoFuncBuffer):
+        * wasm/js/WebAssemblyTablePrototype.cpp: static everywhere as with other code
+        (JSC::webAssemblyTableProtoFuncLength):
+        (JSC::webAssemblyTableProtoFuncGrow):
+        (JSC::webAssemblyTableProtoFuncGet):
+        (JSC::webAssemblyTableProtoFuncSet):
+
 2017-05-18  Saam Barati  <sbarati@apple.com>
 
         Proxy's [[Get]] passes incorrect receiver
index 3f8c3de..c8e2d6e 100644 (file)
@@ -69,7 +69,6 @@ void JSWebAssemblyInstance::finishCreation(VM& vm, JSWebAssemblyModule* module,
 
     m_moduleNamespaceObject.set(vm, this, moduleNamespaceObject);
     m_callee.set(vm, this, module->callee());
-    putDirect(vm, Identifier::fromString(&vm, "exports"), moduleNamespaceObject, None);
 }
 
 void JSWebAssemblyInstance::destroy(JSCell* cell)
index 23df6cf..3cfe549 100644 (file)
@@ -55,6 +55,8 @@ public:
 
     JSObject* importFunction(unsigned idx) { RELEASE_ASSERT(idx < m_numImportFunctions); return importFunctions()[idx].get(); }
 
+    JSModuleNamespaceObject* moduleNamespaceObject() { return m_moduleNamespaceObject.get(); }
+
     JSWebAssemblyMemory* memory() { return m_memory.get(); }
     void setMemory(VM& vm, JSWebAssemblyMemory* value) { ASSERT(!memory()); m_memory.set(vm, this, value); }
     Wasm::MemoryMode memoryMode() { return memory()->memory().mode(); }
index 4777a61..3ceccc9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 
 #include "FunctionPrototype.h"
 #include "JSCInlines.h"
+#include "JSModuleNamespaceObject.h"
+#include "JSWebAssemblyInstance.h"
+
+namespace JSC {
+static EncodedJSValue JSC_HOST_CALL webAssemblyInstanceProtoFuncExports(ExecState*);
+}
 
 #include "WebAssemblyInstancePrototype.lut.h"
 
@@ -39,9 +45,32 @@ const ClassInfo WebAssemblyInstancePrototype::s_info = { "WebAssembly.Instance.p
 
 /* Source for WebAssemblyInstancePrototype.lut.h
  @begin prototypeTableWebAssemblyInstance
+ exports webAssemblyInstanceProtoFuncExports DontEnum|Accessor 0
  @end
  */
 
+static ALWAYS_INLINE JSWebAssemblyInstance* getInstance(ExecState* exec, VM& vm, JSValue v)
+{
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+    JSWebAssemblyInstance* result = jsDynamicCast<JSWebAssemblyInstance*>(vm, v);
+    if (!result) {
+        throwException(exec, throwScope, 
+            createTypeError(exec, ASCIILiteral("expected |this| value to be an instance of WebAssembly.Instance")));
+        return nullptr;
+    }
+    return result;
+}
+
+static EncodedJSValue JSC_HOST_CALL webAssemblyInstanceProtoFuncExports(ExecState* exec)
+{
+    VM& vm = exec->vm();
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+
+    JSWebAssemblyInstance* instance = getInstance(exec, vm, exec->thisValue()); 
+    RETURN_IF_EXCEPTION(throwScope, { });
+    return JSValue::encode(instance->moduleNamespaceObject());
+}
+
 WebAssemblyInstancePrototype* WebAssemblyInstancePrototype::create(VM& vm, JSGlobalObject*, Structure* structure)
 {
     auto* object = new (NotNull, allocateCell<WebAssemblyInstancePrototype>(vm.heap)) WebAssemblyInstancePrototype(vm, structure);
index 822f63b..4745ebe 100644 (file)
@@ -53,9 +53,8 @@ const ClassInfo WebAssemblyMemoryPrototype::s_info = { "WebAssembly.Memory.proto
 @end
 */
 
-ALWAYS_INLINE JSWebAssemblyMemory* getMemory(ExecState* exec, JSValue value)
+ALWAYS_INLINE JSWebAssemblyMemory* getMemory(ExecState* exec, VM& vm, JSValue value)
 {
-    VM& vm = exec->vm();
     auto throwScope = DECLARE_THROW_SCOPE(vm);
 
     JSWebAssemblyMemory* memory = jsDynamicCast<JSWebAssemblyMemory*>(vm, value); 
@@ -72,7 +71,7 @@ EncodedJSValue JSC_HOST_CALL webAssemblyMemoryProtoFuncGrow(ExecState* exec)
     VM& vm = exec->vm();
     auto throwScope = DECLARE_THROW_SCOPE(vm);
 
-    JSWebAssemblyMemory* memory = getMemory(exec, exec->thisValue()); 
+    JSWebAssemblyMemory* memory = getMemory(exec, vm, exec->thisValue()); 
     RETURN_IF_EXCEPTION(throwScope, { });
     
     uint32_t delta = toNonWrappingUint32(exec, exec->argument(0));
@@ -90,7 +89,7 @@ EncodedJSValue JSC_HOST_CALL webAssemblyMemoryProtoFuncBuffer(ExecState* exec)
     VM& vm = exec->vm();
     auto throwScope = DECLARE_THROW_SCOPE(vm);
 
-    JSWebAssemblyMemory* memory = getMemory(exec, exec->thisValue()); 
+    JSWebAssemblyMemory* memory = getMemory(exec, vm, exec->thisValue()); 
     RETURN_IF_EXCEPTION(throwScope, { });
     return JSValue::encode(memory->buffer(exec->vm(), exec->lexicalGlobalObject()));
 }
index 15e580f..a91c376 100644 (file)
@@ -67,7 +67,7 @@ static ALWAYS_INLINE JSWebAssemblyTable* getTable(ExecState* exec, VM& vm, JSVal
     return result;
 }
 
-EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncLength(ExecState* exec)
+static EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncLength(ExecState* exec)
 {
     VM& vm = exec->vm();
     auto throwScope = DECLARE_THROW_SCOPE(vm);
@@ -77,7 +77,7 @@ EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncLength(ExecState* exec)
     return JSValue::encode(jsNumber(table->size()));
 }
 
-EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncGrow(ExecState* exec)
+static EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncGrow(ExecState* exec)
 {
     VM& vm = exec->vm();
     auto throwScope = DECLARE_THROW_SCOPE(vm);
@@ -93,7 +93,7 @@ EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncGrow(ExecState* exec)
     return JSValue::encode(jsUndefined());
 }
 
-EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncGet(ExecState* exec)
+static EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncGet(ExecState* exec)
 {
     VM& vm = exec->vm();
     auto throwScope = DECLARE_THROW_SCOPE(vm);
@@ -111,7 +111,7 @@ EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncGet(ExecState* exec)
     return JSValue::encode(jsNull());
 }
 
-EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncSet(ExecState* exec)
+static EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncSet(ExecState* exec)
 {
     VM& vm = exec->vm();
     auto throwScope = DECLARE_THROW_SCOPE(vm);