@@ -28852,3 +28852,217 @@ TEST(TestGetEmbeddedCodeRange) {
28852
28852
CHECK_EQ(0, builtins_range.length_in_bytes);
28853
28853
}
28854
28854
}
28855
+
28856
+ TEST(PreviewSetIteratorEntriesWithDeleted) {
28857
+ LocalContext env;
28858
+ v8::HandleScope handle_scope(env->GetIsolate());
28859
+ v8::Local<v8::Context> context = env.local();
28860
+
28861
+ {
28862
+ // Create set, delete entry, create iterator, preview.
28863
+ v8::Local<v8::Object> iterator =
28864
+ CompileRun("var set = new Set([1,2,3]); set.delete(1); set.keys()")
28865
+ ->ToObject(context)
28866
+ .ToLocalChecked();
28867
+ bool is_key;
28868
+ v8::Local<v8::Array> entries =
28869
+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28870
+ CHECK(!is_key);
28871
+ CHECK_EQ(2, entries->Length());
28872
+ CHECK_EQ(2, entries->Get(context, 0)
28873
+ .ToLocalChecked()
28874
+ ->Int32Value(context)
28875
+ .FromJust());
28876
+ CHECK_EQ(3, entries->Get(context, 1)
28877
+ .ToLocalChecked()
28878
+ ->Int32Value(context)
28879
+ .FromJust());
28880
+ }
28881
+ {
28882
+ // Create set, create iterator, delete entry, preview.
28883
+ v8::Local<v8::Object> iterator =
28884
+ CompileRun("var set = new Set([1,2,3]); set.keys()")
28885
+ ->ToObject(context)
28886
+ .ToLocalChecked();
28887
+ CompileRun("set.delete(1);");
28888
+ bool is_key;
28889
+ v8::Local<v8::Array> entries =
28890
+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28891
+ CHECK(!is_key);
28892
+ CHECK_EQ(2, entries->Length());
28893
+ CHECK_EQ(2, entries->Get(context, 0)
28894
+ .ToLocalChecked()
28895
+ ->Int32Value(context)
28896
+ .FromJust());
28897
+ CHECK_EQ(3, entries->Get(context, 1)
28898
+ .ToLocalChecked()
28899
+ ->Int32Value(context)
28900
+ .FromJust());
28901
+ }
28902
+ {
28903
+ // Create set, create iterator, delete entry, iterate, preview.
28904
+ v8::Local<v8::Object> iterator =
28905
+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
28906
+ ->ToObject(context)
28907
+ .ToLocalChecked();
28908
+ CompileRun("set.delete(1); it.next();");
28909
+ bool is_key;
28910
+ v8::Local<v8::Array> entries =
28911
+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28912
+ CHECK(!is_key);
28913
+ CHECK_EQ(1, entries->Length());
28914
+ CHECK_EQ(3, entries->Get(context, 0)
28915
+ .ToLocalChecked()
28916
+ ->Int32Value(context)
28917
+ .FromJust());
28918
+ }
28919
+ {
28920
+ // Create set, create iterator, delete entry, iterate until empty, preview.
28921
+ v8::Local<v8::Object> iterator =
28922
+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
28923
+ ->ToObject(context)
28924
+ .ToLocalChecked();
28925
+ CompileRun("set.delete(1); it.next(); it.next();");
28926
+ bool is_key;
28927
+ v8::Local<v8::Array> entries =
28928
+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28929
+ CHECK(!is_key);
28930
+ CHECK_EQ(0, entries->Length());
28931
+ }
28932
+ {
28933
+ // Create set, create iterator, delete entry, iterate, trigger rehash,
28934
+ // preview.
28935
+ v8::Local<v8::Object> iterator =
28936
+ CompileRun("var set = new Set([1,2,3]); var it = set.keys(); it")
28937
+ ->ToObject(context)
28938
+ .ToLocalChecked();
28939
+ CompileRun("set.delete(1); it.next();");
28940
+ CompileRun("for (var i = 4; i < 20; i++) set.add(i);");
28941
+ bool is_key;
28942
+ v8::Local<v8::Array> entries =
28943
+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28944
+ CHECK(!is_key);
28945
+ CHECK_EQ(17, entries->Length());
28946
+ for (uint32_t i = 0; i < 17; i++) {
28947
+ CHECK_EQ(i + 3, entries->Get(context, i)
28948
+ .ToLocalChecked()
28949
+ ->Int32Value(context)
28950
+ .FromJust());
28951
+ }
28952
+ }
28953
+ }
28954
+
28955
+ TEST(PreviewMapIteratorEntriesWithDeleted) {
28956
+ LocalContext env;
28957
+ v8::HandleScope handle_scope(env->GetIsolate());
28958
+ v8::Local<v8::Context> context = env.local();
28959
+
28960
+ {
28961
+ // Create map, delete entry, create iterator, preview.
28962
+ v8::Local<v8::Object> iterator = CompileRun(
28963
+ "var map = new Map();"
28964
+ "var key = {}; map.set(key, 1);"
28965
+ "map.set({}, 2); map.set({}, 3);"
28966
+ "map.delete(key);"
28967
+ "map.values()")
28968
+ ->ToObject(context)
28969
+ .ToLocalChecked();
28970
+ bool is_key;
28971
+ v8::Local<v8::Array> entries =
28972
+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28973
+ CHECK(!is_key);
28974
+ CHECK_EQ(2, entries->Length());
28975
+ CHECK_EQ(2, entries->Get(context, 0)
28976
+ .ToLocalChecked()
28977
+ ->Int32Value(context)
28978
+ .FromJust());
28979
+ CHECK_EQ(3, entries->Get(context, 1)
28980
+ .ToLocalChecked()
28981
+ ->Int32Value(context)
28982
+ .FromJust());
28983
+ }
28984
+ {
28985
+ // Create map, create iterator, delete entry, preview.
28986
+ v8::Local<v8::Object> iterator = CompileRun(
28987
+ "var map = new Map();"
28988
+ "var key = {}; map.set(key, 1);"
28989
+ "map.set({}, 2); map.set({}, 3);"
28990
+ "map.values()")
28991
+ ->ToObject(context)
28992
+ .ToLocalChecked();
28993
+ CompileRun("map.delete(key);");
28994
+ bool is_key;
28995
+ v8::Local<v8::Array> entries =
28996
+ iterator->PreviewEntries(&is_key).ToLocalChecked();
28997
+ CHECK(!is_key);
28998
+ CHECK_EQ(2, entries->Length());
28999
+ CHECK_EQ(2, entries->Get(context, 0)
29000
+ .ToLocalChecked()
29001
+ ->Int32Value(context)
29002
+ .FromJust());
29003
+ CHECK_EQ(3, entries->Get(context, 1)
29004
+ .ToLocalChecked()
29005
+ ->Int32Value(context)
29006
+ .FromJust());
29007
+ }
29008
+ {
29009
+ // Create map, create iterator, delete entry, iterate, preview.
29010
+ v8::Local<v8::Object> iterator = CompileRun(
29011
+ "var map = new Map();"
29012
+ "var key = {}; map.set(key, 1);"
29013
+ "map.set({}, 2); map.set({}, 3);"
29014
+ "var it = map.values(); it")
29015
+ ->ToObject(context)
29016
+ .ToLocalChecked();
29017
+ CompileRun("map.delete(key); it.next();");
29018
+ bool is_key;
29019
+ v8::Local<v8::Array> entries =
29020
+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29021
+ CHECK(!is_key);
29022
+ CHECK_EQ(1, entries->Length());
29023
+ CHECK_EQ(3, entries->Get(context, 0)
29024
+ .ToLocalChecked()
29025
+ ->Int32Value(context)
29026
+ .FromJust());
29027
+ }
29028
+ {
29029
+ // Create map, create iterator, delete entry, iterate until empty, preview.
29030
+ v8::Local<v8::Object> iterator = CompileRun(
29031
+ "var map = new Map();"
29032
+ "var key = {}; map.set(key, 1);"
29033
+ "map.set({}, 2); map.set({}, 3);"
29034
+ "var it = map.values(); it")
29035
+ ->ToObject(context)
29036
+ .ToLocalChecked();
29037
+ CompileRun("map.delete(key); it.next(); it.next();");
29038
+ bool is_key;
29039
+ v8::Local<v8::Array> entries =
29040
+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29041
+ CHECK(!is_key);
29042
+ CHECK_EQ(0, entries->Length());
29043
+ }
29044
+ {
29045
+ // Create map, create iterator, delete entry, iterate, trigger rehash,
29046
+ // preview.
29047
+ v8::Local<v8::Object> iterator = CompileRun(
29048
+ "var map = new Map();"
29049
+ "var key = {}; map.set(key, 1);"
29050
+ "map.set({}, 2); map.set({}, 3);"
29051
+ "var it = map.values(); it")
29052
+ ->ToObject(context)
29053
+ .ToLocalChecked();
29054
+ CompileRun("map.delete(key); it.next();");
29055
+ CompileRun("for (var i = 4; i < 20; i++) map.set({}, i);");
29056
+ bool is_key;
29057
+ v8::Local<v8::Array> entries =
29058
+ iterator->PreviewEntries(&is_key).ToLocalChecked();
29059
+ CHECK(!is_key);
29060
+ CHECK_EQ(17, entries->Length());
29061
+ for (uint32_t i = 0; i < 17; i++) {
29062
+ CHECK_EQ(i + 3, entries->Get(context, i)
29063
+ .ToLocalChecked()
29064
+ ->Int32Value(context)
29065
+ .FromJust());
29066
+ }
29067
+ }
29068
+ }
0 commit comments