diff --git a/compiler/packages/babel-plugin-react-compiler/src/HIR/ObjectShape.ts b/compiler/packages/babel-plugin-react-compiler/src/HIR/ObjectShape.ts index f396ae18b0461..f51768c586b72 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/HIR/ObjectShape.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/HIR/ObjectShape.ts @@ -569,7 +569,7 @@ addObject(BUILTIN_SHAPES, BuiltInMixedReadonlyId, [ 'flatMap', addFunction(BUILTIN_SHAPES, [], { positionalParams: [], - restParam: Effect.Read, + restParam: Effect.ConditionallyMutate, returnType: {kind: 'Object', shapeId: BuiltInArrayId}, calleeEffect: Effect.ConditionallyMutate, returnValueKind: ValueKind.Mutable, @@ -580,7 +580,7 @@ addObject(BUILTIN_SHAPES, BuiltInMixedReadonlyId, [ 'filter', addFunction(BUILTIN_SHAPES, [], { positionalParams: [], - restParam: Effect.Read, + restParam: Effect.ConditionallyMutate, returnType: {kind: 'Object', shapeId: BuiltInArrayId}, calleeEffect: Effect.ConditionallyMutate, returnValueKind: ValueKind.Mutable, diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-invalid-mixedreadonly-map-shape.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-invalid-mixedreadonly-map-shape.expect.md deleted file mode 100644 index 1418062c33458..0000000000000 --- a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-invalid-mixedreadonly-map-shape.expect.md +++ /dev/null @@ -1,163 +0,0 @@ - -## Input - -```javascript -import { - arrayPush, - identity, - makeArray, - Stringify, - useFragment, -} from 'shared-runtime'; - -/** - * Bug repro showing why it's invalid for function references to be annotated - * with a `Read` effect when that reference might lead to the function being - * invoked. - * - * Note that currently, `Array.map` is annotated to have `Read` effects on its - * operands. This is incorrect as function effects must be replayed when `map` - * is called - * - Read: non-aliasing data dependency - * - Capture: maybe-aliasing data dependency - * - ConditionallyMutate: maybe-aliasing data dependency; maybe-write / invoke - * but only if the value is mutable - * - * Invalid evaluator result: Found differences in evaluator results Non-forget - * (expected): (kind: ok) - *
{"x":[2,2,2],"count":3}
{"item":1}
- *
{"x":[2,2,2],"count":4}
{"item":1}
- * Forget: - * (kind: ok) - *
{"x":[2,2,2],"count":3}
{"item":1}
- *
{"x":[2,2,2,2,2,2],"count":4}
{"item":1}
- */ - -function Component({extraJsx}) { - const x = makeArray(); - const items = useFragment(); - const jsx = items.a.map((item, i) => { - arrayPush(x, 2); - return ; - }); - const offset = jsx.length; - for (let i = 0; i < extraJsx; i++) { - jsx.push(); - } - const count = jsx.length; - identity(count); - return ( - <> - - {jsx[0]} - - ); -} -export const FIXTURE_ENTRYPOINT = { - fn: Component, - params: [{extraJsx: 0}], - sequentialRenders: [{extraJsx: 0}, {extraJsx: 1}], -}; - -``` - -## Code - -```javascript -import { c as _c } from "react/compiler-runtime"; -import { - arrayPush, - identity, - makeArray, - Stringify, - useFragment, -} from "shared-runtime"; - -/** - * Bug repro showing why it's invalid for function references to be annotated - * with a `Read` effect when that reference might lead to the function being - * invoked. - * - * Note that currently, `Array.map` is annotated to have `Read` effects on its - * operands. This is incorrect as function effects must be replayed when `map` - * is called - * - Read: non-aliasing data dependency - * - Capture: maybe-aliasing data dependency - * - ConditionallyMutate: maybe-aliasing data dependency; maybe-write / invoke - * but only if the value is mutable - * - * Invalid evaluator result: Found differences in evaluator results Non-forget - * (expected): (kind: ok) - *
{"x":[2,2,2],"count":3}
{"item":1}
- *
{"x":[2,2,2],"count":4}
{"item":1}
- * Forget: - * (kind: ok) - *
{"x":[2,2,2],"count":3}
{"item":1}
- *
{"x":[2,2,2,2,2,2],"count":4}
{"item":1}
- */ - -function Component(t0) { - const $ = _c(9); - const { extraJsx } = t0; - let t1; - if ($[0] === Symbol.for("react.memo_cache_sentinel")) { - t1 = makeArray(); - $[0] = t1; - } else { - t1 = $[0]; - } - const x = t1; - const items = useFragment(); - let jsx; - if ($[1] !== extraJsx || $[2] !== items.a) { - jsx = items.a.map((item, i) => { - arrayPush(x, 2); - return ; - }); - const offset = jsx.length; - for (let i_0 = 0; i_0 < extraJsx; i_0++) { - jsx.push(); - } - $[1] = extraJsx; - $[2] = items.a; - $[3] = jsx; - } else { - jsx = $[3]; - } - - const count = jsx.length; - identity(count); - let t2; - if ($[4] !== count) { - t2 = ; - $[4] = count; - $[5] = t2; - } else { - t2 = $[5]; - } - const t3 = jsx[0]; - let t4; - if ($[6] !== t2 || $[7] !== t3) { - t4 = ( - <> - {t2} - {t3} - - ); - $[6] = t2; - $[7] = t3; - $[8] = t4; - } else { - t4 = $[8]; - } - return t4; -} - -export const FIXTURE_ENTRYPOINT = { - fn: Component, - params: [{ extraJsx: 0 }], - sequentialRenders: [{ extraJsx: 0 }, { extraJsx: 1 }], -}; - -``` - \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-invalid-mixedreadonly-map-shape.js b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-invalid-mixedreadonly-map-shape.js deleted file mode 100644 index d038cf6cd38a1..0000000000000 --- a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-invalid-mixedreadonly-map-shape.js +++ /dev/null @@ -1,56 +0,0 @@ -import { - arrayPush, - identity, - makeArray, - Stringify, - useFragment, -} from 'shared-runtime'; - -/** - * Bug repro showing why it's invalid for function references to be annotated - * with a `Read` effect when that reference might lead to the function being - * invoked. - * - * Note that currently, `Array.map` is annotated to have `Read` effects on its - * operands. This is incorrect as function effects must be replayed when `map` - * is called - * - Read: non-aliasing data dependency - * - Capture: maybe-aliasing data dependency - * - ConditionallyMutate: maybe-aliasing data dependency; maybe-write / invoke - * but only if the value is mutable - * - * Invalid evaluator result: Found differences in evaluator results Non-forget - * (expected): (kind: ok) - *
{"x":[2,2,2],"count":3}
{"item":1}
- *
{"x":[2,2,2],"count":4}
{"item":1}
- * Forget: - * (kind: ok) - *
{"x":[2,2,2],"count":3}
{"item":1}
- *
{"x":[2,2,2,2,2,2],"count":4}
{"item":1}
- */ - -function Component({extraJsx}) { - const x = makeArray(); - const items = useFragment(); - const jsx = items.a.map((item, i) => { - arrayPush(x, 2); - return ; - }); - const offset = jsx.length; - for (let i = 0; i < extraJsx; i++) { - jsx.push(); - } - const count = jsx.length; - identity(count); - return ( - <> - - {jsx[0]} - - ); -} -export const FIXTURE_ENTRYPOINT = { - fn: Component, - params: [{extraJsx: 0}], - sequentialRenders: [{extraJsx: 0}, {extraJsx: 1}], -};