F = class extends Function { } N = class extends null { } function test(i) { let f = new F("x", "return x + " + i + ";"); let C = new F("x", "this.x = x; this.i = " + i); if (!(f instanceof Function && f instanceof F)) throw "bad chain"; if (f(1) !== i+1) throw "function was not called correctly"; let o = new C("hello"); if (o.x !== "hello" || o.i !== i) throw "function as constructor was not correct"; let g = new F("x", "y", "return this.foo + x + y"); if (g.call({foo:1}, 1, 1) !== 3) throw "function was not .callable"; let g2 = g.bind({foo:1}, 1); if (!(g2 instanceof F)) throw "the binding of a subclass should inherit from the bound function's class"; if (g2(1) !== 3) throw "binding didn't work"; let bound = C.bind(null) if (bound.__proto__ !== C.__proto__) throw "binding with null as prototype didn't work"; } noInline(test); for (i = 0; i < 10000; i++) test(i);