@@ -28976,3 +28976,217 @@ TEST(MicrotaskContextShouldBeNativeContext) {
2897628976
2897728977 isolate->RunMicrotasks();
2897828978}
28979+
28980+ TEST(PreviewSetIteratorEntriesWithDeleted) {
28981+ LocalContext env;
28982+ v8::HandleScope handle_scope(env->GetIsolate());
28983+ v8::Local<v8::Context> context = env.local();
28984+
28985+ {
28986+ // Create set, delete entry, create iterator, preview.
28987+ v8::Local<v8::Object> iterator =
28988+ CompileRun("var set = new Set([1,2,3]); set.delete(1); set.keys()")
28989+ ->ToObject(context)
28990+ .ToLocalChecked();
28991+ bool is_key;
28992+ v8::Local<v8::Array> entries =
28993+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28994+ CHECK(!is_key);
28995+ CHECK_EQ(2, entries->Length());
28996+ CHECK_EQ(2, entries->Get(context, 0)
28997+ .ToLocalChecked()
28998+ ->Int32Value(context)
28999+ .FromJust());
29000+ CHECK_EQ(3, entries->Get(context, 1)
29001+ .ToLocalChecked()
29002+ ->Int32Value(context)
29003+ .FromJust());
29004+ }
29005+ {
29006+ // Create set, create iterator, delete entry, preview.
29007+ v8::Local<v8::Object> iterator =
29008+ CompileRun("var set = new Set([1,2,3]); set.keys()")
29009+ ->ToObject(context)
29010+ .ToLocalChecked();
29011+ CompileRun("set.delete(1);");
29012+ bool is_key;
29013+ v8::Local<v8::Array> entries =
29014+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29015+ CHECK(!is_key);
29016+ CHECK_EQ(2, entries->Length());
29017+ CHECK_EQ(2, entries->Get(context, 0)
29018+ .ToLocalChecked()
29019+ ->Int32Value(context)
29020+ .FromJust());
29021+ CHECK_EQ(3, entries->Get(context, 1)
29022+ .ToLocalChecked()
29023+ ->Int32Value(context)
29024+ .FromJust());
29025+ }
29026+ {
29027+ // Create set, create iterator, delete entry, iterate, preview.
29028+ v8::Local<v8::Object> iterator =
29029+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
29030+ ->ToObject(context)
29031+ .ToLocalChecked();
29032+ CompileRun("set.delete(1); it.next();");
29033+ bool is_key;
29034+ v8::Local<v8::Array> entries =
29035+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29036+ CHECK(!is_key);
29037+ CHECK_EQ(1, entries->Length());
29038+ CHECK_EQ(3, entries->Get(context, 0)
29039+ .ToLocalChecked()
29040+ ->Int32Value(context)
29041+ .FromJust());
29042+ }
29043+ {
29044+ // Create set, create iterator, delete entry, iterate until empty, preview.
29045+ v8::Local<v8::Object> iterator =
29046+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
29047+ ->ToObject(context)
29048+ .ToLocalChecked();
29049+ CompileRun("set.delete(1); it.next(); it.next();");
29050+ bool is_key;
29051+ v8::Local<v8::Array> entries =
29052+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29053+ CHECK(!is_key);
29054+ CHECK_EQ(0, entries->Length());
29055+ }
29056+ {
29057+ // Create set, create iterator, delete entry, iterate, trigger rehash,
29058+ // preview.
29059+ v8::Local<v8::Object> iterator =
29060+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
29061+ ->ToObject(context)
29062+ .ToLocalChecked();
29063+ CompileRun("set.delete(1); it.next();");
29064+ CompileRun("for (var i = 4; i < 20; i++) set.add(i);");
29065+ bool is_key;
29066+ v8::Local<v8::Array> entries =
29067+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29068+ CHECK(!is_key);
29069+ CHECK_EQ(17, entries->Length());
29070+ for (uint32_t i = 0; i < 17; i++) {
29071+ CHECK_EQ(i + 3, entries->Get(context, i)
29072+ .ToLocalChecked()
29073+ ->Int32Value(context)
29074+ .FromJust());
29075+ }
29076+ }
29077+ }
29078+
29079+ TEST(PreviewMapIteratorEntriesWithDeleted) {
29080+ LocalContext env;
29081+ v8::HandleScope handle_scope(env->GetIsolate());
29082+ v8::Local<v8::Context> context = env.local();
29083+
29084+ {
29085+ // Create map, delete entry, create iterator, preview.
29086+ v8::Local<v8::Object> iterator = CompileRun(
29087+ "var map = new Map();"
29088+ "var key = {}; map.set(key, 1);"
29089+ "map.set({}, 2); map.set({}, 3);"
29090+ "map.delete(key);"
29091+ "map.values()")
29092+ ->ToObject(context)
29093+ .ToLocalChecked();
29094+ bool is_key;
29095+ v8::Local<v8::Array> entries =
29096+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29097+ CHECK(!is_key);
29098+ CHECK_EQ(2, entries->Length());
29099+ CHECK_EQ(2, entries->Get(context, 0)
29100+ .ToLocalChecked()
29101+ ->Int32Value(context)
29102+ .FromJust());
29103+ CHECK_EQ(3, entries->Get(context, 1)
29104+ .ToLocalChecked()
29105+ ->Int32Value(context)
29106+ .FromJust());
29107+ }
29108+ {
29109+ // Create map, create iterator, delete entry, preview.
29110+ v8::Local<v8::Object> iterator = CompileRun(
29111+ "var map = new Map();"
29112+ "var key = {}; map.set(key, 1);"
29113+ "map.set({}, 2); map.set({}, 3);"
29114+ "map.values()")
29115+ ->ToObject(context)
29116+ .ToLocalChecked();
29117+ CompileRun("map.delete(key);");
29118+ bool is_key;
29119+ v8::Local<v8::Array> entries =
29120+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29121+ CHECK(!is_key);
29122+ CHECK_EQ(2, entries->Length());
29123+ CHECK_EQ(2, entries->Get(context, 0)
29124+ .ToLocalChecked()
29125+ ->Int32Value(context)
29126+ .FromJust());
29127+ CHECK_EQ(3, entries->Get(context, 1)
29128+ .ToLocalChecked()
29129+ ->Int32Value(context)
29130+ .FromJust());
29131+ }
29132+ {
29133+ // Create map, create iterator, delete entry, iterate, preview.
29134+ v8::Local<v8::Object> iterator = CompileRun(
29135+ "var map = new Map();"
29136+ "var key = {}; map.set(key, 1);"
29137+ "map.set({}, 2); map.set({}, 3);"
29138+ "var it = map.values(); it")
29139+ ->ToObject(context)
29140+ .ToLocalChecked();
29141+ CompileRun("map.delete(key); it.next();");
29142+ bool is_key;
29143+ v8::Local<v8::Array> entries =
29144+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29145+ CHECK(!is_key);
29146+ CHECK_EQ(1, entries->Length());
29147+ CHECK_EQ(3, entries->Get(context, 0)
29148+ .ToLocalChecked()
29149+ ->Int32Value(context)
29150+ .FromJust());
29151+ }
29152+ {
29153+ // Create map, create iterator, delete entry, iterate until empty, preview.
29154+ v8::Local<v8::Object> iterator = CompileRun(
29155+ "var map = new Map();"
29156+ "var key = {}; map.set(key, 1);"
29157+ "map.set({}, 2); map.set({}, 3);"
29158+ "var it = map.values(); it")
29159+ ->ToObject(context)
29160+ .ToLocalChecked();
29161+ CompileRun("map.delete(key); it.next(); it.next();");
29162+ bool is_key;
29163+ v8::Local<v8::Array> entries =
29164+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29165+ CHECK(!is_key);
29166+ CHECK_EQ(0, entries->Length());
29167+ }
29168+ {
29169+ // Create map, create iterator, delete entry, iterate, trigger rehash,
29170+ // preview.
29171+ v8::Local<v8::Object> iterator = CompileRun(
29172+ "var map = new Map();"
29173+ "var key = {}; map.set(key, 1);"
29174+ "map.set({}, 2); map.set({}, 3);"
29175+ "var it = map.values(); it")
29176+ ->ToObject(context)
29177+ .ToLocalChecked();
29178+ CompileRun("map.delete(key); it.next();");
29179+ CompileRun("for (var i = 4; i < 20; i++) map.set({}, i);");
29180+ bool is_key;
29181+ v8::Local<v8::Array> entries =
29182+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29183+ CHECK(!is_key);
29184+ CHECK_EQ(17, entries->Length());
29185+ for (uint32_t i = 0; i < 17; i++) {
29186+ CHECK_EQ(i + 3, entries->Get(context, i)
29187+ .ToLocalChecked()
29188+ ->Int32Value(context)
29189+ .FromJust());
29190+ }
29191+ }
29192+ }
0 commit comments