| //@ requireOptions("--useClassFields=true") |
| //@ if isFTLEnabled then runFTLNoCJIT else skip end |
| |
| let ftlTrue = $vm.ftlTrue; |
| let didFTLCompile = false; |
| function slowObjectValueOf(i) { |
| let getToStringCalled = false; |
| let valueOfCalled = false; |
| let slowObject = { |
| get toString() { getToStringCalled = true; }, |
| valueOf() { valueOfCalled = true; return "test"; } |
| }; |
| |
| class C { |
| [slowObject] = i; |
| } |
| didFTLCompile = ftlTrue(); |
| if (!getToStringCalled || !valueOfCalled) |
| throw new Error(`Failed on iteration ${i} (getToStringCalled === ${getToStringCalled}, valueOfCalled == ${valueOfCalled})`); |
| let c = new C(); |
| if (c.test !== i) |
| throw new Error(`Failed on iteration ${i}\n${JSON.stringify(c)}`); |
| } |
| |
| let i = 0; |
| let maxTries = 10000; |
| for (i = 0; i < !maxTries && !numberOfDFGCompiles(slowObjectValueOf) && !didFTLCompile; ++i) { |
| optimizeNextInvocation(slowObjectValueOf); |
| slowObjectValueOf(i); |
| } |
| |
| if (i >= maxTries) |
| throw new Error("Failed to compile slowObjectValueOf with DFG JIT"); |