Skip to content

Commit af9c2bb

Browse files
hoxyqfacebook-github-bot
authored andcommitted
Define precise return types for toJs conversions, instead of generic jsi::Value (facebook#51224)
Summary: Pull Request resolved: facebook#51224 Changelog: [Internal] We have a bunch of places where we rely on implicit conversion operators of `jsi::Value` and return some primitive type. This doesn't work well with Bridging, because currently it doesn't take into account these implicit operator conversions: primitives won't be treated as primitivies, but rather as generic `jsi::Value`, which could be many things. We should be explicit about return type in `toJs`, because it affects the type checking logic. Differential Revision: D74478571
1 parent b8bad78 commit af9c2bb

File tree

6 files changed

+22
-25
lines changed

6 files changed

+22
-25
lines changed

packages/react-native/ReactCommon/jserrorhandler/JsErrorHandler.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ namespace facebook::react {
125125

126126
template <>
127127
struct Bridging<JsErrorHandler::ProcessedError::StackFrame> {
128-
static jsi::Value toJs(
128+
static jsi::Object toJs(
129129
jsi::Runtime& runtime,
130130
const JsErrorHandler::ProcessedError::StackFrame& frame) {
131131
auto stackFrame = jsi::Object(runtime);
@@ -143,7 +143,7 @@ struct Bridging<JsErrorHandler::ProcessedError::StackFrame> {
143143

144144
template <>
145145
struct Bridging<JsErrorHandler::ProcessedError> {
146-
static jsi::Value toJs(
146+
static jsi::Object toJs(
147147
jsi::Runtime& runtime,
148148
const JsErrorHandler::ProcessedError& error) {
149149
auto data = jsi::Object(runtime);
@@ -341,7 +341,7 @@ void JsErrorHandler::handleErrorWithCppPipeline(
341341
.extraData = std::move(extraData),
342342
};
343343

344-
auto data = bridging::toJs(runtime, processedError).asObject(runtime);
344+
auto data = bridging::toJs(runtime, processedError);
345345

346346
auto isComponentError =
347347
isTruthy(runtime, errorObj.getProperty(runtime, "isComponentError"));

packages/react-native/ReactCommon/react/bridging/Bool.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct Bridging<bool> {
1717
return value.asBool();
1818
}
1919

20-
static jsi::Value toJs(jsi::Runtime&, bool value) {
20+
static bool toJs(jsi::Runtime& /*unused*/, bool value) {
2121
return value;
2222
}
2323
};

packages/react-native/ReactCommon/react/bridging/Number.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,45 +13,45 @@ namespace facebook::react {
1313

1414
template <>
1515
struct Bridging<double> {
16-
static double fromJs(jsi::Runtime&, const jsi::Value& value) {
16+
static double fromJs(jsi::Runtime& /*unused*/, const jsi::Value& value) {
1717
return value.asNumber();
1818
}
1919

20-
static jsi::Value toJs(jsi::Runtime&, double value) {
20+
static double toJs(jsi::Runtime& /*unused*/, double value) {
2121
return value;
2222
}
2323
};
2424

2525
template <>
2626
struct Bridging<float> {
27-
static float fromJs(jsi::Runtime&, const jsi::Value& value) {
27+
static float fromJs(jsi::Runtime& /*unused*/, const jsi::Value& value) {
2828
return (float)value.asNumber();
2929
}
3030

31-
static jsi::Value toJs(jsi::Runtime&, float value) {
32-
return (double)value;
31+
static float toJs(jsi::Runtime& /*unused*/, float value) {
32+
return value;
3333
}
3434
};
3535

3636
template <>
3737
struct Bridging<int32_t> {
38-
static int32_t fromJs(jsi::Runtime&, const jsi::Value& value) {
38+
static int32_t fromJs(jsi::Runtime& /*unused*/, const jsi::Value& value) {
3939
return (int32_t)value.asNumber();
4040
}
4141

42-
static jsi::Value toJs(jsi::Runtime&, int32_t value) {
42+
static int32_t toJs(jsi::Runtime& /*unused*/, int32_t value) {
4343
return value;
4444
}
4545
};
4646

4747
template <>
4848
struct Bridging<uint32_t> {
49-
static uint32_t fromJs(jsi::Runtime&, const jsi::Value& value) {
49+
static uint32_t fromJs(jsi::Runtime& /*unused*/, const jsi::Value& value) {
5050
return (uint32_t)value.asNumber();
5151
}
5252

53-
static jsi::Value toJs(jsi::Runtime&, uint32_t value) {
54-
return (double)value;
53+
static jsi::Value toJs(jsi::Runtime& /*unused*/, uint32_t value) {
54+
return double(value);
5555
}
5656
};
5757

packages/react-native/ReactCommon/react/bridging/tests/BridgingTest.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ TEST_F(BridgingTest, boolTest) {
4646
EXPECT_FALSE(bridging::fromJs<bool>(rt, jsi::Value(false), invoker));
4747
EXPECT_JSI_THROW(bridging::fromJs<bool>(rt, jsi::Value(1), invoker));
4848

49-
EXPECT_TRUE(bridging::toJs(rt, true).asBool());
50-
EXPECT_FALSE(bridging::toJs(rt, false).asBool());
49+
EXPECT_TRUE(bridging::toJs(rt, true));
50+
EXPECT_FALSE(bridging::toJs(rt, false));
5151
}
5252

5353
TEST_F(BridgingTest, numberTest) {
@@ -56,10 +56,9 @@ TEST_F(BridgingTest, numberTest) {
5656
EXPECT_DOUBLE_EQ(1.2, bridging::fromJs<double>(rt, jsi::Value(1.2), invoker));
5757
EXPECT_JSI_THROW(bridging::fromJs<double>(rt, jsi::Value(true), invoker));
5858

59-
EXPECT_EQ(1, static_cast<int>(bridging::toJs(rt, 1).asNumber()));
60-
EXPECT_FLOAT_EQ(
61-
1.2f, static_cast<float>(bridging::toJs(rt, 1.2f).asNumber()));
62-
EXPECT_DOUBLE_EQ(1.2, bridging::toJs(rt, 1.2).asNumber());
59+
EXPECT_EQ(1, static_cast<int>(bridging::toJs(rt, 1)));
60+
EXPECT_FLOAT_EQ(1.2f, static_cast<float>(bridging::toJs(rt, 1.2f)));
61+
EXPECT_DOUBLE_EQ(1.2, bridging::toJs(rt, 1.2));
6362

6463
EXPECT_EQ(
6564
42,

packages/react-native/ReactCommon/react/nativemodule/webperformance/NativePerformance.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,8 @@ struct Bridging<PerformanceEntryType> {
4242
return static_cast<PerformanceEntryType>(value.asNumber());
4343
}
4444

45-
static jsi::Value toJs(
46-
jsi::Runtime& /*rt*/,
47-
const PerformanceEntryType& value) {
48-
return {static_cast<int>(value)};
45+
static int toJs(jsi::Runtime& /*rt*/, const PerformanceEntryType& value) {
46+
return static_cast<int>(value);
4947
}
5048
};
5149

packages/rn-tester/NativeCxxModuleExample/NativeCxxModuleExample.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ struct Bridging<CustomEnumInt> {
6262
}
6363
}
6464

65-
static jsi::Value toJs(jsi::Runtime& rt, CustomEnumInt value) {
65+
static int32_t toJs(jsi::Runtime& rt, CustomEnumInt value) {
6666
return bridging::toJs(rt, static_cast<int32_t>(value));
6767
}
6868
};

0 commit comments

Comments
 (0)