@@ -28777,3 +28777,217 @@ TEST(TestSetWasmThreadsEnabledCallback) {
2877728777 i::FLAG_experimental_wasm_threads = false;
2877828778 CHECK(i_isolate->AreWasmThreadsEnabled(i_context));
2877928779}
28780+
28781+ TEST(PreviewSetIteratorEntriesWithDeleted) {
28782+ LocalContext env;
28783+ v8::HandleScope handle_scope(env->GetIsolate());
28784+ v8::Local<v8::Context> context = env.local();
28785+
28786+ {
28787+ // Create set, delete entry, create iterator, preview.
28788+ v8::Local<v8::Object> iterator =
28789+ CompileRun("var set = new Set([1,2,3]); set.delete(1); set.keys()")
28790+ ->ToObject(context)
28791+ .ToLocalChecked();
28792+ bool is_key;
28793+ v8::Local<v8::Array> entries =
28794+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28795+ CHECK(!is_key);
28796+ CHECK_EQ(2, entries->Length());
28797+ CHECK_EQ(2, entries->Get(context, 0)
28798+ .ToLocalChecked()
28799+ ->Int32Value(context)
28800+ .FromJust());
28801+ CHECK_EQ(3, entries->Get(context, 1)
28802+ .ToLocalChecked()
28803+ ->Int32Value(context)
28804+ .FromJust());
28805+ }
28806+ {
28807+ // Create set, create iterator, delete entry, preview.
28808+ v8::Local<v8::Object> iterator =
28809+ CompileRun("var set = new Set([1,2,3]); set.keys()")
28810+ ->ToObject(context)
28811+ .ToLocalChecked();
28812+ CompileRun("set.delete(1);");
28813+ bool is_key;
28814+ v8::Local<v8::Array> entries =
28815+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28816+ CHECK(!is_key);
28817+ CHECK_EQ(2, entries->Length());
28818+ CHECK_EQ(2, entries->Get(context, 0)
28819+ .ToLocalChecked()
28820+ ->Int32Value(context)
28821+ .FromJust());
28822+ CHECK_EQ(3, entries->Get(context, 1)
28823+ .ToLocalChecked()
28824+ ->Int32Value(context)
28825+ .FromJust());
28826+ }
28827+ {
28828+ // Create set, create iterator, delete entry, iterate, preview.
28829+ v8::Local<v8::Object> iterator =
28830+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
28831+ ->ToObject(context)
28832+ .ToLocalChecked();
28833+ CompileRun("set.delete(1); it.next();");
28834+ bool is_key;
28835+ v8::Local<v8::Array> entries =
28836+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28837+ CHECK(!is_key);
28838+ CHECK_EQ(1, entries->Length());
28839+ CHECK_EQ(3, entries->Get(context, 0)
28840+ .ToLocalChecked()
28841+ ->Int32Value(context)
28842+ .FromJust());
28843+ }
28844+ {
28845+ // Create set, create iterator, delete entry, iterate until empty, preview.
28846+ v8::Local<v8::Object> iterator =
28847+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
28848+ ->ToObject(context)
28849+ .ToLocalChecked();
28850+ CompileRun("set.delete(1); it.next(); it.next();");
28851+ bool is_key;
28852+ v8::Local<v8::Array> entries =
28853+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28854+ CHECK(!is_key);
28855+ CHECK_EQ(0, entries->Length());
28856+ }
28857+ {
28858+ // Create set, create iterator, delete entry, iterate, trigger rehash,
28859+ // preview.
28860+ v8::Local<v8::Object> iterator =
28861+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
28862+ ->ToObject(context)
28863+ .ToLocalChecked();
28864+ CompileRun("set.delete(1); it.next();");
28865+ CompileRun("for (var i = 4; i < 20; i++) set.add(i);");
28866+ bool is_key;
28867+ v8::Local<v8::Array> entries =
28868+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28869+ CHECK(!is_key);
28870+ CHECK_EQ(17, entries->Length());
28871+ for (uint32_t i = 0; i < 17; i++) {
28872+ CHECK_EQ(i + 3, entries->Get(context, i)
28873+ .ToLocalChecked()
28874+ ->Int32Value(context)
28875+ .FromJust());
28876+ }
28877+ }
28878+ }
28879+
28880+ TEST(PreviewMapIteratorEntriesWithDeleted) {
28881+ LocalContext env;
28882+ v8::HandleScope handle_scope(env->GetIsolate());
28883+ v8::Local<v8::Context> context = env.local();
28884+
28885+ {
28886+ // Create map, delete entry, create iterator, preview.
28887+ v8::Local<v8::Object> iterator = CompileRun(
28888+ "var map = new Map();"
28889+ "var key = {}; map.set(key, 1);"
28890+ "map.set({}, 2); map.set({}, 3);"
28891+ "map.delete(key);"
28892+ "map.values()")
28893+ ->ToObject(context)
28894+ .ToLocalChecked();
28895+ bool is_key;
28896+ v8::Local<v8::Array> entries =
28897+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28898+ CHECK(!is_key);
28899+ CHECK_EQ(2, entries->Length());
28900+ CHECK_EQ(2, entries->Get(context, 0)
28901+ .ToLocalChecked()
28902+ ->Int32Value(context)
28903+ .FromJust());
28904+ CHECK_EQ(3, entries->Get(context, 1)
28905+ .ToLocalChecked()
28906+ ->Int32Value(context)
28907+ .FromJust());
28908+ }
28909+ {
28910+ // Create map, create iterator, delete entry, preview.
28911+ v8::Local<v8::Object> iterator = CompileRun(
28912+ "var map = new Map();"
28913+ "var key = {}; map.set(key, 1);"
28914+ "map.set({}, 2); map.set({}, 3);"
28915+ "map.values()")
28916+ ->ToObject(context)
28917+ .ToLocalChecked();
28918+ CompileRun("map.delete(key);");
28919+ bool is_key;
28920+ v8::Local<v8::Array> entries =
28921+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28922+ CHECK(!is_key);
28923+ CHECK_EQ(2, entries->Length());
28924+ CHECK_EQ(2, entries->Get(context, 0)
28925+ .ToLocalChecked()
28926+ ->Int32Value(context)
28927+ .FromJust());
28928+ CHECK_EQ(3, entries->Get(context, 1)
28929+ .ToLocalChecked()
28930+ ->Int32Value(context)
28931+ .FromJust());
28932+ }
28933+ {
28934+ // Create map, create iterator, delete entry, iterate, preview.
28935+ v8::Local<v8::Object> iterator = CompileRun(
28936+ "var map = new Map();"
28937+ "var key = {}; map.set(key, 1);"
28938+ "map.set({}, 2); map.set({}, 3);"
28939+ "var it = map.values(); it")
28940+ ->ToObject(context)
28941+ .ToLocalChecked();
28942+ CompileRun("map.delete(key); it.next();");
28943+ bool is_key;
28944+ v8::Local<v8::Array> entries =
28945+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28946+ CHECK(!is_key);
28947+ CHECK_EQ(1, entries->Length());
28948+ CHECK_EQ(3, entries->Get(context, 0)
28949+ .ToLocalChecked()
28950+ ->Int32Value(context)
28951+ .FromJust());
28952+ }
28953+ {
28954+ // Create map, create iterator, delete entry, iterate until empty, preview.
28955+ v8::Local<v8::Object> iterator = CompileRun(
28956+ "var map = new Map();"
28957+ "var key = {}; map.set(key, 1);"
28958+ "map.set({}, 2); map.set({}, 3);"
28959+ "var it = map.values(); it")
28960+ ->ToObject(context)
28961+ .ToLocalChecked();
28962+ CompileRun("map.delete(key); it.next(); it.next();");
28963+ bool is_key;
28964+ v8::Local<v8::Array> entries =
28965+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28966+ CHECK(!is_key);
28967+ CHECK_EQ(0, entries->Length());
28968+ }
28969+ {
28970+ // Create map, create iterator, delete entry, iterate, trigger rehash,
28971+ // preview.
28972+ v8::Local<v8::Object> iterator = CompileRun(
28973+ "var map = new Map();"
28974+ "var key = {}; map.set(key, 1);"
28975+ "map.set({}, 2); map.set({}, 3);"
28976+ "var it = map.values(); it")
28977+ ->ToObject(context)
28978+ .ToLocalChecked();
28979+ CompileRun("map.delete(key); it.next();");
28980+ CompileRun("for (var i = 4; i < 20; i++) map.set({}, i);");
28981+ bool is_key;
28982+ v8::Local<v8::Array> entries =
28983+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28984+ CHECK(!is_key);
28985+ CHECK_EQ(17, entries->Length());
28986+ for (uint32_t i = 0; i < 17; i++) {
28987+ CHECK_EQ(i + 3, entries->Get(context, i)
28988+ .ToLocalChecked()
28989+ ->Int32Value(context)
28990+ .FromJust());
28991+ }
28992+ }
28993+ }
0 commit comments