@@ -28066,3 +28066,217 @@ TEST(BigIntAPI) {
28066
28066
CHECK_EQ(word_count, 2);
28067
28067
}
28068
28068
}
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