@@ -28777,3 +28777,217 @@ TEST(TestSetWasmThreadsEnabledCallback) {
28777
28777
i::FLAG_experimental_wasm_threads = false;
28778
28778
CHECK(i_isolate->AreWasmThreadsEnabled(i_context));
28779
28779
}
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