@@ -28066,3 +28066,217 @@ TEST(BigIntAPI) {
2806628066 CHECK_EQ(word_count, 2);
2806728067 }
2806828068}
28069+
28070+ TEST(PreviewSetIteratorEntriesWithDeleted) {
28071+ LocalContext env;
28072+ v8::HandleScope handle_scope(env->GetIsolate());
28073+ v8::Local<v8::Context> context = env.local();
28074+
28075+ {
28076+ // Create set, delete entry, create iterator, preview.
28077+ v8::Local<v8::Object> iterator =
28078+ CompileRun("var set = new Set([1,2,3]); set.delete(1); set.keys()")
28079+ ->ToObject(context)
28080+ .ToLocalChecked();
28081+ bool is_key;
28082+ v8::Local<v8::Array> entries =
28083+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28084+ CHECK(!is_key);
28085+ CHECK_EQ(2, entries->Length());
28086+ CHECK_EQ(2, entries->Get(context, 0)
28087+ .ToLocalChecked()
28088+ ->Int32Value(context)
28089+ .FromJust());
28090+ CHECK_EQ(3, entries->Get(context, 1)
28091+ .ToLocalChecked()
28092+ ->Int32Value(context)
28093+ .FromJust());
28094+ }
28095+ {
28096+ // Create set, create iterator, delete entry, preview.
28097+ v8::Local<v8::Object> iterator =
28098+ CompileRun("var set = new Set([1,2,3]); set.keys()")
28099+ ->ToObject(context)
28100+ .ToLocalChecked();
28101+ CompileRun("set.delete(1);");
28102+ bool is_key;
28103+ v8::Local<v8::Array> entries =
28104+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28105+ CHECK(!is_key);
28106+ CHECK_EQ(2, entries->Length());
28107+ CHECK_EQ(2, entries->Get(context, 0)
28108+ .ToLocalChecked()
28109+ ->Int32Value(context)
28110+ .FromJust());
28111+ CHECK_EQ(3, entries->Get(context, 1)
28112+ .ToLocalChecked()
28113+ ->Int32Value(context)
28114+ .FromJust());
28115+ }
28116+ {
28117+ // Create set, create iterator, delete entry, iterate, preview.
28118+ v8::Local<v8::Object> iterator =
28119+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
28120+ ->ToObject(context)
28121+ .ToLocalChecked();
28122+ CompileRun("set.delete(1); it.next();");
28123+ bool is_key;
28124+ v8::Local<v8::Array> entries =
28125+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28126+ CHECK(!is_key);
28127+ CHECK_EQ(1, entries->Length());
28128+ CHECK_EQ(3, entries->Get(context, 0)
28129+ .ToLocalChecked()
28130+ ->Int32Value(context)
28131+ .FromJust());
28132+ }
28133+ {
28134+ // Create set, create iterator, delete entry, iterate until empty, preview.
28135+ v8::Local<v8::Object> iterator =
28136+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
28137+ ->ToObject(context)
28138+ .ToLocalChecked();
28139+ CompileRun("set.delete(1); it.next(); it.next();");
28140+ bool is_key;
28141+ v8::Local<v8::Array> entries =
28142+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28143+ CHECK(!is_key);
28144+ CHECK_EQ(0, entries->Length());
28145+ }
28146+ {
28147+ // Create set, create iterator, delete entry, iterate, trigger rehash,
28148+ // preview.
28149+ v8::Local<v8::Object> iterator =
28150+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
28151+ ->ToObject(context)
28152+ .ToLocalChecked();
28153+ CompileRun("set.delete(1); it.next();");
28154+ CompileRun("for (var i = 4; i < 20; i++) set.add(i);");
28155+ bool is_key;
28156+ v8::Local<v8::Array> entries =
28157+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28158+ CHECK(!is_key);
28159+ CHECK_EQ(17, entries->Length());
28160+ for (uint32_t i = 0; i < 17; i++) {
28161+ CHECK_EQ(i + 3, entries->Get(context, i)
28162+ .ToLocalChecked()
28163+ ->Int32Value(context)
28164+ .FromJust());
28165+ }
28166+ }
28167+ }
28168+
28169+ TEST(PreviewMapIteratorEntriesWithDeleted) {
28170+ LocalContext env;
28171+ v8::HandleScope handle_scope(env->GetIsolate());
28172+ v8::Local<v8::Context> context = env.local();
28173+
28174+ {
28175+ // Create map, delete entry, create iterator, preview.
28176+ v8::Local<v8::Object> iterator = CompileRun(
28177+ "var map = new Map();"
28178+ "var key = {}; map.set(key, 1);"
28179+ "map.set({}, 2); map.set({}, 3);"
28180+ "map.delete(key);"
28181+ "map.values()")
28182+ ->ToObject(context)
28183+ .ToLocalChecked();
28184+ bool is_key;
28185+ v8::Local<v8::Array> entries =
28186+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28187+ CHECK(!is_key);
28188+ CHECK_EQ(2, entries->Length());
28189+ CHECK_EQ(2, entries->Get(context, 0)
28190+ .ToLocalChecked()
28191+ ->Int32Value(context)
28192+ .FromJust());
28193+ CHECK_EQ(3, entries->Get(context, 1)
28194+ .ToLocalChecked()
28195+ ->Int32Value(context)
28196+ .FromJust());
28197+ }
28198+ {
28199+ // Create map, create iterator, delete entry, preview.
28200+ v8::Local<v8::Object> iterator = CompileRun(
28201+ "var map = new Map();"
28202+ "var key = {}; map.set(key, 1);"
28203+ "map.set({}, 2); map.set({}, 3);"
28204+ "map.values()")
28205+ ->ToObject(context)
28206+ .ToLocalChecked();
28207+ CompileRun("map.delete(key);");
28208+ bool is_key;
28209+ v8::Local<v8::Array> entries =
28210+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28211+ CHECK(!is_key);
28212+ CHECK_EQ(2, entries->Length());
28213+ CHECK_EQ(2, entries->Get(context, 0)
28214+ .ToLocalChecked()
28215+ ->Int32Value(context)
28216+ .FromJust());
28217+ CHECK_EQ(3, entries->Get(context, 1)
28218+ .ToLocalChecked()
28219+ ->Int32Value(context)
28220+ .FromJust());
28221+ }
28222+ {
28223+ // Create map, create iterator, delete entry, iterate, preview.
28224+ v8::Local<v8::Object> iterator = CompileRun(
28225+ "var map = new Map();"
28226+ "var key = {}; map.set(key, 1);"
28227+ "map.set({}, 2); map.set({}, 3);"
28228+ "var it = map.values(); it")
28229+ ->ToObject(context)
28230+ .ToLocalChecked();
28231+ CompileRun("map.delete(key); it.next();");
28232+ bool is_key;
28233+ v8::Local<v8::Array> entries =
28234+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28235+ CHECK(!is_key);
28236+ CHECK_EQ(1, entries->Length());
28237+ CHECK_EQ(3, entries->Get(context, 0)
28238+ .ToLocalChecked()
28239+ ->Int32Value(context)
28240+ .FromJust());
28241+ }
28242+ {
28243+ // Create map, create iterator, delete entry, iterate until empty, preview.
28244+ v8::Local<v8::Object> iterator = CompileRun(
28245+ "var map = new Map();"
28246+ "var key = {}; map.set(key, 1);"
28247+ "map.set({}, 2); map.set({}, 3);"
28248+ "var it = map.values(); it")
28249+ ->ToObject(context)
28250+ .ToLocalChecked();
28251+ CompileRun("map.delete(key); it.next(); it.next();");
28252+ bool is_key;
28253+ v8::Local<v8::Array> entries =
28254+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28255+ CHECK(!is_key);
28256+ CHECK_EQ(0, entries->Length());
28257+ }
28258+ {
28259+ // Create map, create iterator, delete entry, iterate, trigger rehash,
28260+ // preview.
28261+ v8::Local<v8::Object> iterator = CompileRun(
28262+ "var map = new Map();"
28263+ "var key = {}; map.set(key, 1);"
28264+ "map.set({}, 2); map.set({}, 3);"
28265+ "var it = map.values(); it")
28266+ ->ToObject(context)
28267+ .ToLocalChecked();
28268+ CompileRun("map.delete(key); it.next();");
28269+ CompileRun("for (var i = 4; i < 20; i++) map.set({}, i);");
28270+ bool is_key;
28271+ v8::Local<v8::Array> entries =
28272+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28273+ CHECK(!is_key);
28274+ CHECK_EQ(17, entries->Length());
28275+ for (uint32_t i = 0; i < 17; i++) {
28276+ CHECK_EQ(i + 3, entries->Get(context, i)
28277+ .ToLocalChecked()
28278+ ->Int32Value(context)
28279+ .FromJust());
28280+ }
28281+ }
28282+ }
0 commit comments