// 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-evaldeclarationinstantiation
description: >
    Modification of previously-existing non-configurable global property
info: |
    [...]
    15. 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 lexEnv.
        c. If varEnvRec is a global Environment Record, then
           i. Perform ? varEnvRec.CreateGlobalFunctionBinding(fn, fo, true).
    [...]

    8.1.1.4.18 CreateGlobalFunctionBinding

    [...]
    5. If existingProp is undefined or existingProp.[[Configurable]] is true,
       then
       [...]
    6. Else,
       b. Let desc be the PropertyDescriptor{[[Value]]: V }.
    7. Perform ? DefinePropertyOrThrow(globalObject, N, desc).
    [...]
includes: [propertyHelper.js]
---*/

var initial;

Object.defineProperty(this, 'f', {
  enumerable: true,
  writable: true,
  configurable: false
});

(0,eval)('initial = f; function f() { return 2222; }');

verifyEnumerable(this, 'f');
verifyWritable(this, 'f');
verifyNotConfigurable(this, 'f');
assert.sameValue(typeof initial, 'function');
assert.sameValue(initial(), 2222);
