@@ -175,3 +175,205 @@ try {
175
175
assert ( e . message === "foo" ) ;
176
176
assert ( e instanceof ReferenceError ) ;
177
177
}
178
+
179
+ /* ES v5.1 15.4.4.12.1.
180
+ Checking behavior when the function's this_argument is undefined */
181
+ try {
182
+ Array . prototype . splice . call ( undefined ) ;
183
+ assert ( false ) ;
184
+ } catch ( e ) {
185
+ assert ( e instanceof TypeError ) ;
186
+ }
187
+
188
+ /* ES v5.1 15.4.4.12.4.
189
+ Checking behavior when length is an object, which throws error */
190
+ try {
191
+ var o = { } ;
192
+ Object . defineProperty ( o , 'toString' , { 'get' : function ( ) { throw new ReferenceError ( "foo" ) ; } } ) ;
193
+ var a = { length : o } ;
194
+ Array . prototype . splice . call ( a ) ;
195
+ assert ( false ) ;
196
+ } catch ( e ) {
197
+ assert ( e instanceof ReferenceError ) ;
198
+ assert ( e . message == "foo" ) ;
199
+ }
200
+
201
+ /* ES v5.1 15.4.4.12.5.
202
+ Checking behavior when the first argument of the function is an object, which throws error */
203
+ try {
204
+ var o = { } ;
205
+ Object . defineProperty ( o , 'toString' , { 'get' : function ( ) { throw new ReferenceError ( "1" ) ; } } ) ;
206
+ [ 1 , 2 ] . splice ( o ) ;
207
+ assert ( false ) ;
208
+ } catch ( e ) {
209
+ assert ( e instanceof ReferenceError ) ;
210
+ assert ( e . message == "1" ) ;
211
+ }
212
+
213
+ /* ES v5.1 15.4.4.12.7.
214
+ Checking behavior when the second argument of the function is an object, which throws error */
215
+ try {
216
+ var o = { } ;
217
+ Object . defineProperty ( o , 'toString' , { 'get' : function ( ) { throw new ReferenceError ( "2" ) ; } } ) ;
218
+ [ 1 , 2 ] . splice ( 1 , o ) ;
219
+ assert ( false ) ;
220
+ } catch ( e ) {
221
+ assert ( e instanceof ReferenceError ) ;
222
+ assert ( e . message == "2" ) ;
223
+ }
224
+
225
+ /* ES v5.1 15.4.4.12.9.b
226
+ Checking behavior when the first element throws error */
227
+ try {
228
+ var a = [ 1 , 5 , 6 , 7 , 8 , 5 ] ;
229
+ Object . defineProperty ( a , '0' , { 'get' : function ( ) { throw new ReferenceError ( "foo0" ) ; } } ) ;
230
+ Array . prototype . splice . call ( a , 0 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 ) ;
231
+ assert ( false ) ;
232
+ } catch ( e ) {
233
+ assert ( e instanceof ReferenceError ) ;
234
+ assert ( e . message == "foo0" ) ;
235
+ }
236
+
237
+ /* ES v5.1 15.4.4.12.12.b.iii.
238
+ Checking behavior when an element of the array throws error */
239
+ try {
240
+ f = function ( ) { throw new TypeError ( "4" ) ; } ;
241
+ obj = { get : f , valueOf : f , toString : f } ;
242
+ arr = [ 1 , 2 , obj , 4 , 5 ] ;
243
+ Object . defineProperty ( arr , '4' , { 'get' : f } ) ;
244
+ arr . splice ( 1 , 3 , obj ) ;
245
+ assert ( false ) ;
246
+ } catch ( e ) {
247
+ assert ( e instanceof TypeError ) ;
248
+ assert ( e . message == "4" ) ;
249
+ }
250
+
251
+ /* ES v5.1 15.4.4.12 12.b.iv.
252
+ Checking behavior when a modified object is an element of the array */
253
+ try {
254
+ f = function ( ) {
255
+ delete arr [ 3 ] ;
256
+ arr . length = 13 ;
257
+ Object . defineProperty ( arr , '5' , function ( ) { } ) ;
258
+ } ;
259
+ obj = { get : f , valueOf : f , toString : f } ;
260
+ arr = [ 1 , 2 , obj , 4 , 5 ] ;
261
+ Object . defineProperty ( arr , '2' , { 'get' : f } ) ;
262
+ for ( var i = 0 ; i < arr . length ; i ++ ) {
263
+ var a = arr [ i ] ;
264
+ }
265
+ arr . splice ( 1 , 4 , obj ) ;
266
+ assert ( false ) ;
267
+ } catch ( e ) {
268
+ assert ( e instanceof TypeError ) ;
269
+ }
270
+
271
+ /* ES v5.1 15.4.4.12.12.b.v.
272
+ Checking behavior when elements are getting deleted by an element which only has a get function */
273
+ try {
274
+ f = function ( ) {
275
+ for ( var i = 0 ; i < arr . length ; i ++ ) {
276
+ delete arr [ i ] ;
277
+ }
278
+ } ;
279
+ arr = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ] ;
280
+ delete arr [ 2 ] ;
281
+ Object . defineProperty ( arr , '2' , { 'get' : f } ) ;
282
+ arr . splice ( 1 , 7 , 5 ) ;
283
+ } catch ( e ) {
284
+ assert ( e instanceof TypeError ) ;
285
+ }
286
+
287
+ /* ES v5.1 15.4.4.12.12.d.i.
288
+ Checking behavior when a modified object is an element of the array and deletes the elements */
289
+ try {
290
+ f = function ( ) {
291
+ for ( var i = 0 ; i < arr . length ; i ++ ) {
292
+ delete arr [ i ] ;
293
+ }
294
+ } ;
295
+ obj = { get : f , valueOf : f , toString : f } ;
296
+ arr = [ 1 , 2 , obj , 4 , 5 ] ;
297
+ for ( var i = 0 ; i < 6 ; i ++ )
298
+ {
299
+ Object . defineProperty ( arr , i , { 'get' : f } ) ;
300
+ }
301
+ arr . splice ( 1 , 3 , obj ) ;
302
+ assert ( false ) ;
303
+ } catch ( e ) {
304
+ assert ( e instanceof TypeError ) ;
305
+ }
306
+
307
+ /* ES v5.1 15.4.4.12.13.b.iii.
308
+ Checking behavior when a yet non existing element will throw an error */
309
+ try {
310
+ f = function ( ) { throw new TypeError ( "6" ) ; } ;
311
+ arr = [ 1 , 2 , 4 , 5 ] ;
312
+ Object . defineProperty ( arr , '4' , { 'get' : f } ) ;
313
+ arr . splice ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ) ;
314
+ assert ( false ) ;
315
+ } catch ( e ) {
316
+ assert ( e instanceof TypeError ) ;
317
+ assert ( e . message == "6" ) ;
318
+ }
319
+
320
+ /* ES v5.1 15.4.4.12.13.b.iv.2.
321
+ Checking behavior when the last element gets deleted */
322
+ try {
323
+ f = function ( ) { delete arr [ 23 ] ; } ;
324
+ arr = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 ] ;
325
+ delete arr [ 23 ] ;
326
+ Object . defineProperty ( arr , '23' , { 'get' : f } ) ;
327
+ arr . splice ( 1 , 7 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 ) ;
328
+ assert ( false ) ;
329
+ } catch ( e ) {
330
+ assert ( e instanceof TypeError ) ;
331
+ }
332
+
333
+ /* ES v5.1 15.4.4.12.13.b.v.1.
334
+ Checking behavior when the last element throws error */
335
+ try {
336
+ f = function ( ) {
337
+ for ( var i = 0 ; i < arr . length ; i ++ )
338
+ {
339
+ delete arr [ i ] ;
340
+ }
341
+ } ;
342
+ arr = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 ] ;
343
+ delete arr [ 23 ] ;
344
+ Object . defineProperty ( arr , '23' , { 'get' : f } ) ;
345
+ arr . splice ( 1 , 7 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 ) ;
346
+ assert ( false ) ;
347
+ } catch ( e ) {
348
+ assert ( e instanceof TypeError ) ;
349
+ }
350
+
351
+ /* ES v5.1 15.4.4.12.15.b.
352
+ Checking behavior when the issue is the same as above, but splice has more arguments */
353
+ try {
354
+ f = function ( ) {
355
+ for ( var i = 0 ; i < arr . length ; i ++ )
356
+ {
357
+ delete arr [ i ] ;
358
+ }
359
+ } ;
360
+ arr = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 ] ;
361
+ delete arr [ 2 ] ;
362
+ Object . defineProperty ( arr , '2' , { 'get' : f } ) ;
363
+ arr . splice ( 1 , 7 , 5 , 5 , 5 , 5 ) ;
364
+ assert ( false ) ;
365
+ } catch ( e ) {
366
+ assert ( e instanceof TypeError ) ;
367
+ }
368
+
369
+ /* ES v5.1 15.4.4.12.16.
370
+ Checking behavior when the array is empty, large, and not writable */
371
+ try {
372
+ arr = [ ] ;
373
+ Object . defineProperty ( arr , 'length' , { value : 999 , writable : false } ) ;
374
+ arr . splice ( 1 , 2 , 4 , 5 ) ;
375
+ assert ( false ) ;
376
+ } catch ( e ) {
377
+ assert ( e instanceof TypeError ) ;
378
+ }
379
+ a
0 commit comments