summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/warp/scalar-replace-rest-construct-array.js
blob: e2c0c5b3540b0df037c8836d540a355305e10d32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Prevent GC from cancelling/discarding Ion compilations.
gczeal(0);

// Create a fresh set of functions for each argument count to avoid type pollution.
function makeTest(count) {
  var args = Array(count).fill(0).join(",");

  return Function(`
    class Base {
      constructor() {
        this.count = arguments.length;
      }
    }
  
    class C extends Base {
      constructor(...args) {
        assertRecoveredOnBailout(args, true);
        return super(...args);
      }
    }

    function test() {
      // Ensure |C| isn't inlined into its caller.
      with ({});

      for (let i = 0; i < 1000; ++i) {
        let obj = new C(${args});
        assertEq(obj.count, ${count});
      }
    }

    return test;
  `)();
}

// Inline rest arguments are limited to 14 elements, cf.
// gc::CanUseFixedElementsForArray() in WarpBuilder::build_Rest().
// There isn't such limit when the function isn't inlined.
const maxRestArgs = 20;

for (let i = 0; i <= maxRestArgs; ++i) {
  makeTest(i)();
}