function testFunctionName(f) { var name = f.name; f.name = 'g'; assertEq(f.name, name); assertEq(delete f.name, true); assertEq(f.name, ''); assertEq(f.hasOwnProperty('name'), false); f.name = 'g'; assertEq(f.name, ''); Object.defineProperty(f, 'name', {value: 'g'}); assertEq(f.name, 'g'); } function testFunctionNameStrict(f) { "use strict"; var name = f.name; var error; try { f.name = 'g'; } catch (e) { error = e; } assertEq(f.name, name); assertEq(error instanceof TypeError, true); assertEq(delete f.name, true); assertEq(f.name, ''); assertEq(f.hasOwnProperty('name'), false); error = null; try { f.name = 'g'; } catch (e) { error = e; } assertEq(f.name, ''); assertEq(error instanceof TypeError, true); Object.defineProperty(f, 'name', {value: 'g'}); assertEq(f.name, 'g'); } assertEq(Object.getOwnPropertyDescriptor(Object, "name").writable, false); assertEq(Object.getOwnPropertyDescriptor(Object, "name").enumerable, false); assertEq(Object.getOwnPropertyDescriptor(Object, "name").configurable, true); assertEq(Object.getOwnPropertyDescriptor(Object, "name").value, 'Object'); assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").writable, false); assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").enumerable, false); assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").configurable, true); assertEq(Object.getOwnPropertyDescriptor(function f(){}, "name").value, 'f'); // Basic test ensuring that Object.defineProperty works on pristine function. function f() {}; Object.defineProperty(f, 'name', {value: 'g'}); assertEq(f.name, 'g'); // .name behaves as expected on scripted function. testFunctionName(function f(){}); testFunctionNameStrict(function f(){}); // .name behaves as expected on builtin function. testFunctionName(Function.prototype.apply); testFunctionNameStrict(Function.prototype.call); // .name behaves as expected on self-hosted builtin function. testFunctionName(Array.prototype.forEach); testFunctionNameStrict(Array.prototype.some); if (typeof reportCompare === "function") reportCompare(0, 0);