[JSC] Allow indexed module namespace object fields
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 6 Mar 2017 17:26:35 +0000 (17:26 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 6 Mar 2017 17:26:35 +0000 (17:26 +0000)
https://bugs.webkit.org/show_bug.cgi?id=168870

Reviewed by Saam Barati.

JSTests:

* wasm/spec-tests/names.wast.js:

Source/JavaScriptCore:

While JS modules cannot expose any indexed bindings,
Wasm modules can expose them. However, module namespace
object currently does not support indexed properties.
This patch allows module namespace objects to offer
indexed binding accesses.

* runtime/JSModuleNamespaceObject.cpp:
(JSC::JSModuleNamespaceObject::getOwnPropertySlotCommon):
(JSC::JSModuleNamespaceObject::getOwnPropertySlot):
(JSC::JSModuleNamespaceObject::getOwnPropertySlotByIndex):
* runtime/JSModuleNamespaceObject.h:

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

JSTests/ChangeLog
JSTests/wasm/spec-tests/names.wast.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/JSModuleNamespaceObject.cpp
Source/JavaScriptCore/runtime/JSModuleNamespaceObject.h

index 7fe8a41..0d97a2e 100644 (file)
@@ -1,5 +1,14 @@
 2017-03-06  Yusuke Suzuki  <utatane.tea@gmail.com>
 
+        [JSC] Allow indexed module namespace object fields
+        https://bugs.webkit.org/show_bug.cgi?id=168870
+
+        Reviewed by Saam Barati.
+
+        * wasm/spec-tests/names.wast.js:
+
+2017-03-06  Yusuke Suzuki  <utatane.tea@gmail.com>
+
         Null pointer crash when loading module with unresolved import also as a script file
         https://bugs.webkit.org/show_bug.cgi?id=168971
 
index 2199266..5610159 100644 (file)
@@ -102,8 +102,7 @@ assert_return(() => $$.exports["malloc"](), f32(6.28125));
 assert_return(() => $$.exports["_malloc"](), f32(6.296875));
 assert_return(() => $$.exports["__malloc"](), f32(6.3125));
 assert_return(() => $$.exports["~!@#$%^&*()_+`-={}|[]\x5c:\x22;'<>?,./ "](), f32(6.34375));
-// FIXME exporting a property with a name that's a number doesn't work https://bugs.webkit.org/show_bug.cgi?id=168857
-//assert_return(() => $$.exports["0"](), f32(6.359375));
+assert_return(() => $$.exports["0"](), f32(6.359375));
 assert_return(() => $$.exports["_"](), f32(6.375));
 assert_return(() => $$.exports["$"](), f32(6.390625));
 assert_return(() => $$.exports["@"](), f32(8.0));
index 2608b57..ab6b1f3 100644 (file)
@@ -1,5 +1,24 @@
 2017-03-06  Yusuke Suzuki  <utatane.tea@gmail.com>
 
+        [JSC] Allow indexed module namespace object fields
+        https://bugs.webkit.org/show_bug.cgi?id=168870
+
+        Reviewed by Saam Barati.
+
+        While JS modules cannot expose any indexed bindings,
+        Wasm modules can expose them. However, module namespace
+        object currently does not support indexed properties.
+        This patch allows module namespace objects to offer
+        indexed binding accesses.
+
+        * runtime/JSModuleNamespaceObject.cpp:
+        (JSC::JSModuleNamespaceObject::getOwnPropertySlotCommon):
+        (JSC::JSModuleNamespaceObject::getOwnPropertySlot):
+        (JSC::JSModuleNamespaceObject::getOwnPropertySlotByIndex):
+        * runtime/JSModuleNamespaceObject.h:
+
+2017-03-06  Yusuke Suzuki  <utatane.tea@gmail.com>
+
         Null pointer crash when loading module with unresolved import also as a script file
         https://bugs.webkit.org/show_bug.cgi?id=168971
 
index 3606882..bfdb003 100644 (file)
@@ -113,32 +113,30 @@ static JSValue getValue(JSModuleEnvironment* environment, PropertyName localName
     return environment->variableAt(scopeOffset).get();
 }
 
-bool JSModuleNamespaceObject::getOwnPropertySlot(JSObject* cell, ExecState* exec, PropertyName propertyName, PropertySlot& slot)
+bool JSModuleNamespaceObject::getOwnPropertySlotCommon(ExecState* exec, PropertyName propertyName, PropertySlot& slot)
 {
     VM& vm = exec->vm();
     auto scope = DECLARE_THROW_SCOPE(vm);
 
     // http://www.ecma-international.org/ecma-262/6.0/#sec-module-namespace-exotic-objects-getownproperty-p
 
-    JSModuleNamespaceObject* thisObject = jsCast<JSModuleNamespaceObject*>(cell);
-
     // step 1.
     // If the property name is a symbol, we don't look into the imported bindings.
     // It may return the descriptor with writable: true, but namespace objects does not allow it in [[Set]] / [[DefineOwnProperty]] side.
     if (propertyName.isSymbol())
-        return JSObject::getOwnPropertySlot(thisObject, exec, propertyName, slot);
+        return JSObject::getOwnPropertySlot(this, exec, propertyName, slot);
 
     slot.setIsTaintedByOpaqueObject();
 
-    auto iterator = thisObject->m_exports.find(propertyName.uid());
-    if (iterator == thisObject->m_exports.end())
+    auto iterator = m_exports.find(propertyName.uid());
+    if (iterator == m_exports.end())
         return false;
     ExportEntry& exportEntry = iterator->value;
 
     switch (slot.internalMethodType()) {
     case PropertySlot::InternalMethodType::GetOwnProperty:
     case PropertySlot::InternalMethodType::Get: {
-        JSModuleEnvironment* environment = thisObject->moduleRecordAt(exportEntry.moduleRecordOffset)->moduleEnvironment();
+        JSModuleEnvironment* environment = moduleRecordAt(exportEntry.moduleRecordOffset)->moduleEnvironment();
         ScopeOffset scopeOffset;
         JSValue value = getValue(environment, exportEntry.localName, scopeOffset);
         // If the value is filled with TDZ value, throw a reference error.
@@ -147,7 +145,7 @@ bool JSModuleNamespaceObject::getOwnPropertySlot(JSObject* cell, ExecState* exec
             return false;
         }
 
-        slot.setValueModuleNamespace(thisObject, DontDelete, value, environment, scopeOffset);
+        slot.setValueModuleNamespace(this, DontDelete, value, environment, scopeOffset);
         return true;
     }
 
@@ -155,7 +153,7 @@ bool JSModuleNamespaceObject::getOwnPropertySlot(JSObject* cell, ExecState* exec
         // Do not perform [[Get]] for [[HasProperty]].
         // [[Get]] / [[GetOwnProperty]] onto namespace object could throw an error while [[HasProperty]] just returns true here.
         // https://tc39.github.io/ecma262/#sec-module-namespace-exotic-objects-hasproperty-p
-        slot.setValue(thisObject, DontDelete, jsUndefined());
+        slot.setValue(this, DontDelete, jsUndefined());
         return true;
     }
 
@@ -167,6 +165,18 @@ bool JSModuleNamespaceObject::getOwnPropertySlot(JSObject* cell, ExecState* exec
     return false;
 }
 
+bool JSModuleNamespaceObject::getOwnPropertySlot(JSObject* cell, ExecState* exec, PropertyName propertyName, PropertySlot& slot)
+{
+    JSModuleNamespaceObject* thisObject = jsCast<JSModuleNamespaceObject*>(cell);
+    return thisObject->getOwnPropertySlotCommon(exec, propertyName, slot);
+}
+
+bool JSModuleNamespaceObject::getOwnPropertySlotByIndex(JSObject* cell, ExecState* exec, unsigned propertyName, PropertySlot& slot)
+{
+    JSModuleNamespaceObject* thisObject = jsCast<JSModuleNamespaceObject*>(cell);
+    return thisObject->getOwnPropertySlotCommon(exec, Identifier::from(exec, propertyName), slot);
+}
+
 bool JSModuleNamespaceObject::put(JSCell*, ExecState* exec, PropertyName, JSValue, PutPropertySlot& slot)
 {
     VM& vm = exec->vm();
index fb8ed37..6f24648 100644 (file)
@@ -48,6 +48,7 @@ public:
     }
 
     JS_EXPORT_PRIVATE static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
+    JS_EXPORT_PRIVATE static bool getOwnPropertySlotByIndex(JSObject*, ExecState*, unsigned propertyName, PropertySlot&);
     JS_EXPORT_PRIVATE static bool put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&);
     JS_EXPORT_PRIVATE static bool putByIndex(JSCell*, ExecState*, unsigned propertyName, JSValue, bool shouldThrow);
     JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, ExecState*, PropertyName);
@@ -70,6 +71,7 @@ protected:
 private:
     static void destroy(JSCell*);
     static void visitChildren(JSCell*, SlotVisitor&);
+    bool getOwnPropertySlotCommon(ExecState*, PropertyName, PropertySlot&);
 
     WriteBarrierBase<AbstractModuleRecord>& moduleRecordAt(unsigned offset)
     {