mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-31 03:34:08 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Copyright (C) 2022 Chengzhong Wu. All rights reserved.
 | |
| // This code is governed by the BSD license found in the LICENSE file.
 | |
| /*---
 | |
| esid: sec-wrappedfunctioncreate
 | |
| description: >
 | |
|   The value of WrappedFunction.name is copied from the target function
 | |
| info: |
 | |
|   WrappedFunctionCreate ( callerRealm: a Realm Record, Target: a function object, )
 | |
| 
 | |
|   ...
 | |
|   7. Let result be CopyNameAndLength(wrapped, Target).
 | |
|   ...
 | |
| 
 | |
|   CopyNameAndLength ( F: a function object, Target: a function object, prefix: a String, optional argCount: a Number, )
 | |
| 
 | |
|   ...
 | |
|   6. Let targetName be ? Get(Target, "name").
 | |
|   7. If Type(targetName) is not String, set targetName to the empty String.
 | |
|   8. Perform ! SetFunctionName(F, targetName, prefix).
 | |
| 
 | |
|   SetFunctionName ( F, name [ , prefix ] )
 | |
| 
 | |
|   ...
 | |
|   6. Return ! DefinePropertyOrThrow(F, "name", PropertyDescriptor { [[Value]]: name, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }).
 | |
| 
 | |
| includes: [propertyHelper.js]
 | |
| features: [ShadowRealm]
 | |
| ---*/
 | |
| 
 | |
| assert.sameValue(
 | |
|   typeof ShadowRealm.prototype.evaluate,
 | |
|   'function',
 | |
|   'This test must fail if ShadowRealm.prototype.evaluate is not a function'
 | |
| );
 | |
| 
 | |
| const r = new ShadowRealm();
 | |
| 
 | |
| let wrapped = r.evaluate(`
 | |
| function fn() {}
 | |
| fn;
 | |
| `);
 | |
| verifyProperty(wrapped, "name", {
 | |
|   value: "fn",
 | |
|   enumerable: false,
 | |
|   writable: false,
 | |
|   configurable: true,
 | |
| });
 | |
| 
 | |
| // The name property is an accessor.
 | |
| wrapped = r.evaluate(`
 | |
| function fn() {}
 | |
| Object.defineProperty(fn, 'name', {
 | |
|   get: () => "bar",
 | |
|   enumerable: false,
 | |
|   configurable: true,
 | |
| });
 | |
| fn;
 | |
| `);
 | |
| verifyProperty(wrapped, "name", {
 | |
|   value: "bar",
 | |
|   enumerable: false,
 | |
|   writable: false,
 | |
|   configurable: true,
 | |
| });
 | |
| 
 | |
| // The value of fn.name is not a string.
 | |
| for (const name of [null, undefined, 0, '1n', false, NaN, Infinity, 'Symbol()', '[]', '{}']) {
 | |
|   wrapped = r.evaluate(`
 | |
| function fn() {}
 | |
| Object.defineProperty(fn, 'name', {
 | |
|   value: ${String(name)},
 | |
|   enumerable: false,
 | |
|   configurable: true,
 | |
| });
 | |
| fn;
 | |
| `);
 | |
|   verifyProperty(wrapped, "name", {
 | |
|     value: "",
 | |
|     enumerable: false,
 | |
|     writable: false,
 | |
|     configurable: true,
 | |
|   });
 | |
| }
 |