description(
"Tests that check that sloppy getters and setters on the global object don't coerce undefined to their this."
);

var act_e = undefined;
try { 
    this.__proto__;
    var originalProto = this.__proto__;
    this.__proto__ = 1;
    if (this.__proto__ != originalProto) 
        throw "__proto__ was modified";
} catch (e) {
    act_e = e;
}

if (act_e) 
    testFailed("shouldn't have thrown '"+ e + "' when accessing and modifying this.__proto__");
else 
    testPassed("this.__proto__ accessed succesfully and stayed frozen.");

shouldNotThrow("Object.prototype.valueOf.call(3);");
shouldThrow("Object.prototype.valueOf.call(null);");


shouldNotThrow("Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get()");
shouldNotThrow("Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').set(['foo'])");

shouldThrow("(0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get)()", "\"TypeError: undefined is not an object (evaluating '(0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get)()')\"");
shouldThrow("(0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').set)(['foo'])", "\"TypeError: Object.prototype.__proto__ called on null or undefined\"");


var top_level_sloppy_getter = Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get;
shouldThrow("top_level_sloppy_getter();", "\"TypeError: undefined is not an object (evaluating 'top_level_sloppy_getter()')\"");

var top_level_sloppy_setter = Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').set;
shouldThrow("top_level_sloppy_setter(['foo']);", "\"TypeError: Object.prototype.__proto__ called on null or undefined\"");
