mirror of https://github.com/tc39/test262.git
Merge pull request #455 from anba/instanceof_op
Add tests for instanceof operator when prototype property is primitive or getter
This commit is contained in:
commit
e7f4e4324a
|
@ -0,0 +1,32 @@
|
|||
// 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: >
|
||||
Throws a TypeError if `prototype` property is not an 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.
|
||||
...
|
||||
---*/
|
||||
|
||||
// Check with primitive "prototype" property on non-constructor function.
|
||||
Function.prototype.prototype = "";
|
||||
|
||||
assert.throws(TypeError, function() {
|
||||
[] instanceof Function.prototype;
|
||||
});
|
|
@ -0,0 +1,29 @@
|
|||
// 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: >
|
||||
Does not throw a TypeError if left-hand side expression and `prototype` property are both primitive values.
|
||||
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.
|
||||
...
|
||||
---*/
|
||||
|
||||
// Check with primitive "prototype" property on non-constructor function.
|
||||
Function.prototype.prototype = true;
|
||||
|
||||
var result = 0 instanceof Function.prototype;
|
||||
|
||||
assert.sameValue(result, false);
|
42
test/language/expressions/instanceof/prototype-getter-with-object-throws.js
vendored
Executable file
42
test/language/expressions/instanceof/prototype-getter-with-object-throws.js
vendored
Executable file
|
@ -0,0 +1,42 @@
|
|||
// 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).
|
||||
...
|
||||
---*/
|
||||
|
||||
var getterCalled = false;
|
||||
|
||||
function DummyError() { }
|
||||
|
||||
// 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;
|
||||
throw new DummyError();
|
||||
}
|
||||
});
|
||||
|
||||
assert.throws(DummyError, function() {
|
||||
[] instanceof Function.prototype;
|
||||
});
|
|
@ -0,0 +1,47 @@
|
|||
// 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");
|
|
@ -0,0 +1,34 @@
|
|||
// 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 not retrieved when left-hand side expression in `instanceof` is primitive.
|
||||
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.
|
||||
...
|
||||
---*/
|
||||
|
||||
// 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() {
|
||||
$ERROR("getter for 'prototype' called");
|
||||
}
|
||||
});
|
||||
|
||||
var result = 0 instanceof Function.prototype;
|
||||
|
||||
assert.sameValue(result, false);
|
Loading…
Reference in New Issue