| // Copyright (C) 2016 the V8 project authors. All rights reserved. |
| // This code is governed by the BSD license found in the LICENSE file. |
| /*--- |
| esid: sec-globaldeclarationinstantiation |
| es6id: 15.1.8 |
| description: Declaration of function where permissible |
| info: | |
| [...] |
| 9. Let declaredFunctionNames be a new empty List. |
| 10. For each d in varDeclarations, in reverse list order do |
| a. If d is neither a VariableDeclaration or a ForBinding, then |
| i. Assert: d is either a FunctionDeclaration or a |
| GeneratorDeclaration. |
| ii. NOTE If there are multiple FunctionDeclarations for the same name, |
| the last declaration is used. |
| iii. Let fn be the sole element of the BoundNames of d. |
| iv. If fn is not an element of declaredFunctionNames, then |
| 1. Let fnDefinable be ? envRec.CanDeclareGlobalFunction(fn). |
| 2. If fnDefinable is false, throw a TypeError exception. |
| 3. Append fn to declaredFunctionNames. |
| 4. Insert d as the first element of functionsToInitialize. |
| [...] |
| 17. For each production f in functionsToInitialize, do |
| a. Let fn be the sole element of the BoundNames of f. |
| b. Let fo be the result of performing InstantiateFunctionObject for f |
| with argument env. |
| c. Perform ? envRec.CreateGlobalFunctionBinding(fn, fo, false). |
| [...] |
| |
| 8.1.1.4.16 CanDeclareGlobalFunction |
| |
| 1. Let envRec be the global Environment Record for which the method was |
| invoked. |
| 2. Let ObjRec be envRec.[[ObjectRecord]]. |
| 3. Let globalObject be the binding object for ObjRec. |
| 4. Let existingProp be ? globalObject.[[GetOwnProperty]](N). |
| 5. If existingProp is undefined, return ? IsExtensible(globalObject). |
| includes: [propertyHelper.js] |
| ---*/ |
| |
| $262.evalScript('function brandNew() {}'); |
| |
| assert.sameValue( |
| typeof brandNew, 'function', 'new binding on an extensible global object' |
| ); |
| verifyEnumerable(this, 'brandNew'); |
| verifyWritable(this, 'brandNew'); |
| verifyNotConfigurable(this, 'brandNew'); |
| |
| Object.defineProperty(this, 'configurable', { configurable: true, value: 0 }); |
| Object.defineProperty( |
| this, |
| 'nonConfigurable', |
| { configurable: false, writable: true, enumerable: true, value: 0 } |
| ); |
| |
| // Prevent extensions on the global object to ensure that detail is not |
| // considered by any of the declarations which follow. |
| Object.preventExtensions(this); |
| |
| $262.evalScript('function configurable() {}'); |
| |
| assert.sameValue( |
| typeof configurable, 'function', 'like-named configurable property' |
| ); |
| verifyEnumerable(this, 'configurable') |
| verifyWritable(this, 'configurable'); |
| verifyNotConfigurable(this, 'configurable'); |
| |
| $262.evalScript('function nonConfigurable() {}'); |
| |
| assert.sameValue( |
| typeof nonConfigurable, |
| 'function', |
| 'like-named non-configurable data property that is writable and enumerable' |
| ); |
| verifyEnumerable(this, 'nonConfigurable'); |
| verifyWritable(this, 'nonConfigurable'); |
| verifyNotConfigurable(this, 'nonConfigurable'); |