Source code
Revision control
Copy as Markdown
Other Tools
// Count constructor calls
var cnt = 0;
class Base { constructor() { ++cnt; } }
// Force |JSFunction->hasScript()|
new Base();
assertEq(cnt, 1);
// Calling a ClassConstructor must throw
(function() {
function f() { Base(); }
try { f() } catch (e) {}
try { f() } catch (e) {}
assertEq(cnt, 1);
})();
// Spread-calling a ClassConstructor must throw
(function() {
function f() { Base(...[]); }
try { f() } catch (e) {}
try { f() } catch (e) {}
assertEq(cnt, 1);
})();
// Function.prototype.call must throw on ClassConstructor
(function() {
function f() { Base.call(null); }
try { f() } catch (e) {}
try { f() } catch (e) {}
assertEq(cnt, 1);
})();
// Function.prototype.apply must throw on ClassConstructor
(function() {
function f() { Base.apply(null, []); }
try { f() } catch (e) {}
try { f() } catch (e) {}
assertEq(cnt, 1);
})();
// Getter must throw if it is a ClassConstructor
(function() {
var o = {};
Object.defineProperty(o, "prop", { get: Base });
function f() { o.prop };
try { f() } catch (e) {}
try { f() } catch (e) {}
assertEq(cnt, 1);
})();
// Setter must throw if it is a ClassConstructor
(function() {
var o = {};
Object.defineProperty(o, "prop", { set: Base });
function f() { o.prop = 1 };
try { f() } catch (e) {}
try { f() } catch (e) {}
assertEq(cnt, 1);
})();
// Proxy apply must throw if it is a ClassConstructor
(function() {
var o = new Proxy(function() { }, { apply: Base });
function f() { o() };
try { f() } catch (e) {}
try { f() } catch (e) {}
assertEq(cnt, 1);
})();
// Proxy get must throw if it is a ClassConstructor
(function() {
var o = new Proxy({}, { get: Base });
function f() { o.x }
try { f() } catch (e) {}
try { f() } catch (e) {}
assertEq(cnt, 1);
})();