diff --git a/src/domain/javascript/javascriptSemanticAnalysis.member_mutations.test.ts b/src/domain/javascript/javascriptSemanticAnalysis.member_mutations.test.ts index 45cb2e09f6..1104d9fa7c 100644 --- a/src/domain/javascript/javascriptSemanticAnalysis.member_mutations.test.ts +++ b/src/domain/javascript/javascriptSemanticAnalysis.member_mutations.test.ts @@ -608,6 +608,57 @@ describe("property mutation collection on minified bundles", () => { ], }); }, 30000); + + it("indexes many returned object methods instead of rescanning the object", () => { + const methods = Array.from( + { length: 2000 }, + (_, index) => `m${index}() { return shared; }`, + ).join(","); + const writes = Array.from( + { length: 2000 }, + (_, index) => `box.m${index}().p${index} = ${index};`, + ).join(" "); + const value = resultValue( + `const shared = { token: "TOKEN" }; const box = { ${methods} }; ${writes} return shared.token;`, + ); + expect(value?.status).toBe("unknown"); + }, 30000); +}); + +describe("results of methods on an escaped receiver", () => { + it("makes every method's distinct result uncertain, not only the called one", () => { + expect( + resultValue( + 'const first = { t: "A" }; const second = { t: "B" }; const kept = { t: "C" }; const box = { a() { return first; }, b() { return second; }, c() { return first; } }; box.a(); return [first.t, second.t, kept.t];', + ), + ).toMatchObject({ + status: "array", + items: [ + { value: { status: "unknown" } }, + { value: { status: "unknown" } }, + { value: { status: "literal", value: "C" } }, + ], + }); + }); + + it("keeps a shared result uncertain across a wide escaped receiver (#1495)", () => { + const count = 2000; + const methods = Array.from( + { length: count }, + (_, index) => `m${index}() { return shared; },`, + ).join(" "); + const calls = Array.from( + { length: count }, + (_, index) => `box.m${index}().p${index} = ${index};`, + ).join(" "); + const value = resultValue( + `const shared = { token: "TOKEN" }; const box = { ${methods} }; ${calls} return [shared.token];`, + ); + expect(value).toMatchObject({ + status: "array", + items: [{ value: { status: "unknown" } }], + }); + }, 30000); }); describe("results of methods on an escaped receiver", () => {