@@ -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 | +} |