mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-30 11:13:51 +01:00 
			
		
		
		
	sourceRevisionAtLastExport: 33f2fb0e53d135f0ee17cfccd9d993eb2a6f47de targetRevisionAtLastExport: 31340cbd9add103f586d501b0c3354b7b182abc0
		
			
				
	
	
		
			119 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Copyright 2018 the V8 project authors. All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style license that can be
 | |
| // found in the LICENSE file.
 | |
| 
 | |
| // Flags: --allow-natives-syntax
 | |
| 
 | |
| // Ensure `Array.prototype.fill` functions correctly for numerous elements
 | |
| // kinds.
 | |
| 
 | |
| // If no arguments are provided, call Array.p.fill without any arguments,
 | |
| // otherwise the test is allowed to specify what value to use to better control
 | |
| // ElementsKind transitions. From and to is provided by the harness.
 | |
| function callAndAssertFill(object, test_value, harness_value, from, to) {
 | |
|   let value = arguments.length > 2 ? test_value : harness_value;
 | |
| 
 | |
|   Array.prototype.fill.call(object, value, from, to);
 | |
| 
 | |
|   %HeapObjectVerify(object);
 | |
|   assertArrayHasValueInRange(object, value, from, to);
 | |
| }
 | |
| 
 | |
| function assertArrayHasValueInRange(obj, value, from, to) {
 | |
|   for (let i = from; i < to; ++i) {
 | |
|     assertEquals(value, obj[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Tests are executed multiple times. Creating arrays using literal notation
 | |
| // will create COW-Arrays, which will propagate the most general ElementsKind
 | |
| // back to their allocation site.
 | |
| // pristineArray will always return a 🐄-Array with the ElementsKind we actually
 | |
| // want.
 | |
| let i = 0;
 | |
| function pristineArray(str) {
 | |
|   return eval(str + "//" + (i++));
 | |
| }
 | |
| 
 | |
| let tests = {
 | |
|   ARRAY_PACKED_ELEMENTS(value, from, to) {
 | |
|     let array = pristineArray(
 | |
|         `["Some string", {}, /foobar/, "Another string", {}]`);
 | |
|     assertTrue(%HasObjectElements(array));
 | |
|     assertFalse(%HasHoleyElements(array));
 | |
| 
 | |
|     callAndAssertFill(array, "42", ...arguments);
 | |
|   },
 | |
| 
 | |
|   ARRAY_HOLEY_ELEMENTS(value, from, to) {
 | |
|     let array = pristineArray(`["Some string", , {}, , "Another string"]`);
 | |
|     assertTrue(%HasObjectElements(array));
 | |
|     assertTrue(%HasHoleyElements(array));
 | |
| 
 | |
|     callAndAssertFill(array, "42", ...arguments);
 | |
|   },
 | |
| 
 | |
|   ARRAY_PACKED_SMI_ELEMENTS(value, from, to) {
 | |
|     let array = pristineArray(`[0, -42, 5555, 23, 6]`);
 | |
|     assertTrue(%HasSmiElements(array));
 | |
|     assertFalse(%HasHoleyElements(array));
 | |
| 
 | |
|     callAndAssertFill(array, 42, ...arguments);
 | |
|   },
 | |
| 
 | |
|   ARRAY_HOLEY_SMI_ELEMENTS(value, from, to) {
 | |
|     let array = pristineArray(`[0, , 5555, , 6]`);
 | |
|     assertTrue(%HasSmiElements(array));
 | |
|     assertTrue(%HasHoleyElements(array));
 | |
| 
 | |
|     callAndAssertFill(array, 42, ...arguments);
 | |
|   },
 | |
| 
 | |
|   ARRAY_PACKED_DOUBLE_ELEMENTS(value, from, to) {
 | |
|     let array = pristineArray(`[3.14, 7.00001, NaN, -25.3333, 1.0]`);
 | |
|     assertTrue(%HasDoubleElements(array));
 | |
|     assertFalse(%HasHoleyElements(array));
 | |
| 
 | |
|     callAndAssertFill(array, 42.42, ...arguments);
 | |
|   },
 | |
| 
 | |
|   ARRAY_HOLEY_DOUBLE_ELEMENTS(value, from, to) {
 | |
|     let array = pristineArray(`[3.14, , , , 1.0]`);
 | |
|     assertTrue(%HasDoubleElements(array));
 | |
|     assertTrue(%HasHoleyElements(array));
 | |
| 
 | |
|     callAndAssertFill(array, 42.42, ...arguments);
 | |
|   },
 | |
| 
 | |
|   ARRAY_DICTIONARY_ELEMENTS(value, from, to) {
 | |
|     let array = pristineArray(`[0, , 2, 3, 4]`);
 | |
|     Object.defineProperty(array, 1, { get() { return this.foo; },
 | |
|                                       set(val) { this.foo = val; }});
 | |
|     assertTrue(%HasDictionaryElements(array));
 | |
| 
 | |
|     callAndAssertFill(array, "42", ...arguments);
 | |
|   }
 | |
| 
 | |
|   // TODO(szuend): Add additional tests receivers other than arrays
 | |
|   //               (Objects, TypedArrays, etc.).
 | |
| };
 | |
| 
 | |
| function RunTest(test) {
 | |
|   test();
 | |
|   test(undefined);
 | |
|   test(undefined, 1);
 | |
|   test(undefined, 1, 4);
 | |
| }
 | |
| 
 | |
| function RunTests(tests) {
 | |
|   Object.keys(tests).forEach(test => RunTest(tests[test]));
 | |
| }
 | |
| 
 | |
| RunTests(tests);
 | |
| 
 | |
| Array.prototype.__proto__ = {
 | |
|   __proto__: Array.prototype.__proto__
 | |
| };
 | |
| 
 | |
| RunTests(tests);
 |