summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/cacheir/bind-function-specialized.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/cacheir/bind-function-specialized.js')
-rw-r--r--js/src/jit-test/tests/cacheir/bind-function-specialized.js72
1 files changed, 72 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/cacheir/bind-function-specialized.js b/js/src/jit-test/tests/cacheir/bind-function-specialized.js
new file mode 100644
index 0000000000..acac842a7f
--- /dev/null
+++ b/js/src/jit-test/tests/cacheir/bind-function-specialized.js
@@ -0,0 +1,72 @@
+load(libdir + "asserts.js");
+
+function testBasic() {
+ var g = function foo(a, b, c) { return a - b - c; };
+ for (var i = 0; i < 100; i++) {
+ var bound1 = g.bind(null, 1);
+ assertEq(bound1.length, 2);
+ assertEq(bound1.name, "bound foo");
+ var bound2 = bound1.bind(null, 2);
+ assertEq(bound2.length, 1);
+ assertEq(bound2.name, "bound bound foo");
+ assertEq(bound2(9), -10);
+ }
+}
+testBasic();
+
+function testBindNonCtor() {
+ var g = (a, b, c) => a - b - c;
+ for (var i = 0; i < 100; i++) {
+ var bound1 = g.bind(null, 1);
+ var bound2 = bound1.bind(null, 2);
+ assertEq(bound1(2, 3), -4);
+ assertEq(bound2(4), -5);
+ assertThrowsInstanceOf(() => new bound1(2, 3), TypeError);
+ assertThrowsInstanceOf(() => new bound2(4), TypeError);
+ assertEq(bound2.length, 1);
+ assertEq(bound2.name, "bound bound g");
+ }
+}
+testBindNonCtor();
+
+function testBindSelfHosted() {
+ var g = Array.prototype.map;
+ var arr = [1, 2, 3];
+ for (var i = 0; i < 100; i++) {
+ var bound1 = g.bind(arr);
+ var bound2 = bound1.bind(null, x => x + 5);
+ assertEq(bound1(x => x + 3).toString(), "4,5,6");
+ assertEq(bound2().toString(), "6,7,8");
+ assertEq(bound2.length, 0);
+ assertEq(bound2.name, "bound bound map");
+ }
+}
+testBindSelfHosted();
+
+function testBoundDeletedName() {
+ var g = function foo(a, b, c) { return a - b - c; };
+ var bound1 = g.bind(null);
+ var bound2 = g.bind(null);
+ delete bound2.name;
+ for (var i = 0; i < 100; i++) {
+ var obj = i < 50 ? bound1 : bound2;
+ var bound3 = obj.bind(null);
+ assertEq(bound3.length, 3);
+ assertEq(bound3.name, i < 50 ? "bound bound foo" : "bound ");
+ }
+}
+testBoundDeletedName();
+
+function testWeirdProto() {
+ var g = function foo() { return 123; };
+ var proto = {bind: Function.prototype.bind};
+ Object.setPrototypeOf(g, proto);
+ for (var i = 0; i < 100; i++) {
+ var bound1 = g.bind(null);
+ assertEq(Object.getPrototypeOf(bound1), proto);
+ var bound2 = bound1.bind(null);
+ assertEq(Object.getPrototypeOf(bound2), proto);
+ assertEq(bound2(), 123);
+ }
+}
+testWeirdProto();