Skip to content

Commit 76547e3

Browse files
committed
[JSC] Add JSRegExpStringIterator
https://bugs.webkit.org/show_bug.cgi?id=279334 Reviewed by Yusuke Suzuki. This patch adds `JSRegExpStringIterator`. * Source/JavaScriptCore/CMakeLists.txt: * Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj: * Source/JavaScriptCore/Sources.txt: * Source/JavaScriptCore/builtins/BuiltinNames.h: * Source/JavaScriptCore/builtins/RegExpPrototype.js: (overriddenName.string_appeared_here.matchAll): (linkTimeConstant.RegExpStringIterator): Deleted. * Source/JavaScriptCore/builtins/RegExpStringIteratorPrototype.js: (next): * Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp: (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry): * Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h: * Source/JavaScriptCore/bytecode/LinkTimeConstant.h: * Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::emitIsRegExpStringIterator): * Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp: (JSC::regExpStringIteratorInternalFieldIndex): (JSC::BytecodeIntrinsicNode::emit_intrinsic_getRegExpStringIteratorInternalField): (JSC::BytecodeIntrinsicNode::emit_intrinsic_putRegExpStringIteratorInternalField): * Source/JavaScriptCore/heap/Heap.h: * Source/JavaScriptCore/heap/HeapSubspaceTypes.h: * Source/JavaScriptCore/runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildrenImpl): * Source/JavaScriptCore/runtime/JSGlobalObject.h: (JSC::JSGlobalObject::regExpStringIteratorPrototype const): (JSC::JSGlobalObject::regExpStringIteratorStructure const): * Source/JavaScriptCore/runtime/JSRegExpStringIterator.cpp: Added. (JSC::JSRegExpStringIterator::createWithInitialValues): (JSC::JSRegExpStringIterator::finishCreation): (JSC::JSRegExpStringIterator::visitChildrenImpl): (JSC::JSC_DEFINE_HOST_FUNCTION): * Source/JavaScriptCore/runtime/JSRegExpStringIterator.h: Added. * Source/JavaScriptCore/runtime/JSRegExpStringIteratorInlines.h: Added. (JSC::JSRegExpStringIterator::createStructure): * Source/JavaScriptCore/runtime/JSType.cpp: (WTF::printInternal): * Source/JavaScriptCore/runtime/JSType.h: Canonical link: https://commits.webkit.org/283542@main
1 parent 133e49a commit 76547e3

20 files changed

Lines changed: 321 additions & 32 deletions

‎Source/JavaScriptCore/CMakeLists.txt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,7 @@ set(JavaScriptCore_PRIVATE_FRAMEWORK_HEADERS
11051105
runtime/JSPromise.h
11061106
runtime/JSPromiseConstructor.h
11071107
runtime/JSPropertyNameEnumerator.h
1108+
runtime/JSRegExpStringIterator.h
11081109
runtime/JSRemoteFunction.h
11091110
runtime/JSRunLoopTimer.h
11101111
runtime/JSScope.h

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1421,6 +1421,8 @@
14211421
8BC064961E1D845C00B2B8CA /* AsyncIteratorPrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BC064941E1D828B00B2B8CA /* AsyncIteratorPrototype.h */; settings = {ATTRIBUTES = (Private, ); }; };
14221422
8CB955CB2C8AF8E100282DA2 /* JSAsyncFromSyncIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CB955CA2C8AF8E100282DA2 /* JSAsyncFromSyncIterator.h */; };
14231423
8CB955CD2C8AF8F500282DA2 /* JSAsyncFromSyncIteratorInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CB955CC2C8AF8F500282DA2 /* JSAsyncFromSyncIteratorInlines.h */; };
1424+
8CB955D12C8E9A0C00282DA2 /* JSRegExpStringIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CB955D02C8E9A0C00282DA2 /* JSRegExpStringIterator.h */; };
1425+
8CB955D32C8E9A1300282DA2 /* JSRegExpStringIteratorInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CB955D22C8E9A1300282DA2 /* JSRegExpStringIteratorInlines.h */; };
14241426
8CCBF05D2C804E7E00EEC20B /* WrapForValidIteratorPrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CCBF05C2C804E7E00EEC20B /* WrapForValidIteratorPrototype.h */; };
14251427
8CCBF05F2C804E8500EEC20B /* WrapForValidIteratorPrototypeInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CCBF05E2C804E8500EEC20B /* WrapForValidIteratorPrototypeInlines.h */; };
14261428
8CCBF0622C804EAF00EEC20B /* JSWrapForValidIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CCBF0612C804EAF00EEC20B /* JSWrapForValidIterator.h */; };
@@ -4721,6 +4723,9 @@
47214723
8CB955C92C8AF8D000282DA2 /* JSAsyncFromSyncIterator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSAsyncFromSyncIterator.cpp; sourceTree = "<group>"; };
47224724
8CB955CA2C8AF8E100282DA2 /* JSAsyncFromSyncIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAsyncFromSyncIterator.h; sourceTree = "<group>"; };
47234725
8CB955CC2C8AF8F500282DA2 /* JSAsyncFromSyncIteratorInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAsyncFromSyncIteratorInlines.h; sourceTree = "<group>"; };
4726+
8CB955D02C8E9A0C00282DA2 /* JSRegExpStringIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSRegExpStringIterator.h; sourceTree = "<group>"; };
4727+
8CB955D22C8E9A1300282DA2 /* JSRegExpStringIteratorInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSRegExpStringIteratorInlines.h; sourceTree = "<group>"; };
4728+
8CB955D42C8E9A1900282DA2 /* JSRegExpStringIterator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSRegExpStringIterator.cpp; sourceTree = "<group>"; };
47244729
8CCBF05B2C804E7800EEC20B /* WrapForValidIteratorPrototype.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WrapForValidIteratorPrototype.cpp; sourceTree = "<group>"; };
47254730
8CCBF05C2C804E7E00EEC20B /* WrapForValidIteratorPrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WrapForValidIteratorPrototype.h; sourceTree = "<group>"; };
47264731
8CCBF05E2C804E8500EEC20B /* WrapForValidIteratorPrototypeInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WrapForValidIteratorPrototypeInlines.h; sourceTree = "<group>"; };
@@ -8455,6 +8460,9 @@
84558460
2A05ABD31961DF2400341750 /* JSPropertyNameEnumerator.cpp */,
84568461
2A05ABD41961DF2400341750 /* JSPropertyNameEnumerator.h */,
84578462
276B387A2A71D11700252F4E /* JSPropertyNameEnumeratorInlines.h */,
8463+
8CB955D42C8E9A1900282DA2 /* JSRegExpStringIterator.cpp */,
8464+
8CB955D02C8E9A0C00282DA2 /* JSRegExpStringIterator.h */,
8465+
8CB955D22C8E9A1300282DA2 /* JSRegExpStringIteratorInlines.h */,
84588466
5B40327F2798D1FD00F37939 /* JSRemoteFunction.cpp */,
84598467
5B40327E2798D1FD00F37939 /* JSRemoteFunction.h */,
84608468
276B38792A71D11700252F4E /* JSRemoteFunctionInlines.h */,
@@ -11332,6 +11340,8 @@
1133211340
7C184E1F17BEE22E007CB63A /* JSPromisePrototype.h in Headers */,
1133311341
2A05ABD61961DF2400341750 /* JSPropertyNameEnumerator.h in Headers */,
1133411342
276B387D2A71D11800252F4E /* JSPropertyNameEnumeratorInlines.h in Headers */,
11343+
8CB955D12C8E9A0C00282DA2 /* JSRegExpStringIterator.h in Headers */,
11344+
8CB955D32C8E9A1300282DA2 /* JSRegExpStringIteratorInlines.h in Headers */,
1133511345
5B4032802798D20600F37939 /* JSRemoteFunction.h in Headers */,
1133611346
276B387C2A71D11800252F4E /* JSRemoteFunctionInlines.h in Headers */,
1133711347
A552C3801ADDB8FE00139726 /* JSRemoteInspector.h in Headers */,

‎Source/JavaScriptCore/Sources.txt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,7 @@ runtime/JSPromise.cpp
947947
runtime/JSPromiseConstructor.cpp
948948
runtime/JSPromisePrototype.cpp
949949
runtime/JSPropertyNameEnumerator.cpp
950+
runtime/JSRegExpStringIterator.cpp
950951
runtime/JSRemoteFunction.cpp
951952
runtime/JSRunLoopTimer.cpp
952953
runtime/JSScope.cpp

‎Source/JavaScriptCore/builtins/BuiltinNames.h‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,6 @@ namespace JSC {
178178
macro(regExpSearchFast) \
179179
macro(regExpSplitFast) \
180180
macro(regExpTestFast) \
181-
macro(regExpStringIteratorRegExp) \
182-
macro(regExpStringIteratorString) \
183-
macro(regExpStringIteratorGlobal) \
184-
macro(regExpStringIteratorUnicode) \
185-
macro(regExpStringIteratorDone) \
186181
macro(stringIncludesInternal) \
187182
macro(stringIndexOfInternal) \
188183
macro(stringSplitFast) \
@@ -222,6 +217,7 @@ namespace JSC {
222217
macro(pop) \
223218
macro(wrapForValidIteratorCreate) \
224219
macro(asyncFromSyncIteratorCreate) \
220+
macro(regExpStringIteratorCreate) \
225221

226222

227223
namespace Symbols {

‎Source/JavaScriptCore/builtins/RegExpPrototype.js‎

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,6 @@
2323
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2424
*/
2525

26-
@linkTimeConstant
27-
@constructor
28-
function RegExpStringIterator(regExp, string, global, fullUnicode)
29-
{
30-
"use strict";
31-
32-
@putByIdDirectPrivate(this, "regExpStringIteratorRegExp", regExp);
33-
@putByIdDirectPrivate(this, "regExpStringIteratorString", string);
34-
@putByIdDirectPrivate(this, "regExpStringIteratorGlobal", global);
35-
@putByIdDirectPrivate(this, "regExpStringIteratorUnicode", fullUnicode);
36-
@putByIdDirectPrivate(this, "regExpStringIteratorDone", false);
37-
}
38-
3926
@linkTimeConstant
4027
function advanceStringIndex(string, index, unicode)
4128
{
@@ -175,7 +162,7 @@ function matchAll(strArg)
175162
var global = @stringIncludesInternal.@call(flags, "g");
176163
var fullUnicode = @stringIncludesInternal.@call(flags, "u") || @stringIncludesInternal.@call(flags, "v");
177164

178-
return new @RegExpStringIterator(matcher, string, global, fullUnicode);
165+
return @regExpStringIteratorCreate(matcher, string, global, fullUnicode);
179166
}
180167

181168
@linkTimeConstant

‎Source/JavaScriptCore/builtins/RegExpStringIteratorPrototype.js‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,20 @@ function next()
3030
if (!@isObject(this))
3131
@throwTypeError("%RegExpStringIteratorPrototype%.next requires |this| to be an Object");
3232

33-
var done = @getByIdDirectPrivate(this, "regExpStringIteratorDone");
34-
if (done === @undefined)
33+
if (!@isRegExpStringIterator(this))
3534
@throwTypeError("%RegExpStringIteratorPrototype%.next requires |this| to be an RegExp String Iterator instance");
3635

36+
var done = @getRegExpStringIteratorInternalField(this, @regExpStringIteratorFieldDone);
3737
if (done)
3838
return { value: @undefined, done: true };
3939

40-
var regExp = @getByIdDirectPrivate(this, "regExpStringIteratorRegExp");
41-
var string = @getByIdDirectPrivate(this, "regExpStringIteratorString");
42-
var global = @getByIdDirectPrivate(this, "regExpStringIteratorGlobal");
43-
var fullUnicode = @getByIdDirectPrivate(this, "regExpStringIteratorUnicode");
40+
var regExp = @getRegExpStringIteratorInternalField(this, @regExpStringIteratorFieldRegExp);
41+
var string = @getRegExpStringIteratorInternalField(this, @regExpStringIteratorFieldString);
42+
var global = @getRegExpStringIteratorInternalField(this, @regExpStringIteratorFieldGlobal);
43+
var fullUnicode = @getRegExpStringIteratorInternalField(this, @regExpStringIteratorFieldFullUnicode);
4444
var match = @regExpExec(regExp, string);
4545
if (match === null) {
46-
@putByIdDirectPrivate(this, "regExpStringIteratorDone", true);
46+
@putRegExpStringIteratorInternalField(this, @regExpStringIteratorFieldDone, true);
4747
return { value: @undefined, done: true };
4848
}
4949

@@ -54,7 +54,7 @@ function next()
5454
regExp.lastIndex = @advanceStringIndex(string, thisIndex, fullUnicode);
5555
}
5656
} else
57-
@putByIdDirectPrivate(this, "regExpStringIteratorDone", true);
57+
@putRegExpStringIteratorInternalField(this, @regExpStringIteratorFieldDone, true);
5858

5959
return { value: match, done: false };
6060
}

‎Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "JSMapIterator.h"
4242
#include "JSModuleLoader.h"
4343
#include "JSPromise.h"
44+
#include "JSRegExpStringIterator.h"
4445
#include "JSSetIterator.h"
4546
#include "JSStringIterator.h"
4647
#include "JSWrapForValidIterator.h"
@@ -129,6 +130,11 @@ BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry(VM& vm)
129130
m_abstractModuleRecordFieldState.set(m_vm, jsNumber(static_cast<int32_t>(AbstractModuleRecord::Field::State)));
130131
m_wrapForValidIteratorFieldIteratedIterator.set(m_vm, jsNumber(static_cast<int32_t>(JSWrapForValidIterator::Field::IteratedIterator)));
131132
m_wrapForValidIteratorFieldIteratedNextMethod.set(m_vm, jsNumber(static_cast<int32_t>(JSWrapForValidIterator::Field::IteratedNextMethod)));
133+
m_regExpStringIteratorFieldRegExp.set(m_vm, jsNumber(static_cast<int32_t>(JSRegExpStringIterator::Field::RegExp)));
134+
m_regExpStringIteratorFieldString.set(m_vm, jsNumber(static_cast<int32_t>(JSRegExpStringIterator::Field::String)));
135+
m_regExpStringIteratorFieldGlobal.set(m_vm, jsNumber(static_cast<int32_t>(JSRegExpStringIterator::Field::Global)));
136+
m_regExpStringIteratorFieldFullUnicode.set(m_vm, jsNumber(static_cast<int32_t>(JSRegExpStringIterator::Field::FullUnicode)));
137+
m_regExpStringIteratorFieldDone.set(m_vm, jsNumber(static_cast<int32_t>(JSRegExpStringIterator::Field::Done)));
132138
}
133139

134140
std::optional<BytecodeIntrinsicRegistry::Entry> BytecodeIntrinsicRegistry::lookup(const Identifier& ident) const

‎Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ enum class LinkTimeConstant : int32_t;
5656
macro(getStringIteratorInternalField) \
5757
macro(getMapIteratorInternalField) \
5858
macro(getSetIteratorInternalField) \
59+
macro(getRegExpStringIteratorInternalField) \
5960
macro(getProxyInternalField) \
6061
macro(getWrapForValidIteratorInternalField) \
6162
macro(idWithProfile) \
@@ -78,6 +79,7 @@ enum class LinkTimeConstant : int32_t;
7879
macro(isSetIterator) \
7980
macro(isUndefinedOrNull) \
8081
macro(isWrapForValidIterator) \
82+
macro(isRegExpStringIterator) \
8183
macro(tailCallForwardArguments) \
8284
macro(throwTypeError) \
8385
macro(throwRangeError) \
@@ -96,6 +98,7 @@ enum class LinkTimeConstant : int32_t;
9698
macro(putStringIteratorInternalField) \
9799
macro(putMapIteratorInternalField) \
98100
macro(putSetIteratorInternalField) \
101+
macro(putRegExpStringIteratorInternalField) \
99102
macro(superSamplerBegin) \
100103
macro(superSamplerEnd) \
101104
macro(toNumber) \
@@ -180,6 +183,11 @@ enum class LinkTimeConstant : int32_t;
180183
macro(abstractModuleRecordFieldState) \
181184
macro(wrapForValidIteratorFieldIteratedIterator) \
182185
macro(wrapForValidIteratorFieldIteratedNextMethod) \
186+
macro(regExpStringIteratorFieldRegExp) \
187+
macro(regExpStringIteratorFieldString) \
188+
macro(regExpStringIteratorFieldGlobal) \
189+
macro(regExpStringIteratorFieldFullUnicode) \
190+
macro(regExpStringIteratorFieldDone) \
183191

184192

185193
#define JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_CUSTOM_EACH_NAME(macro) \

‎Source/JavaScriptCore/bytecode/LinkTimeConstant.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ class JSGlobalObject;
151151
v(BigUint64Array, nullptr) \
152152
v(wrapForValidIteratorCreate, nullptr) \
153153
v(asyncFromSyncIteratorCreate, nullptr) \
154+
v(regExpStringIteratorCreate, nullptr) \
154155

155156

156157
#define DECLARE_LINK_TIME_CONSTANT(name, code) name,

‎Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,7 @@ namespace JSC {
933933
RegisterID* emitIsMapIterator(RegisterID* dst, RegisterID* src) { return emitIsCellWithType(dst, src, JSMapIteratorType); }
934934
RegisterID* emitIsSetIterator(RegisterID* dst, RegisterID* src) { return emitIsCellWithType(dst, src, JSSetIteratorType); }
935935
RegisterID* emitIsWrapForValidIterator(RegisterID* dst, RegisterID* src) { return emitIsCellWithType(dst, src, JSWrapForValidIteratorType); }
936+
RegisterID* emitIsRegExpStringIterator(RegisterID* dst, RegisterID* src) { return emitIsCellWithType(dst, src, JSRegExpStringIteratorType); }
936937
RegisterID* emitIsObject(RegisterID* dst, RegisterID* src);
937938
RegisterID* emitIsCallable(RegisterID* dst, RegisterID* src);
938939
RegisterID* emitIsConstructor(RegisterID* dst, RegisterID* src);

0 commit comments

Comments
 (0)