Skip to content

Commit 5ee4f7e

Browse files
committed
fix[describeClassComponentFrame]: invoke constructor with new keyword (facebook#36455)
For JavaScript runtimes that do not have [`Reflect`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect) supported, we had a fall back that was calling the constructor with overridden `this` context via ``` fn.apply(Fake.prototype); ``` In ES6, it is required to call constructor only with the `new` keyword, otherwise the runtime is expected to throw a corresponding TypeError: ``` TypeError: Class constructor <> cannot be invoked without 'new' ``` We've observed this error in Hermes runtime, but this is applicable to V8 or any other runtime. The only reason why V8 wasn't affected is because it implemented Reflect APIs. Instead of the incorrect call, we will fall back to calling `new fn()`, but with a temporary patched prototype of the class, which would make a trap out of the setter for `props` object. We use the same approach when `Reflect` APIs are available, but instead of modifying the prototype, we pass the fake context: https://github.com/facebook/react/blob/d5736f098edee62c44f27b053e6e48f5fa443803/packages/shared/ReactComponentStackFrame.js#L129-L148 --- See tests implemented. Without the changes, the test would fail with the `TypeError` mentioned above. DiffTrain build for [8fc5763](facebook@8fc5763)
1 parent 9f3e8fb commit 5ee4f7e

21 files changed

Lines changed: 328 additions & 84 deletions

compiled-rn/VERSION_NATIVE_FB

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19.3.0-native-fb-d5736f09-20260507
1+
19.3.0-native-fb-8fc5763b-20260513

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-dev.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<97915a97dda9cb945d4b11bb543e9ad0>>
10+
* @generated SignedSource<<67f3d5f7cbf8ec4519f0649f4947e9e3>>
1111
*/
1212

1313
"use strict";
@@ -410,5 +410,5 @@ __DEV__ &&
410410
exports.useFormStatus = function () {
411411
return resolveDispatcher().useHostTransitionStatus();
412412
};
413-
exports.version = "19.3.0-native-fb-d5736f09-20260507";
413+
exports.version = "19.3.0-native-fb-8fc5763b-20260513";
414414
})();

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-prod.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<0a762e69dc2ae696b02333d8b3b0559f>>
10+
* @generated SignedSource<<7e11f066f95bb5728b53609ef6d7cad7>>
1111
*/
1212

1313
"use strict";
@@ -209,4 +209,4 @@ exports.useFormState = function (action, initialState, permalink) {
209209
exports.useFormStatus = function () {
210210
return ReactSharedInternals.H.useHostTransitionStatus();
211211
};
212-
exports.version = "19.3.0-native-fb-d5736f09-20260507";
212+
exports.version = "19.3.0-native-fb-8fc5763b-20260513";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-profiling.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<0a762e69dc2ae696b02333d8b3b0559f>>
10+
* @generated SignedSource<<7e11f066f95bb5728b53609ef6d7cad7>>
1111
*/
1212

1313
"use strict";
@@ -209,4 +209,4 @@ exports.useFormState = function (action, initialState, permalink) {
209209
exports.useFormStatus = function () {
210210
return ReactSharedInternals.H.useHostTransitionStatus();
211211
};
212-
exports.version = "19.3.0-native-fb-d5736f09-20260507";
212+
exports.version = "19.3.0-native-fb-8fc5763b-20260513";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-dev.js

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<b35fdce0c30db2431561c3f701e3cb76>>
10+
* @generated SignedSource<<d1adf22ec71ad8c6c83e454ceb04b649>>
1111
*/
1212

1313
/*
@@ -719,7 +719,30 @@ __DEV__ &&
719719
} catch (x$0) {
720720
control = x$0;
721721
}
722-
fn.call(Fake.prototype);
722+
Fake = !1;
723+
try {
724+
var prevProps = Object.getOwnPropertyDescriptor(
725+
fn.prototype,
726+
"props"
727+
);
728+
Object.defineProperty(fn.prototype, "props", {
729+
configurable: !0,
730+
set: function () {
731+
throw Error();
732+
}
733+
});
734+
Fake = !0;
735+
new fn();
736+
} finally {
737+
Fake &&
738+
(void 0 !== prevProps
739+
? Object.defineProperty(
740+
fn.prototype,
741+
"props",
742+
prevProps
743+
)
744+
: delete fn.prototype.props);
745+
}
723746
}
724747
} else {
725748
try {
@@ -31927,11 +31950,11 @@ __DEV__ &&
3192731950
};
3192831951
(function () {
3192931952
var isomorphicReactPackageVersion = React.version;
31930-
if ("19.3.0-native-fb-d5736f09-20260507" !== isomorphicReactPackageVersion)
31953+
if ("19.3.0-native-fb-8fc5763b-20260513" !== isomorphicReactPackageVersion)
3193131954
throw Error(
3193231955
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
3193331956
(isomorphicReactPackageVersion +
31934-
"\n - react-dom: 19.3.0-native-fb-d5736f09-20260507\nLearn more: https://react.dev/warnings/version-mismatch")
31957+
"\n - react-dom: 19.3.0-native-fb-8fc5763b-20260513\nLearn more: https://react.dev/warnings/version-mismatch")
3193531958
);
3193631959
})();
3193731960
("function" === typeof Map &&
@@ -31968,10 +31991,10 @@ __DEV__ &&
3196831991
!(function () {
3196931992
var internals = {
3197031993
bundleType: 1,
31971-
version: "19.3.0-native-fb-d5736f09-20260507",
31994+
version: "19.3.0-native-fb-8fc5763b-20260513",
3197231995
rendererPackageName: "react-dom",
3197331996
currentDispatcherRef: ReactSharedInternals,
31974-
reconcilerVersion: "19.3.0-native-fb-d5736f09-20260507"
31997+
reconcilerVersion: "19.3.0-native-fb-8fc5763b-20260513"
3197531998
};
3197631999
internals.overrideHookState = overrideHookState;
3197732000
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -32121,5 +32144,5 @@ __DEV__ &&
3212132144
listenToAllSupportedEvents(container);
3212232145
return new ReactDOMHydrationRoot(initialChildren);
3212332146
};
32124-
exports.version = "19.3.0-native-fb-d5736f09-20260507";
32147+
exports.version = "19.3.0-native-fb-8fc5763b-20260513";
3212532148
})();

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-prod.js

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<aa77cbbbeffad2e80b0e7267b8215139>>
10+
* @generated SignedSource<<87a12f4fbc3403af65d2e80b09b8b2f7>>
1111
*/
1212

1313
/*
@@ -543,7 +543,26 @@ function describeNativeComponentFrame(fn, construct) {
543543
} catch (x$1) {
544544
control = x$1;
545545
}
546-
fn.call(Fake.prototype);
546+
Fake = !1;
547+
try {
548+
var prevProps = Object.getOwnPropertyDescriptor(
549+
fn.prototype,
550+
"props"
551+
);
552+
Object.defineProperty(fn.prototype, "props", {
553+
configurable: !0,
554+
set: function () {
555+
throw Error();
556+
}
557+
});
558+
Fake = !0;
559+
new fn();
560+
} finally {
561+
Fake &&
562+
(void 0 !== prevProps
563+
? Object.defineProperty(fn.prototype, "props", prevProps)
564+
: delete fn.prototype.props);
565+
}
547566
}
548567
} else {
549568
try {
@@ -19114,14 +19133,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
1911419133
};
1911519134
var isomorphicReactPackageVersion$jscomp$inline_2134 = React.version;
1911619135
if (
19117-
"19.3.0-native-fb-d5736f09-20260507" !==
19136+
"19.3.0-native-fb-8fc5763b-20260513" !==
1911819137
isomorphicReactPackageVersion$jscomp$inline_2134
1911919138
)
1912019139
throw Error(
1912119140
formatProdErrorMessage(
1912219141
527,
1912319142
isomorphicReactPackageVersion$jscomp$inline_2134,
19124-
"19.3.0-native-fb-d5736f09-20260507"
19143+
"19.3.0-native-fb-8fc5763b-20260513"
1912519144
)
1912619145
);
1912719146
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -19143,10 +19162,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
1914319162
};
1914419163
var internals$jscomp$inline_2730 = {
1914519164
bundleType: 0,
19146-
version: "19.3.0-native-fb-d5736f09-20260507",
19165+
version: "19.3.0-native-fb-8fc5763b-20260513",
1914719166
rendererPackageName: "react-dom",
1914819167
currentDispatcherRef: ReactSharedInternals,
19149-
reconcilerVersion: "19.3.0-native-fb-d5736f09-20260507"
19168+
reconcilerVersion: "19.3.0-native-fb-8fc5763b-20260513"
1915019169
};
1915119170
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
1915219171
var hook$jscomp$inline_2731 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -19253,4 +19272,4 @@ exports.hydrateRoot = function (container, initialChildren, options) {
1925319272
listenToAllSupportedEvents(container);
1925419273
return new ReactDOMHydrationRoot(initialChildren);
1925519274
};
19256-
exports.version = "19.3.0-native-fb-d5736f09-20260507";
19275+
exports.version = "19.3.0-native-fb-8fc5763b-20260513";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-profiling.js

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<cac3ee709a1b01598a5b539831221dc3>>
10+
* @generated SignedSource<<31e7bf3590677b5c6a0f99a2677242be>>
1111
*/
1212

1313
/*
@@ -543,7 +543,26 @@ function describeNativeComponentFrame(fn, construct) {
543543
} catch (x$1) {
544544
control = x$1;
545545
}
546-
fn.call(Fake.prototype);
546+
Fake = !1;
547+
try {
548+
var prevProps = Object.getOwnPropertyDescriptor(
549+
fn.prototype,
550+
"props"
551+
);
552+
Object.defineProperty(fn.prototype, "props", {
553+
configurable: !0,
554+
set: function () {
555+
throw Error();
556+
}
557+
});
558+
Fake = !0;
559+
new fn();
560+
} finally {
561+
Fake &&
562+
(void 0 !== prevProps
563+
? Object.defineProperty(fn.prototype, "props", prevProps)
564+
: delete fn.prototype.props);
565+
}
547566
}
548567
} else {
549568
try {
@@ -21176,14 +21195,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
2117621195
};
2117721196
var isomorphicReactPackageVersion$jscomp$inline_2481 = React.version;
2117821197
if (
21179-
"19.3.0-native-fb-d5736f09-20260507" !==
21198+
"19.3.0-native-fb-8fc5763b-20260513" !==
2118021199
isomorphicReactPackageVersion$jscomp$inline_2481
2118121200
)
2118221201
throw Error(
2118321202
formatProdErrorMessage(
2118421203
527,
2118521204
isomorphicReactPackageVersion$jscomp$inline_2481,
21186-
"19.3.0-native-fb-d5736f09-20260507"
21205+
"19.3.0-native-fb-8fc5763b-20260513"
2118721206
)
2118821207
);
2118921208
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -21205,10 +21224,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
2120521224
};
2120621225
var internals$jscomp$inline_2488 = {
2120721226
bundleType: 0,
21208-
version: "19.3.0-native-fb-d5736f09-20260507",
21227+
version: "19.3.0-native-fb-8fc5763b-20260513",
2120921228
rendererPackageName: "react-dom",
2121021229
currentDispatcherRef: ReactSharedInternals,
21211-
reconcilerVersion: "19.3.0-native-fb-d5736f09-20260507",
21230+
reconcilerVersion: "19.3.0-native-fb-8fc5763b-20260513",
2121221231
getLaneLabelMap: function () {
2121321232
for (
2121421233
var map = new Map(), lane = 1, index$346 = 0;
@@ -21331,4 +21350,4 @@ exports.hydrateRoot = function (container, initialChildren, options) {
2133121350
listenToAllSupportedEvents(container);
2133221351
return new ReactDOMHydrationRoot(initialChildren);
2133321352
};
21334-
exports.version = "19.3.0-native-fb-d5736f09-20260507";
21353+
exports.version = "19.3.0-native-fb-8fc5763b-20260513";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-dev.js

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<01fa491c30aaf5645206205b8c753f98>>
10+
* @generated SignedSource<<0974c28e80a29e09e541d8712026de90>>
1111
*/
1212

1313
/*
@@ -727,7 +727,30 @@ __DEV__ &&
727727
} catch (x$0) {
728728
control = x$0;
729729
}
730-
fn.call(Fake.prototype);
730+
Fake = !1;
731+
try {
732+
var prevProps = Object.getOwnPropertyDescriptor(
733+
fn.prototype,
734+
"props"
735+
);
736+
Object.defineProperty(fn.prototype, "props", {
737+
configurable: !0,
738+
set: function () {
739+
throw Error();
740+
}
741+
});
742+
Fake = !0;
743+
new fn();
744+
} finally {
745+
Fake &&
746+
(void 0 !== prevProps
747+
? Object.defineProperty(
748+
fn.prototype,
749+
"props",
750+
prevProps
751+
)
752+
: delete fn.prototype.props);
753+
}
731754
}
732755
} else {
733756
try {
@@ -31989,11 +32012,11 @@ __DEV__ &&
3198932012
};
3199032013
(function () {
3199132014
var isomorphicReactPackageVersion = React.version;
31992-
if ("19.3.0-native-fb-d5736f09-20260507" !== isomorphicReactPackageVersion)
32015+
if ("19.3.0-native-fb-8fc5763b-20260513" !== isomorphicReactPackageVersion)
3199332016
throw Error(
3199432017
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
3199532018
(isomorphicReactPackageVersion +
31996-
"\n - react-dom: 19.3.0-native-fb-d5736f09-20260507\nLearn more: https://react.dev/warnings/version-mismatch")
32019+
"\n - react-dom: 19.3.0-native-fb-8fc5763b-20260513\nLearn more: https://react.dev/warnings/version-mismatch")
3199732020
);
3199832021
})();
3199932022
("function" === typeof Map &&
@@ -32030,10 +32053,10 @@ __DEV__ &&
3203032053
!(function () {
3203132054
var internals = {
3203232055
bundleType: 1,
32033-
version: "19.3.0-native-fb-d5736f09-20260507",
32056+
version: "19.3.0-native-fb-8fc5763b-20260513",
3203432057
rendererPackageName: "react-dom",
3203532058
currentDispatcherRef: ReactSharedInternals,
32036-
reconcilerVersion: "19.3.0-native-fb-d5736f09-20260507"
32059+
reconcilerVersion: "19.3.0-native-fb-8fc5763b-20260513"
3203732060
};
3203832061
internals.overrideHookState = overrideHookState;
3203932062
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -32499,7 +32522,7 @@ __DEV__ &&
3249932522
exports.useFormStatus = function () {
3250032523
return resolveDispatcher().useHostTransitionStatus();
3250132524
};
32502-
exports.version = "19.3.0-native-fb-d5736f09-20260507";
32525+
exports.version = "19.3.0-native-fb-8fc5763b-20260513";
3250332526
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
3250432527
"function" ===
3250532528
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

0 commit comments

Comments
 (0)