blob: 1f1067fa124229576ec7de927fb8408c130fc14e [file] [log] [blame]
// Copyright (C) 2015 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 12.9.3
description: >
"prototype" property is retrieved when left-hand side expression in `instanceof` is object.
info: |
12.9.3 Runtime Semantics: Evaluation
RelationalExpression : RelationalExpression instanceof ShiftExpression
...
7. Return InstanceofOperator(lval, rval).
12.9.4 Runtime Semantics: InstanceofOperator(O, C)
...
6. Return OrdinaryHasInstance(C, O).
7.3.19 OrdinaryHasInstance
...
3. If Type(O) is not Object, return false.
4. Let P be Get(C, "prototype").
5. ReturnIfAbrupt(P).
6. If Type(P) is not Object, throw a TypeError exception.
7. Repeat
a. Let O be O.[[GetPrototypeOf]]().
b. ReturnIfAbrupt(O).
c. If O is null, return false.
d. If SameValue(P, O) is true, return true.
...
---*/
var getterCalled = false;
// The "prototype" property for constructor functions is a non-configurable data-property,
// therefore we need to use a non-constructor function to install the getter.
Object.defineProperty(Function.prototype, "prototype", {
get: function() {
assert.sameValue(getterCalled, false, "'prototype' getter called once");
getterCalled = true;
return Array.prototype;
}
});
var result = [] instanceof Function.prototype;
assert(result, "[] should be instance of Function.prototype");
assert(getterCalled, "'prototype' getter called");