Skip to content

Commit 6febcde

Browse files
committed
[JSC] Move iterator / asyncIterator getters to C++ with inlining support
https://bugs.webkit.org/show_bug.cgi?id=278510 rdar://134467146 Reviewed by Alexey Shvayka. Move iterator / asyncIterator getters to C++ as the same to Symbol.species getter. * Source/JavaScriptCore/CMakeLists.txt: * Source/JavaScriptCore/DerivedSources-input.xcfilelist: * Source/JavaScriptCore/DerivedSources.make: * Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj: * Source/JavaScriptCore/builtins/AsyncIteratorPrototype.js: Removed. * Source/JavaScriptCore/builtins/IteratorPrototype.js: Removed. * Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::handleIntrinsicCall): * Source/JavaScriptCore/runtime/AsyncIteratorPrototype.cpp: (JSC::AsyncIteratorPrototype::finishCreation): (JSC::JSC_DEFINE_HOST_FUNCTION): * Source/JavaScriptCore/runtime/Intrinsic.h: * Source/JavaScriptCore/runtime/IteratorPrototype.cpp: (JSC::IteratorPrototype::finishCreation): (JSC::JSC_DEFINE_HOST_FUNCTION): Canonical link: https://commits.webkit.org/282610@main
1 parent 1c46d8b commit 6febcde

10 files changed

Lines changed: 26 additions & 77 deletions

File tree

‎Source/JavaScriptCore/CMakeLists.txt‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,15 +337,13 @@ set(JavaScriptCore_BUILTINS_SOURCES
337337
${JAVASCRIPTCORE_DIR}/builtins/ArrayIteratorPrototype.js
338338
${JAVASCRIPTCORE_DIR}/builtins/ArrayPrototype.js
339339
${JAVASCRIPTCORE_DIR}/builtins/AsyncFunctionPrototype.js
340-
${JAVASCRIPTCORE_DIR}/builtins/AsyncIteratorPrototype.js
341340
${JAVASCRIPTCORE_DIR}/builtins/AsyncGeneratorPrototype.js
342341
${JAVASCRIPTCORE_DIR}/builtins/FunctionPrototype.js
343342
${JAVASCRIPTCORE_DIR}/builtins/GeneratorPrototype.js
344343
${JAVASCRIPTCORE_DIR}/builtins/GlobalObject.js
345344
${JAVASCRIPTCORE_DIR}/builtins/GlobalOperations.js
346345
${JAVASCRIPTCORE_DIR}/builtins/InternalPromiseConstructor.js
347346
${JAVASCRIPTCORE_DIR}/builtins/IteratorHelpers.js
348-
${JAVASCRIPTCORE_DIR}/builtins/IteratorPrototype.js
349347
${JAVASCRIPTCORE_DIR}/builtins/MapConstructor.js
350348
${JAVASCRIPTCORE_DIR}/builtins/MapIteratorPrototype.js
351349
${JAVASCRIPTCORE_DIR}/builtins/MapPrototype.js

‎Source/JavaScriptCore/DerivedSources-input.xcfilelist‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,12 @@ $(PROJECT_DIR)/builtins/ArrayPrototype.js
4242
$(PROJECT_DIR)/builtins/AsyncFromSyncIteratorPrototype.js
4343
$(PROJECT_DIR)/builtins/AsyncFunctionPrototype.js
4444
$(PROJECT_DIR)/builtins/AsyncGeneratorPrototype.js
45-
$(PROJECT_DIR)/builtins/AsyncIteratorPrototype.js
4645
$(PROJECT_DIR)/builtins/FunctionPrototype.js
4746
$(PROJECT_DIR)/builtins/GeneratorPrototype.js
4847
$(PROJECT_DIR)/builtins/GlobalObject.js
4948
$(PROJECT_DIR)/builtins/GlobalOperations.js
5049
$(PROJECT_DIR)/builtins/InternalPromiseConstructor.js
5150
$(PROJECT_DIR)/builtins/IteratorHelpers.js
52-
$(PROJECT_DIR)/builtins/IteratorPrototype.js
5351
$(PROJECT_DIR)/builtins/MapConstructor.js
5452
$(PROJECT_DIR)/builtins/MapIteratorPrototype.js
5553
$(PROJECT_DIR)/builtins/MapPrototype.js

‎Source/JavaScriptCore/DerivedSources.make‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ JavaScriptCore_BUILTINS_SOURCES = \
106106
$(JavaScriptCore)/builtins/ArrayConstructor.js \
107107
$(JavaScriptCore)/builtins/ArrayIteratorPrototype.js \
108108
$(JavaScriptCore)/builtins/ArrayPrototype.js \
109-
$(JavaScriptCore)/builtins/AsyncIteratorPrototype.js \
110109
$(JavaScriptCore)/builtins/AsyncFunctionPrototype.js \
111110
$(JavaScriptCore)/builtins/AsyncGeneratorPrototype.js \
112111
$(JavaScriptCore)/builtins/FunctionPrototype.js \
@@ -115,7 +114,6 @@ JavaScriptCore_BUILTINS_SOURCES = \
115114
$(JavaScriptCore)/builtins/GlobalOperations.js \
116115
$(JavaScriptCore)/builtins/InternalPromiseConstructor.js \
117116
$(JavaScriptCore)/builtins/IteratorHelpers.js \
118-
$(JavaScriptCore)/builtins/IteratorPrototype.js \
119117
$(JavaScriptCore)/builtins/MapConstructor.js \
120118
$(JavaScriptCore)/builtins/MapIteratorPrototype.js \
121119
$(JavaScriptCore)/builtins/MapPrototype.js \

‎Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4554,7 +4554,6 @@
45544554
7CF9BC581B65D9A3009DB1EF /* ArrayConstructor.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = ArrayConstructor.js; sourceTree = "<group>"; };
45554555
7CF9BC591B65D9A3009DB1EF /* ArrayIteratorPrototype.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = ArrayIteratorPrototype.js; sourceTree = "<group>"; };
45564556
7CF9BC5A1B65D9A3009DB1EF /* GlobalObject.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = GlobalObject.js; sourceTree = "<group>"; };
4557-
7CF9BC5B1B65D9A3009DB1EF /* IteratorPrototype.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = IteratorPrototype.js; sourceTree = "<group>"; };
45584557
7CF9BC5C1B65D9B1009DB1EF /* ObjectConstructor.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = ObjectConstructor.js; sourceTree = "<group>"; };
45594558
7CF9BC5D1B65D9B1009DB1EF /* PromiseOperations.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = PromiseOperations.js; sourceTree = "<group>"; };
45604559
7CF9BC5E1B65D9B1009DB1EF /* PromiseConstructor.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = PromiseConstructor.js; sourceTree = "<group>"; };
@@ -4709,7 +4708,6 @@
47094708
8BC064901E1AD6AC00B2B8CA /* AsyncGeneratorPrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncGeneratorPrototype.h; sourceTree = "<group>"; };
47104709
8BC064931E1D828B00B2B8CA /* AsyncIteratorPrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AsyncIteratorPrototype.cpp; sourceTree = "<group>"; };
47114710
8BC064941E1D828B00B2B8CA /* AsyncIteratorPrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncIteratorPrototype.h; sourceTree = "<group>"; };
4712-
8BC064951E1D838B00B2B8CA /* AsyncIteratorPrototype.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = AsyncIteratorPrototype.js; sourceTree = "<group>"; };
47134711
90213E3B123A40C200D422F3 /* MemoryStatistics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryStatistics.cpp; sourceTree = "<group>"; };
47144712
90213E3C123A40C200D422F3 /* MemoryStatistics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryStatistics.h; sourceTree = "<group>"; };
47154713
91278D5221DEB82400B57184 /* InspectorAuditAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorAuditAgent.cpp; sourceTree = "<group>"; };
@@ -9836,7 +9834,6 @@
98369834
8B1735EF1E92E52900369054 /* AsyncFromSyncIteratorPrototype.js */,
98379835
5B8243041DB7AA4900EA6384 /* AsyncFunctionPrototype.js */,
98389836
8BC064821E180B4A00B2B8CA /* AsyncGeneratorPrototype.js */,
9839-
8BC064951E1D838B00B2B8CA /* AsyncIteratorPrototype.js */,
98409837
DE26E9061CB5DD9600D2BE82 /* BuiltinExecutableCreator.cpp */,
98419838
DE26E9021CB5DD0500D2BE82 /* BuiltinExecutableCreator.h */,
98429839
A7D801A11880D66E0026C39B /* BuiltinExecutables.cpp */,
@@ -9850,7 +9847,6 @@
98509847
A52704851D027C8800354C37 /* GlobalOperations.js */,
98519848
E33F50881B844A1A00413856 /* InternalPromiseConstructor.js */,
98529849
534D9BF92363C55D0054524D /* IteratorHelpers.js */,
9853-
7CF9BC5B1B65D9A3009DB1EF /* IteratorPrototype.js */,
98549850
91F548A52A4CF448007292DE /* MapConstructor.js */,
98559851
534D9BFA2363C55D0054524D /* MapIteratorPrototype.js */,
98569852
7035587C1C418419004BD7BF /* MapPrototype.js */,

‎Source/JavaScriptCore/builtins/AsyncIteratorPrototype.js‎

Lines changed: 0 additions & 32 deletions
This file was deleted.

‎Source/JavaScriptCore/builtins/IteratorPrototype.js‎

Lines changed: 0 additions & 32 deletions
This file was deleted.

‎Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4256,6 +4256,14 @@ auto ByteCodeParser::handleIntrinsicCall(Node* callee, Operand resultOperand, Ca
42564256
return terminality == NonTerminal ? CallOptimizationResult::Inlined : CallOptimizationResult::InlinedTerminal;
42574257
}
42584258

4259+
case AsyncIteratorIntrinsic:
4260+
case IteratorIntrinsic: {
4261+
insertChecks();
4262+
Node* thisNode = get(virtualRegisterForArgumentIncludingThis(0, registerOffset));
4263+
setResult(addToGraph(ToThis, OpInfo(ECMAMode::strict()), OpInfo(prediction), thisNode));
4264+
return CallOptimizationResult::Inlined;
4265+
}
4266+
42594267
default:
42604268
return CallOptimizationResult::DidNothing;
42614269
}

‎Source/JavaScriptCore/runtime/AsyncIteratorPrototype.cpp‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,19 @@ namespace JSC {
3333

3434
const ClassInfo AsyncIteratorPrototype::s_info = { "AsyncIterator"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(AsyncIteratorPrototype) };
3535

36+
static JSC_DECLARE_HOST_FUNCTION(asyncIteratorProtoFuncAsyncIterator);
37+
3638
void AsyncIteratorPrototype::finishCreation(VM& vm, JSGlobalObject* globalObject)
3739
{
3840
Base::finishCreation(vm);
3941
ASSERT(inherits(info()));
42+
JSFunction* asyncIteratorFunction = JSFunction::create(vm, globalObject, 0, "[Symbol.asyncIterator]"_s, asyncIteratorProtoFuncAsyncIterator, ImplementationVisibility::Public, AsyncIteratorIntrinsic);
43+
putDirectWithoutTransition(vm, vm.propertyNames->asyncIteratorSymbol, asyncIteratorFunction, static_cast<unsigned>(PropertyAttribute::DontEnum));
44+
}
4045

41-
JSFunction* asyncIteratorPrototypeFunction = JSFunction::create(vm, globalObject, asyncIteratorPrototypeSymbolAsyncIteratorGetterCodeGenerator(vm), globalObject);
42-
putDirectWithoutTransition(vm, vm.propertyNames->asyncIteratorSymbol, asyncIteratorPrototypeFunction, static_cast<unsigned>(PropertyAttribute::DontEnum));
46+
JSC_DEFINE_HOST_FUNCTION(asyncIteratorProtoFuncAsyncIterator, (JSGlobalObject* globalObject, CallFrame* callFrame))
47+
{
48+
return JSValue::encode(callFrame->thisValue().toThis(globalObject, ECMAMode::strict()));
4349
}
4450

4551
} // namespace JSC

‎Source/JavaScriptCore/runtime/Intrinsic.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ namespace JSC {
6060
macro(ArrayValuesIntrinsic) \
6161
macro(ArrayKeysIntrinsic) \
6262
macro(ArrayEntriesIntrinsic) \
63+
macro(AsyncIteratorIntrinsic) \
6364
macro(BooleanConstructorIntrinsic) \
6465
macro(CharCodeAtIntrinsic) \
6566
macro(CharAtIntrinsic) \
@@ -137,6 +138,7 @@ namespace JSC {
137138
macro(IsTypedArrayViewIntrinsic) \
138139
macro(BoundFunctionCallIntrinsic) \
139140
macro(RemoteFunctionCallIntrinsic) \
141+
macro(IteratorIntrinsic) \
140142
macro(JSMapGetIntrinsic) \
141143
macro(JSMapHasIntrinsic) \
142144
macro(JSMapSetIntrinsic) \

‎Source/JavaScriptCore/runtime/IteratorPrototype.cpp‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,19 @@ namespace JSC {
3333

3434
const ClassInfo IteratorPrototype::s_info = { "Iterator"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(IteratorPrototype) };
3535

36+
static JSC_DECLARE_HOST_FUNCTION(iteratorProtoFuncIterator);
37+
3638
void IteratorPrototype::finishCreation(VM& vm, JSGlobalObject* globalObject)
3739
{
3840
Base::finishCreation(vm);
3941
ASSERT(inherits(info()));
42+
JSFunction* iteratorFunction = JSFunction::create(vm, globalObject, 0, "[Symbol.iterator]"_s, iteratorProtoFuncIterator, ImplementationVisibility::Public, IteratorIntrinsic);
43+
putDirectWithoutTransition(vm, vm.propertyNames->iteratorSymbol, iteratorFunction, static_cast<unsigned>(PropertyAttribute::DontEnum));
44+
}
4045

41-
JSC_BUILTIN_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames->iteratorSymbol, iteratorPrototypeSymbolIteratorGetterCodeGenerator, static_cast<unsigned>(PropertyAttribute::DontEnum));
46+
JSC_DEFINE_HOST_FUNCTION(iteratorProtoFuncIterator, (JSGlobalObject* globalObject, CallFrame* callFrame))
47+
{
48+
return JSValue::encode(callFrame->thisValue().toThis(globalObject, ECMAMode::strict()));
4249
}
4350

4451
} // namespace JSC

0 commit comments

Comments
 (0)