Diff
Modified: trunk/LayoutTests/ChangeLog (253493 => 253494)
--- trunk/LayoutTests/ChangeLog 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/LayoutTests/ChangeLog 2019-12-13 20:49:10 UTC (rev 253494)
@@ -1,3 +1,13 @@
+2019-12-13 youenn fablet <[email protected]>
+
+ Add support for WebIDL set-like forEach
+ https://bugs.webkit.org/show_bug.cgi?id=204847
+
+ Reviewed by Chris Dumez.
+
+ * js/dom/maplike.html:
+ * js/dom/setlike.html:
+
2019-12-13 Chris Dumez <[email protected]>
REGRESSION: (r251677) imported/w3c/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-3.html is a flaky failure
Modified: trunk/LayoutTests/js/dom/maplike.html (253493 => 253494)
--- trunk/LayoutTests/js/dom/maplike.html 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/LayoutTests/js/dom/maplike.html 2019-12-13 20:49:10 UTC (rev 253494)
@@ -48,8 +48,9 @@
}
assert_equals(keysTest, "testAtestB", "keys test");
+ assert_equals(maplike.forEach.length, 1);
let forEachTest = "";
- maplike.forEach((value, key, object) => {
+ const forEachResult = maplike.forEach((value, key, object) => {
forEachTest += key;
forEachTest += ',';
forEachTest += value;
@@ -57,6 +58,7 @@
assert_equals(object, maplike);
});
assert_equals(forEachTest, "testA,2 testB,3 ", "forEach test");
+ assert_equals(forEachResult, undefined);
maplike.clear();
assert_array_equals(maplike.inspectKeys(), []);
Modified: trunk/LayoutTests/js/dom/setlike.html (253493 => 253494)
--- trunk/LayoutTests/js/dom/setlike.html 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/LayoutTests/js/dom/setlike.html 2019-12-13 20:49:10 UTC (rev 253494)
@@ -42,6 +42,16 @@
}
assert_equals(keysTest, "testtest2", "keys test");
+ assert_equals(setlike.forEach.length, 1);
+ let forEachTest = "";
+ const forEachResult = setlike.forEach((key, value, object) => {
+ forEachTest += key;
+ forEachTest += value;
+ assert_equals(object, setlike);
+ });
+ assert_equals(forEachTest, "testtesttest2test2", "forEach test");
+ assert_equals(forEachResult, undefined);
+
setlike.clear();
assert_array_equals(setlike.items(), []);
}, "Basic add/remove/clear functionality");
Modified: trunk/Source/WebCore/ChangeLog (253493 => 253494)
--- trunk/Source/WebCore/ChangeLog 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/Source/WebCore/ChangeLog 2019-12-13 20:49:10 UTC (rev 253494)
@@ -1,3 +1,41 @@
+2019-12-13 youenn fablet <[email protected]>
+
+ Add support for WebIDL set-like forEach
+ https://bugs.webkit.org/show_bug.cgi?id=204847
+
+ Reviewed by Chris Dumez.
+
+ Add support to setlike forEach as done for maplike.
+ Covered by rebased binding tests and updated layout test.
+
+ * bindings/js/JSDOMBindingInternals.js:
+ (forEachWrapper):
+ * bindings/js/JSDOMMapLike.cpp:
+ (WebCore::forwardForEachCallToBackingMap):
+ * bindings/js/JSDOMSetLike.cpp:
+ (WebCore::DOMSetAdapter::clear):
+ (WebCore::forwardForEachCallToBackingSet):
+ * bindings/js/JSDOMSetLike.h:
+ (WebCore::DOMSetAdapter::add):
+ (WebCore::getAndInitializeBackingSet):
+ (WebCore::forwardSizeToSetLike):
+ (WebCore::forwardEntriesToSetLike):
+ (WebCore::forwardKeysToSetLike):
+ (WebCore::forwardValuesToSetLike):
+ (WebCore::forwardForEachToSetLike):
+ (WebCore::forwardClearToSetLike):
+ (WebCore::forwardHasToSetLike):
+ (WebCore::forwardAddToSetLike):
+ (WebCore::forwardDeleteToSetLike):
+ * bindings/scripts/IDLParser.pm:
+ (parseSetLikeProperties):
+ * bindings/scripts/test/JS/JSReadOnlySetLike.cpp:
+ (WebCore::jsReadOnlySetLikePrototypeFunctionForEachBody):
+ (WebCore::jsReadOnlySetLikePrototypeFunctionForEach):
+ * bindings/scripts/test/JS/JSSetLike.cpp:
+ (WebCore::jsSetLikePrototypeFunctionForEachBody):
+ (WebCore::jsSetLikePrototypeFunctionForEach):
+
2019-12-13 Chris Dumez <[email protected]>
REGRESSION: (r251677) imported/w3c/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-3.html is a flaky failure
Modified: trunk/Source/WebCore/bindings/js/JSDOMBindingInternals.js (253493 => 253494)
--- trunk/Source/WebCore/bindings/js/JSDOMBindingInternals.js 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/Source/WebCore/bindings/js/JSDOMBindingInternals.js 2019-12-13 20:49:10 UTC (rev 253494)
@@ -25,10 +25,10 @@
// @internal
-function mapLikeForEach(callback)
+function forEachWrapper(mapLikeOrSetLike, callback)
{
"use strict";
- @getByIdDirectPrivate(this, "backingMap").forEach((value, key, map) => {
+ mapLikeOrSetLike.forEach((value, key, backingMapOrSet) => {
callback(value, key, this);
});
}
Modified: trunk/Source/WebCore/bindings/js/JSDOMMapLike.cpp (253493 => 253494)
--- trunk/Source/WebCore/bindings/js/JSDOMMapLike.cpp 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/Source/WebCore/bindings/js/JSDOMMapLike.cpp 2019-12-13 20:49:10 UTC (rev 253494)
@@ -101,13 +101,18 @@
JSC::JSValue forwardForEachCallToBackingMap(JSDOMGlobalObject& globalObject, JSC::CallFrame& callFrame, JSC::JSObject& mapLike)
{
- auto* function = globalObject.builtinInternalFunctions().jsDOMBindingInternals().m_mapLikeForEachFunction.get();
+ auto result = getBackingMap(globalObject, mapLike);
+ ASSERT(!result.first);
+
+ auto* function = globalObject.builtinInternalFunctions().jsDOMBindingInternals().m_forEachWrapperFunction.get();
ASSERT(function);
JSC::CallData callData;
auto callType = JSC::getCallData(globalObject.vm(), function, callData);
ASSERT(callType != JSC::CallType::None);
+
JSC::MarkedArgumentBuffer arguments;
+ arguments.append(&result.second.get());
for (size_t cptr = 0; cptr < callFrame.argumentCount(); ++cptr)
arguments.append(callFrame.uncheckedArgument(cptr));
ASSERT(!arguments.hasOverflowed());
Modified: trunk/Source/WebCore/bindings/js/JSDOMSetLike.cpp (253493 => 253494)
--- trunk/Source/WebCore/bindings/js/JSDOMSetLike.cpp 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/Source/WebCore/bindings/js/JSDOMSetLike.cpp 2019-12-13 20:49:10 UTC (rev 253494)
@@ -32,6 +32,11 @@
namespace WebCore {
+void DOMSetAdapter::clear()
+{
+ clearBackingSet(m_lexicalGlobalObject, m_backingSet);
+}
+
std::pair<bool, std::reference_wrapper<JSC::JSObject>> getBackingSet(JSC::JSGlobalObject& lexicalGlobalObject, JSC::JSObject& setLike)
{
auto& vm = lexicalGlobalObject.vm();
@@ -96,4 +101,24 @@
return JSC::call(&lexicalGlobalObject, function, callType, callData, &backingSet, arguments);
}
+JSC::JSValue forwardForEachCallToBackingSet(JSDOMGlobalObject& globalObject, JSC::CallFrame& callFrame, JSC::JSObject& setLike)
+{
+ auto result = getBackingSet(globalObject, setLike);
+ ASSERT(!result.first);
+
+ auto* function = globalObject.builtinInternalFunctions().jsDOMBindingInternals().m_forEachWrapperFunction.get();
+ ASSERT(function);
+
+ JSC::CallData callData;
+ JSC::CallType callType = JSC::getCallData(globalObject.vm(), function, callData);
+ ASSERT(callType != JSC::CallType::None);
+
+ JSC::MarkedArgumentBuffer arguments;
+ arguments.append(&result.second.get());
+ for (size_t cptr = 0; cptr < callFrame.argumentCount(); ++cptr)
+ arguments.append(callFrame.uncheckedArgument(cptr));
+ ASSERT(!arguments.hasOverflowed());
+ return JSC::call(&globalObject, function, callType, callData, &setLike, arguments);
}
+
+}
Modified: trunk/Source/WebCore/bindings/js/JSDOMSetLike.h (253493 => 253494)
--- trunk/Source/WebCore/bindings/js/JSDOMSetLike.h 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/Source/WebCore/bindings/js/JSDOMSetLike.h 2019-12-13 20:49:10 UTC (rev 253494)
@@ -34,6 +34,7 @@
namespace WebCore {
WEBCORE_EXPORT std::pair<bool, std::reference_wrapper<JSC::JSObject>> getBackingSet(JSC::JSGlobalObject&, JSC::JSObject& setLike);
+WEBCORE_EXPORT JSC::JSValue forwardForEachCallToBackingSet(JSDOMGlobalObject&, JSC::CallFrame&, JSC::JSObject& setLike);
WEBCORE_EXPORT JSC::JSValue forwardAttributeGetterToBackingSet(JSC::JSGlobalObject&, JSC::JSObject&, const JSC::Identifier&);
WEBCORE_EXPORT JSC::JSValue forwardFunctionCallToBackingSet(JSC::JSGlobalObject&, JSC::CallFrame&, JSC::JSObject&, const JSC::Identifier&);
WEBCORE_EXPORT void clearBackingSet(JSC::JSGlobalObject&, JSC::JSObject&);
@@ -44,7 +45,9 @@
template<typename WrapperClass> JSC::JSValue forwardEntriesToSetLike(JSC::JSGlobalObject&, JSC::CallFrame&, WrapperClass&);
template<typename WrapperClass> JSC::JSValue forwardKeysToSetLike(JSC::JSGlobalObject&, JSC::CallFrame&, WrapperClass&);
template<typename WrapperClass> JSC::JSValue forwardValuesToSetLike(JSC::JSGlobalObject&, JSC::CallFrame&, WrapperClass&);
+template<typename WrapperClass, typename Callback> JSC::JSValue forwardForEachToSetLike(JSC::JSGlobalObject&, JSC::CallFrame&, WrapperClass&, Callback&&);
template<typename WrapperClass> JSC::JSValue forwardClearToSetLike(JSC::JSGlobalObject&, JSC::CallFrame&, WrapperClass&);
+
template<typename WrapperClass, typename ItemType> JSC::JSValue forwardHasToSetLike(JSC::JSGlobalObject&, JSC::CallFrame&, WrapperClass&, ItemType&&);
template<typename WrapperClass, typename ItemType> JSC::JSValue forwardAddToSetLike(JSC::JSGlobalObject&, JSC::CallFrame&, WrapperClass&, ItemType&&);
template<typename WrapperClass, typename ItemType> JSC::JSValue forwardDeleteToSetLike(JSC::JSGlobalObject&, JSC::CallFrame&, WrapperClass&, ItemType&&);
@@ -52,7 +55,7 @@
class DOMSetAdapter {
public:
DOMSetAdapter(JSC::JSGlobalObject&, JSC::JSObject&);
- template<class IDLType> void add(typename IDLType::ParameterType value);
+ template<typename IDLType> void add(typename IDLType::ParameterType value);
void clear();
private:
@@ -66,8 +69,8 @@
{
}
-template<class IDLType>
-inline void DOMSetAdapter::add(typename IDLType::ParameterType value)
+template<typename IDLType>
+void DOMSetAdapter::add(typename IDLType::ParameterType value)
{
JSC::JSLockHolder locker(&m_lexicalGlobalObject);
auto item = toJS<IDLType>(m_lexicalGlobalObject, *JSC::jsCast<JSDOMGlobalObject*>(&m_lexicalGlobalObject), std::forward<typename IDLType::ParameterType>(value));
@@ -74,13 +77,9 @@
addToBackingSet(m_lexicalGlobalObject, m_backingSet, item);
}
-inline void DOMSetAdapter::clear()
+template<typename WrapperClass>
+JSC::JSObject& getAndInitializeBackingSet(JSC::JSGlobalObject& lexicalGlobalObject, WrapperClass& setLike)
{
- clearBackingSet(m_lexicalGlobalObject, m_backingSet);
-}
-
-template<typename WrapperClass> inline JSC::JSObject& getAndInitializeBackingSet(JSC::JSGlobalObject& lexicalGlobalObject, WrapperClass& setLike)
-{
auto pair = getBackingSet(lexicalGlobalObject, setLike);
if (pair.first) {
DOMSetAdapter adapter { lexicalGlobalObject, pair.second.get() };
@@ -89,37 +88,43 @@
return pair.second.get();
}
-template<typename WrapperClass> inline JSC::JSValue forwardSizeToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, WrapperClass& setLike)
+template<typename WrapperClass>
+JSC::JSValue forwardSizeToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, WrapperClass& setLike)
{
auto& vm = JSC::getVM(&lexicalGlobalObject);
return forwardAttributeGetterToBackingSet(lexicalGlobalObject, getAndInitializeBackingSet(lexicalGlobalObject, setLike), vm.propertyNames->size);
}
-template<typename WrapperClass> inline JSC::JSValue forwardEntriesToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike)
+template<typename WrapperClass>
+JSC::JSValue forwardEntriesToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike)
{
auto& vm = JSC::getVM(&lexicalGlobalObject);
return forwardFunctionCallToBackingSet(lexicalGlobalObject, callFrame, getAndInitializeBackingSet(lexicalGlobalObject, setLike), vm.propertyNames->builtinNames().entriesPublicName());
}
-template<typename WrapperClass> inline JSC::JSValue forwardKeysToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike)
+template<typename WrapperClass>
+JSC::JSValue forwardKeysToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike)
{
auto& vm = JSC::getVM(&lexicalGlobalObject);
return forwardFunctionCallToBackingSet(lexicalGlobalObject, callFrame, getAndInitializeBackingSet(lexicalGlobalObject, setLike), vm.propertyNames->builtinNames().keysPublicName());
}
-template<typename WrapperClass> inline JSC::JSValue forwardValuesToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike)
+template<typename WrapperClass>
+JSC::JSValue forwardValuesToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike)
{
auto& vm = JSC::getVM(&lexicalGlobalObject);
return forwardFunctionCallToBackingSet(lexicalGlobalObject, callFrame, getAndInitializeBackingSet(lexicalGlobalObject, setLike), vm.propertyNames->builtinNames().valuesPublicName());
}
-template<typename WrapperClass, typename ItemType> inline JSC::JSValue forwardHasToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike, ItemType&&)
+template<typename WrapperClass, typename Callback>
+JSC::JSValue forwardForEachToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike, Callback&&)
{
- auto& vm = JSC::getVM(&lexicalGlobalObject);
- return forwardFunctionCallToBackingSet(lexicalGlobalObject, callFrame, getAndInitializeBackingSet(lexicalGlobalObject, setLike), vm.propertyNames->builtinNames().hasPublicName());
+ getAndInitializeBackingSet(lexicalGlobalObject, setLike);
+ return forwardForEachCallToBackingSet(*JSC::jsCast<JSDOMGlobalObject*>(&lexicalGlobalObject), callFrame, setLike);
}
-template<typename WrapperClass> inline JSC::JSValue forwardClearToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike)
+template<typename WrapperClass>
+JSC::JSValue forwardClearToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike)
{
setLike.wrapped().clearFromSetLike();
@@ -127,8 +132,16 @@
return forwardFunctionCallToBackingSet(lexicalGlobalObject, callFrame, getAndInitializeBackingSet(lexicalGlobalObject, setLike), vm.propertyNames->clear);
}
-template<typename WrapperClass, typename ItemType> inline JSC::JSValue forwardAddToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike, ItemType&& item)
+template<typename WrapperClass, typename ItemType>
+JSC::JSValue forwardHasToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike, ItemType&&)
{
+ auto& vm = JSC::getVM(&lexicalGlobalObject);
+ return forwardFunctionCallToBackingSet(lexicalGlobalObject, callFrame, getAndInitializeBackingSet(lexicalGlobalObject, setLike), vm.propertyNames->builtinNames().hasPublicName());
+}
+
+template<typename WrapperClass, typename ItemType>
+JSC::JSValue forwardAddToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike, ItemType&& item)
+{
setLike.wrapped().addToSetLike(std::forward<ItemType>(item));
auto& vm = JSC::getVM(&lexicalGlobalObject);
@@ -136,7 +149,8 @@
return &setLike;
}
-template<typename WrapperClass, typename ItemType> inline JSC::JSValue forwardDeleteToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike, ItemType&& item)
+template<typename WrapperClass, typename ItemType>
+JSC::JSValue forwardDeleteToSetLike(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, WrapperClass& setLike, ItemType&& item)
{
auto isDeleted = setLike.wrapped().removeFromSetLike(std::forward<ItemType>(item));
UNUSED_PARAM(isDeleted);
Modified: trunk/Source/WebCore/bindings/scripts/IDLParser.pm (253493 => 253494)
--- trunk/Source/WebCore/bindings/scripts/IDLParser.pm 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/Source/WebCore/bindings/scripts/IDLParser.pm 2019-12-13 20:49:10 UTC (rev 253494)
@@ -2110,12 +2110,23 @@
$valuesOperation->extendedAttributes->{NotEnumerable} = 1;
$valuesOperation->type(makeSimpleType("any"));
- # FIXME: Add support to forEach
+ my $forEachOperation = IDLOperation->new();
+ $forEachOperation->name("forEach");
+ $forEachOperation->isSetLike(1);
+ my $forEachArgument = IDLArgument->new();
+ $forEachArgument->name("callback");
+ $forEachArgument->type(makeSimpleType("any"));
+ $forEachArgument->extendedAttributes($extendedAttributeList);
+ push(@{$forEachOperation->arguments}, ($forEachArgument));
+ $forEachOperation->extendedAttributes($extendedAttributeList);
+ $forEachOperation->extendedAttributes->{Enumerable} = 1;
+ $forEachOperation->type(makeSimpleType("any"));
push(@{$setlike->operations}, $hasOperation);
push(@{$setlike->operations}, $entriesOperation);
push(@{$setlike->operations}, $keysOperation);
push(@{$setlike->operations}, $valuesOperation);
+ push(@{$setlike->operations}, $forEachOperation);
return $setlike if $isReadOnly;
Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSReadOnlySetLike.cpp (253493 => 253494)
--- trunk/Source/WebCore/bindings/scripts/test/JS/JSReadOnlySetLike.cpp 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSReadOnlySetLike.cpp 2019-12-13 20:49:10 UTC (rev 253494)
@@ -50,6 +50,7 @@
JSC::EncodedJSValue JSC_HOST_CALL jsReadOnlySetLikePrototypeFunctionEntries(JSC::JSGlobalObject*, JSC::CallFrame*);
JSC::EncodedJSValue JSC_HOST_CALL jsReadOnlySetLikePrototypeFunctionKeys(JSC::JSGlobalObject*, JSC::CallFrame*);
JSC::EncodedJSValue JSC_HOST_CALL jsReadOnlySetLikePrototypeFunctionValues(JSC::JSGlobalObject*, JSC::CallFrame*);
+JSC::EncodedJSValue JSC_HOST_CALL jsReadOnlySetLikePrototypeFunctionForEach(JSC::JSGlobalObject*, JSC::CallFrame*);
// Attributes
@@ -110,6 +111,7 @@
{ "entries", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsReadOnlySetLikePrototypeFunctionEntries), (intptr_t) (0) } },
{ "keys", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsReadOnlySetLikePrototypeFunctionKeys), (intptr_t) (0) } },
{ "values", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsReadOnlySetLikePrototypeFunctionValues), (intptr_t) (0) } },
+ { "forEach", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsReadOnlySetLikePrototypeFunctionForEach), (intptr_t) (1) } },
};
const ClassInfo JSReadOnlySetLikePrototype::s_info = { "ReadOnlySetLikePrototype", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSReadOnlySetLikePrototype) };
@@ -260,6 +262,23 @@
return IDLOperation<JSReadOnlySetLike>::call<jsReadOnlySetLikePrototypeFunctionValuesBody>(*lexicalGlobalObject, *callFrame, "values");
}
+static inline JSC::EncodedJSValue jsReadOnlySetLikePrototypeFunctionForEachBody(JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame, typename IDLOperation<JSReadOnlySetLike>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
+{
+ UNUSED_PARAM(lexicalGlobalObject);
+ UNUSED_PARAM(callFrame);
+ UNUSED_PARAM(throwScope);
+ if (UNLIKELY(callFrame->argumentCount() < 1))
+ return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject));
+ auto callback = convert<IDLAny>(*lexicalGlobalObject, callFrame->uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
+ return JSValue::encode(toJS<IDLAny>(forwardForEachToSetLike(*lexicalGlobalObject, *callFrame, *castedThis, WTFMove(callback))));
+}
+
+EncodedJSValue JSC_HOST_CALL jsReadOnlySetLikePrototypeFunctionForEach(JSGlobalObject* lexicalGlobalObject, CallFrame* callFrame)
+{
+ return IDLOperation<JSReadOnlySetLike>::call<jsReadOnlySetLikePrototypeFunctionForEachBody>(*lexicalGlobalObject, *callFrame, "forEach");
+}
+
void JSReadOnlySetLike::analyzeHeap(JSCell* cell, HeapAnalyzer& analyzer)
{
auto* thisObject = jsCast<JSReadOnlySetLike*>(cell);
Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSSetLike.cpp (253493 => 253494)
--- trunk/Source/WebCore/bindings/scripts/test/JS/JSSetLike.cpp 2019-12-13 20:38:13 UTC (rev 253493)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSSetLike.cpp 2019-12-13 20:49:10 UTC (rev 253494)
@@ -50,6 +50,7 @@
JSC::EncodedJSValue JSC_HOST_CALL jsSetLikePrototypeFunctionEntries(JSC::JSGlobalObject*, JSC::CallFrame*);
JSC::EncodedJSValue JSC_HOST_CALL jsSetLikePrototypeFunctionKeys(JSC::JSGlobalObject*, JSC::CallFrame*);
JSC::EncodedJSValue JSC_HOST_CALL jsSetLikePrototypeFunctionValues(JSC::JSGlobalObject*, JSC::CallFrame*);
+JSC::EncodedJSValue JSC_HOST_CALL jsSetLikePrototypeFunctionForEach(JSC::JSGlobalObject*, JSC::CallFrame*);
JSC::EncodedJSValue JSC_HOST_CALL jsSetLikePrototypeFunctionAdd(JSC::JSGlobalObject*, JSC::CallFrame*);
JSC::EncodedJSValue JSC_HOST_CALL jsSetLikePrototypeFunctionClear(JSC::JSGlobalObject*, JSC::CallFrame*);
JSC::EncodedJSValue JSC_HOST_CALL jsSetLikePrototypeFunctionDelete(JSC::JSGlobalObject*, JSC::CallFrame*);
@@ -113,6 +114,7 @@
{ "entries", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsSetLikePrototypeFunctionEntries), (intptr_t) (0) } },
{ "keys", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsSetLikePrototypeFunctionKeys), (intptr_t) (0) } },
{ "values", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsSetLikePrototypeFunctionValues), (intptr_t) (0) } },
+ { "forEach", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsSetLikePrototypeFunctionForEach), (intptr_t) (1) } },
{ "add", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsSetLikePrototypeFunctionAdd), (intptr_t) (1) } },
{ "clear", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsSetLikePrototypeFunctionClear), (intptr_t) (0) } },
{ "delete", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsSetLikePrototypeFunctionDelete), (intptr_t) (1) } },
@@ -266,6 +268,23 @@
return IDLOperation<JSSetLike>::call<jsSetLikePrototypeFunctionValuesBody>(*lexicalGlobalObject, *callFrame, "values");
}
+static inline JSC::EncodedJSValue jsSetLikePrototypeFunctionForEachBody(JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame, typename IDLOperation<JSSetLike>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
+{
+ UNUSED_PARAM(lexicalGlobalObject);
+ UNUSED_PARAM(callFrame);
+ UNUSED_PARAM(throwScope);
+ if (UNLIKELY(callFrame->argumentCount() < 1))
+ return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject));
+ auto callback = convert<IDLAny>(*lexicalGlobalObject, callFrame->uncheckedArgument(0));
+ RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
+ return JSValue::encode(toJS<IDLAny>(forwardForEachToSetLike(*lexicalGlobalObject, *callFrame, *castedThis, WTFMove(callback))));
+}
+
+EncodedJSValue JSC_HOST_CALL jsSetLikePrototypeFunctionForEach(JSGlobalObject* lexicalGlobalObject, CallFrame* callFrame)
+{
+ return IDLOperation<JSSetLike>::call<jsSetLikePrototypeFunctionForEachBody>(*lexicalGlobalObject, *callFrame, "forEach");
+}
+
static inline JSC::EncodedJSValue jsSetLikePrototypeFunctionAddBody(JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame, typename IDLOperation<JSSetLike>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
{
UNUSED_PARAM(lexicalGlobalObject);