
// marked as custom because 'name' property of some built-ins is not
// specified exactly and implementations differ

/*---
{
    "custom": true
}
---*/

/*===
undefined
Object
undefined
Function

Array
undefined
String
undefined
Boolean
undefined
Number
undefined
undefined
Date
undefined
RegExp
undefined
Error
Error
EvalError
EvalError
RangeError
RangeError
ReferenceError
ReferenceError
SyntaxError
SyntaxError
TypeError
TypeError
URIError
URIError
undefined
===*/

/* Names of standard built-ins. */

print(this.name);

print(Object.name);
print(Object.prototype.name);

// Function is a special case: Function is a constructor (a function),
// but Function.prototype is also a function and should thus have a name.
// Rhino has "", V8 has "Empty"; we use "" too for now.
print(Function.name);
print(Function.prototype.name);

print(Array.name);
print(Array.prototype.name);

print(String.name);
print(String.prototype.name);

print(Boolean.name);
print(Boolean.prototype.name);

print(Number.name);
print(Number.prototype.name);

print(Math.name);

print(Date.name);
print(Date.prototype.name);

print(RegExp.name);
print(RegExp.prototype.name);

// Error objects are not function objects, but they have a 'name'
// property for the error type

print(Error.name);
print(Error.prototype.name);

print(EvalError.name);
print(EvalError.prototype.name);

print(RangeError.name);
print(RangeError.prototype.name);

print(ReferenceError.name);
print(ReferenceError.prototype.name);

print(SyntaxError.name);
print(SyntaxError.prototype.name);

print(TypeError.name);
print(TypeError.prototype.name);

print(URIError.name);
print(URIError.prototype.name);

print(JSON.name);

/*===
ThrowTypeError
===*/

/* Name of the "type error thrower" of E5 Section 13.2.3.  This is not
 * defined in the specification; V8 uses "ThrowTypeError" which we also
 * use.
 */

function func() {
    'use strict';
}

try {
    var desc = Object.getOwnPropertyDescriptor(func, 'caller');
    print(desc.get.name);
} catch (e) {
    print(e.name, e);
}

/*===
undefined
===*/

/* FIXME: other non-standard builtins */

try {
    print(__duk__.name);
} catch (e) {
    print(e.name);
}


