Skip to content

Commit 536edf3

Browse files
Don't support float enums
Summary: Changelog: [General][BREAKING] Don't support 'float' enums in Turbo Modules - The current implementation of 'float enums' in C++ does not work as invalid results are returned. - At potential fix could still cause rounding errors when crossing language bounaries, e.g. `4.6` can become `4.5599999942..` - C++ enum classes don't support float: https://eel.is/c++draft/dcl.enum#2.sentence-4 > The type-specifier-seq of an enum-base shall name an integral type; any cv-qualification is ignored. Hence removing the feature of `float enums` for now Reviewed By: NickGerleman Differential Revision: D52120405 fbshipit-source-id: 3685ad0629e16ff9db424ba67e07d09df6027553
1 parent 12aef32 commit 536edf3

File tree

16 files changed

+75
-323
lines changed

16 files changed

+75
-323
lines changed

packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeEnumTurboModule.js

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,30 +34,21 @@ export enum StatusNumEnum {
3434
Off = 0,
3535
}
3636

37-
export enum StatusFractionEnum {
38-
Active = 0.2,
39-
Paused = 0.1,
40-
Off = 0.0,
41-
}
42-
4337
export type StateTypeWithEnums = {|
4438
state: string,
4539
regular: StatusRegularEnum,
4640
str: StatusStrEnum,
4741
num: StatusNumEnum,
48-
fraction: StatusFractionEnum,
4942
|};
5043

5144
export interface Spec extends TurboModule {
5245
+getStatusRegular: (statusProp: StateType) => StatusRegularEnum;
5346
+getStatusStr: (statusProp: StateType) => StatusStrEnum;
5447
+getStatusNum: (statusProp: StateType) => StatusNumEnum;
55-
+getStatusFraction: (statusProp: StateType) => StatusFractionEnum;
5648
+getStateType: (
5749
a: StatusRegularEnum,
5850
b: StatusStrEnum,
5951
c: StatusNumEnum,
60-
d: StatusFractionEnum,
6152
) => StateType;
6253
+getStateTypeWithEnums: (
6354
paramOfTypeWithEnums: StateTypeWithEnums,

packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleCpp-test.js.snap

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -96,19 +96,12 @@ static jsi::Value __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusNum(js
9696
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
9797
);
9898
}
99-
static jsi::Value __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusFraction(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
100-
return static_cast<NativeEnumTurboModuleCxxSpecJSI *>(&turboModule)->getStatusFraction(
101-
rt,
102-
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
103-
);
104-
}
10599
static jsi::Value __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStateType(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
106100
return static_cast<NativeEnumTurboModuleCxxSpecJSI *>(&turboModule)->getStateType(
107101
rt,
108102
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt),
109103
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asString(rt),
110-
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asNumber(),
111-
count <= 3 ? throw jsi::JSError(rt, \\"Expected argument in position 3 to be passed\\") : args[3].asNumber()
104+
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asNumber()
112105
);
113106
}
114107
static jsi::Value __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStateTypeWithEnums(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
@@ -123,8 +116,7 @@ NativeEnumTurboModuleCxxSpecJSI::NativeEnumTurboModuleCxxSpecJSI(std::shared_ptr
123116
methodMap_[\\"getStatusRegular\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusRegular};
124117
methodMap_[\\"getStatusStr\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusStr};
125118
methodMap_[\\"getStatusNum\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusNum};
126-
methodMap_[\\"getStatusFraction\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusFraction};
127-
methodMap_[\\"getStateType\\"] = MethodMetadata {4, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStateType};
119+
methodMap_[\\"getStateType\\"] = MethodMetadata {3, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStateType};
128120
methodMap_[\\"getStateTypeWithEnums\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStateTypeWithEnums};
129121
}
130122
static jsi::Value __hostFunction_NativeNullableTurboModuleCxxSpecJSI_getBool(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
@@ -917,19 +909,12 @@ static jsi::Value __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusNum(js
917909
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
918910
);
919911
}
920-
static jsi::Value __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusFraction(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
921-
return static_cast<NativeEnumTurboModuleCxxSpecJSI *>(&turboModule)->getStatusFraction(
922-
rt,
923-
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asObject(rt)
924-
);
925-
}
926912
static jsi::Value __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStateType(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
927913
return static_cast<NativeEnumTurboModuleCxxSpecJSI *>(&turboModule)->getStateType(
928914
rt,
929915
count <= 0 ? throw jsi::JSError(rt, \\"Expected argument in position 0 to be passed\\") : args[0].asString(rt),
930916
count <= 1 ? throw jsi::JSError(rt, \\"Expected argument in position 1 to be passed\\") : args[1].asString(rt),
931-
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asNumber(),
932-
count <= 3 ? throw jsi::JSError(rt, \\"Expected argument in position 3 to be passed\\") : args[3].asNumber()
917+
count <= 2 ? throw jsi::JSError(rt, \\"Expected argument in position 2 to be passed\\") : args[2].asNumber()
933918
);
934919
}
935920
static jsi::Value __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStateTypeWithEnums(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
@@ -944,8 +929,7 @@ NativeEnumTurboModuleCxxSpecJSI::NativeEnumTurboModuleCxxSpecJSI(std::shared_ptr
944929
methodMap_[\\"getStatusRegular\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusRegular};
945930
methodMap_[\\"getStatusStr\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusStr};
946931
methodMap_[\\"getStatusNum\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusNum};
947-
methodMap_[\\"getStatusFraction\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStatusFraction};
948-
methodMap_[\\"getStateType\\"] = MethodMetadata {4, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStateType};
932+
methodMap_[\\"getStateType\\"] = MethodMetadata {3, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStateType};
949933
methodMap_[\\"getStateTypeWithEnums\\"] = MethodMetadata {1, __hostFunction_NativeEnumTurboModuleCxxSpecJSI_getStateTypeWithEnums};
950934
}
951935
static jsi::Value __hostFunction_NativeNullableTurboModuleCxxSpecJSI_getBool(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {

packages/react-native-codegen/e2e/__tests__/modules/__snapshots__/GenerateModuleH-test.js.snap

Lines changed: 16 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -287,38 +287,6 @@ struct Bridging<NativeEnumTurboModuleStatusNumEnum> {
287287
}
288288
}
289289
};
290-
291-
#pragma mark - NativeEnumTurboModuleStatusFractionEnum
292-
293-
enum class NativeEnumTurboModuleStatusFractionEnum { Active, Paused, Off };
294-
295-
template <>
296-
struct Bridging<NativeEnumTurboModuleStatusFractionEnum> {
297-
static NativeEnumTurboModuleStatusFractionEnum fromJs(jsi::Runtime &rt, const jsi::Value &rawValue) {
298-
double value = (double)rawValue.asNumber();
299-
if (value == 0.2f) {
300-
return NativeEnumTurboModuleStatusFractionEnum::Active;
301-
} else if (value == 0.1f) {
302-
return NativeEnumTurboModuleStatusFractionEnum::Paused;
303-
} else if (value == 0f) {
304-
return NativeEnumTurboModuleStatusFractionEnum::Off;
305-
} else {
306-
throw jsi::JSError(rt, \\"No appropriate enum member found for value\\");
307-
}
308-
}
309-
310-
static jsi::Value toJs(jsi::Runtime &rt, NativeEnumTurboModuleStatusFractionEnum value) {
311-
if (value == NativeEnumTurboModuleStatusFractionEnum::Active) {
312-
return bridging::toJs(rt, 0.2f);
313-
} else if (value == NativeEnumTurboModuleStatusFractionEnum::Paused) {
314-
return bridging::toJs(rt, 0.1f);
315-
} else if (value == NativeEnumTurboModuleStatusFractionEnum::Off) {
316-
return bridging::toJs(rt, 0f);
317-
} else {
318-
throw jsi::JSError(rt, \\"No appropriate enum member found for enum value\\");
319-
}
320-
}
321-
};
322290

323291
#pragma mark - NativeEnumTurboModuleStateType
324292

@@ -363,15 +331,14 @@ struct NativeEnumTurboModuleStateTypeBridging {
363331

364332
#pragma mark - NativeEnumTurboModuleStateTypeWithEnums
365333

366-
template <typename P0, typename P1, typename P2, typename P3, typename P4>
334+
template <typename P0, typename P1, typename P2, typename P3>
367335
struct NativeEnumTurboModuleStateTypeWithEnums {
368336
P0 state;
369337
P1 regular;
370338
P2 str;
371339
P3 num;
372-
P4 fraction;
373340
bool operator==(const NativeEnumTurboModuleStateTypeWithEnums &other) const {
374-
return state == other.state && regular == other.regular && str == other.str && num == other.num && fraction == other.fraction;
341+
return state == other.state && regular == other.regular && str == other.str && num == other.num;
375342
}
376343
};
377344

@@ -387,8 +354,7 @@ struct NativeEnumTurboModuleStateTypeWithEnumsBridging {
387354
bridging::fromJs<decltype(types.state)>(rt, value.getProperty(rt, \\"state\\"), jsInvoker),
388355
bridging::fromJs<decltype(types.regular)>(rt, value.getProperty(rt, \\"regular\\"), jsInvoker),
389356
bridging::fromJs<decltype(types.str)>(rt, value.getProperty(rt, \\"str\\"), jsInvoker),
390-
bridging::fromJs<decltype(types.num)>(rt, value.getProperty(rt, \\"num\\"), jsInvoker),
391-
bridging::fromJs<decltype(types.fraction)>(rt, value.getProperty(rt, \\"fraction\\"), jsInvoker)};
357+
bridging::fromJs<decltype(types.num)>(rt, value.getProperty(rt, \\"num\\"), jsInvoker)};
392358
return result;
393359
}
394360

@@ -408,10 +374,6 @@ struct NativeEnumTurboModuleStateTypeWithEnumsBridging {
408374
static jsi::Value numToJs(jsi::Runtime &rt, decltype(types.num) value) {
409375
return bridging::toJs(rt, value);
410376
}
411-
412-
static jsi::Value fractionToJs(jsi::Runtime &rt, decltype(types.fraction) value) {
413-
return bridging::toJs(rt, value);
414-
}
415377
#endif
416378

417379
static jsi::Object toJs(
@@ -423,7 +385,6 @@ struct NativeEnumTurboModuleStateTypeWithEnumsBridging {
423385
result.setProperty(rt, \\"regular\\", bridging::toJs(rt, value.regular, jsInvoker));
424386
result.setProperty(rt, \\"str\\", bridging::toJs(rt, value.str, jsInvoker));
425387
result.setProperty(rt, \\"num\\", bridging::toJs(rt, value.num, jsInvoker));
426-
result.setProperty(rt, \\"fraction\\", bridging::toJs(rt, value.fraction, jsInvoker));
427388
return result;
428389
}
429390
};
@@ -436,8 +397,7 @@ public:
436397
virtual jsi::String getStatusRegular(jsi::Runtime &rt, jsi::Object statusProp) = 0;
437398
virtual jsi::String getStatusStr(jsi::Runtime &rt, jsi::Object statusProp) = 0;
438399
virtual jsi::Value getStatusNum(jsi::Runtime &rt, jsi::Object statusProp) = 0;
439-
virtual jsi::Value getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) = 0;
440-
virtual jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c, jsi::Value d) = 0;
400+
virtual jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c) = 0;
441401
virtual jsi::Object getStateTypeWithEnums(jsi::Runtime &rt, jsi::Object paramOfTypeWithEnums) = 0;
442402

443403
};
@@ -486,21 +446,13 @@ private:
486446
return bridging::callFromJs<jsi::Value>(
487447
rt, &T::getStatusNum, jsInvoker_, instance_, std::move(statusProp));
488448
}
489-
jsi::Value getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) override {
490-
static_assert(
491-
bridging::getParameterCount(&T::getStatusFraction) == 2,
492-
\\"Expected getStatusFraction(...) to have 2 parameters\\");
493-
494-
return bridging::callFromJs<jsi::Value>(
495-
rt, &T::getStatusFraction, jsInvoker_, instance_, std::move(statusProp));
496-
}
497-
jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c, jsi::Value d) override {
449+
jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c) override {
498450
static_assert(
499-
bridging::getParameterCount(&T::getStateType) == 5,
500-
\\"Expected getStateType(...) to have 5 parameters\\");
451+
bridging::getParameterCount(&T::getStateType) == 4,
452+
\\"Expected getStateType(...) to have 4 parameters\\");
501453

502454
return bridging::callFromJs<jsi::Object>(
503-
rt, &T::getStateType, jsInvoker_, instance_, std::move(a), std::move(b), std::move(c), std::move(d));
455+
rt, &T::getStateType, jsInvoker_, instance_, std::move(a), std::move(b), std::move(c));
504456
}
505457
jsi::Object getStateTypeWithEnums(jsi::Runtime &rt, jsi::Object paramOfTypeWithEnums) override {
506458
static_assert(
@@ -2289,38 +2241,6 @@ struct Bridging<NativeEnumTurboModuleStatusNumEnum> {
22892241
}
22902242
}
22912243
};
2292-
2293-
#pragma mark - NativeEnumTurboModuleStatusFractionEnum
2294-
2295-
enum class NativeEnumTurboModuleStatusFractionEnum { Active, Paused, Off };
2296-
2297-
template <>
2298-
struct Bridging<NativeEnumTurboModuleStatusFractionEnum> {
2299-
static NativeEnumTurboModuleStatusFractionEnum fromJs(jsi::Runtime &rt, const jsi::Value &rawValue) {
2300-
double value = (double)rawValue.asNumber();
2301-
if (value == 0.2f) {
2302-
return NativeEnumTurboModuleStatusFractionEnum::Active;
2303-
} else if (value == 0.1f) {
2304-
return NativeEnumTurboModuleStatusFractionEnum::Paused;
2305-
} else if (value == 0f) {
2306-
return NativeEnumTurboModuleStatusFractionEnum::Off;
2307-
} else {
2308-
throw jsi::JSError(rt, \\"No appropriate enum member found for value\\");
2309-
}
2310-
}
2311-
2312-
static jsi::Value toJs(jsi::Runtime &rt, NativeEnumTurboModuleStatusFractionEnum value) {
2313-
if (value == NativeEnumTurboModuleStatusFractionEnum::Active) {
2314-
return bridging::toJs(rt, 0.2f);
2315-
} else if (value == NativeEnumTurboModuleStatusFractionEnum::Paused) {
2316-
return bridging::toJs(rt, 0.1f);
2317-
} else if (value == NativeEnumTurboModuleStatusFractionEnum::Off) {
2318-
return bridging::toJs(rt, 0f);
2319-
} else {
2320-
throw jsi::JSError(rt, \\"No appropriate enum member found for enum value\\");
2321-
}
2322-
}
2323-
};
23242244

23252245
#pragma mark - NativeEnumTurboModuleStateType
23262246

@@ -2365,15 +2285,14 @@ struct NativeEnumTurboModuleStateTypeBridging {
23652285

23662286
#pragma mark - NativeEnumTurboModuleStateTypeWithEnums
23672287

2368-
template <typename P0, typename P1, typename P2, typename P3, typename P4>
2288+
template <typename P0, typename P1, typename P2, typename P3>
23692289
struct NativeEnumTurboModuleStateTypeWithEnums {
23702290
P0 state;
23712291
P1 regular;
23722292
P2 str;
23732293
P3 num;
2374-
P4 fraction;
23752294
bool operator==(const NativeEnumTurboModuleStateTypeWithEnums &other) const {
2376-
return state == other.state && regular == other.regular && str == other.str && num == other.num && fraction == other.fraction;
2295+
return state == other.state && regular == other.regular && str == other.str && num == other.num;
23772296
}
23782297
};
23792298

@@ -2389,8 +2308,7 @@ struct NativeEnumTurboModuleStateTypeWithEnumsBridging {
23892308
bridging::fromJs<decltype(types.state)>(rt, value.getProperty(rt, \\"state\\"), jsInvoker),
23902309
bridging::fromJs<decltype(types.regular)>(rt, value.getProperty(rt, \\"regular\\"), jsInvoker),
23912310
bridging::fromJs<decltype(types.str)>(rt, value.getProperty(rt, \\"str\\"), jsInvoker),
2392-
bridging::fromJs<decltype(types.num)>(rt, value.getProperty(rt, \\"num\\"), jsInvoker),
2393-
bridging::fromJs<decltype(types.fraction)>(rt, value.getProperty(rt, \\"fraction\\"), jsInvoker)};
2311+
bridging::fromJs<decltype(types.num)>(rt, value.getProperty(rt, \\"num\\"), jsInvoker)};
23942312
return result;
23952313
}
23962314

@@ -2410,10 +2328,6 @@ struct NativeEnumTurboModuleStateTypeWithEnumsBridging {
24102328
static jsi::Value numToJs(jsi::Runtime &rt, decltype(types.num) value) {
24112329
return bridging::toJs(rt, value);
24122330
}
2413-
2414-
static jsi::Value fractionToJs(jsi::Runtime &rt, decltype(types.fraction) value) {
2415-
return bridging::toJs(rt, value);
2416-
}
24172331
#endif
24182332

24192333
static jsi::Object toJs(
@@ -2425,7 +2339,6 @@ struct NativeEnumTurboModuleStateTypeWithEnumsBridging {
24252339
result.setProperty(rt, \\"regular\\", bridging::toJs(rt, value.regular, jsInvoker));
24262340
result.setProperty(rt, \\"str\\", bridging::toJs(rt, value.str, jsInvoker));
24272341
result.setProperty(rt, \\"num\\", bridging::toJs(rt, value.num, jsInvoker));
2428-
result.setProperty(rt, \\"fraction\\", bridging::toJs(rt, value.fraction, jsInvoker));
24292342
return result;
24302343
}
24312344
};
@@ -2438,8 +2351,7 @@ public:
24382351
virtual jsi::String getStatusRegular(jsi::Runtime &rt, jsi::Object statusProp) = 0;
24392352
virtual jsi::String getStatusStr(jsi::Runtime &rt, jsi::Object statusProp) = 0;
24402353
virtual jsi::Value getStatusNum(jsi::Runtime &rt, jsi::Object statusProp) = 0;
2441-
virtual jsi::Value getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) = 0;
2442-
virtual jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c, jsi::Value d) = 0;
2354+
virtual jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c) = 0;
24432355
virtual jsi::Object getStateTypeWithEnums(jsi::Runtime &rt, jsi::Object paramOfTypeWithEnums) = 0;
24442356

24452357
};
@@ -2488,21 +2400,13 @@ private:
24882400
return bridging::callFromJs<jsi::Value>(
24892401
rt, &T::getStatusNum, jsInvoker_, instance_, std::move(statusProp));
24902402
}
2491-
jsi::Value getStatusFraction(jsi::Runtime &rt, jsi::Object statusProp) override {
2492-
static_assert(
2493-
bridging::getParameterCount(&T::getStatusFraction) == 2,
2494-
\\"Expected getStatusFraction(...) to have 2 parameters\\");
2495-
2496-
return bridging::callFromJs<jsi::Value>(
2497-
rt, &T::getStatusFraction, jsInvoker_, instance_, std::move(statusProp));
2498-
}
2499-
jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c, jsi::Value d) override {
2403+
jsi::Object getStateType(jsi::Runtime &rt, jsi::String a, jsi::String b, jsi::Value c) override {
25002404
static_assert(
2501-
bridging::getParameterCount(&T::getStateType) == 5,
2502-
\\"Expected getStateType(...) to have 5 parameters\\");
2405+
bridging::getParameterCount(&T::getStateType) == 4,
2406+
\\"Expected getStateType(...) to have 4 parameters\\");
25032407

25042408
return bridging::callFromJs<jsi::Object>(
2505-
rt, &T::getStateType, jsInvoker_, instance_, std::move(a), std::move(b), std::move(c), std::move(d));
2409+
rt, &T::getStateType, jsInvoker_, instance_, std::move(a), std::move(b), std::move(c));
25062410
}
25072411
jsi::Object getStateTypeWithEnums(jsi::Runtime &rt, jsi::Object paramOfTypeWithEnums) override {
25082412
static_assert(

0 commit comments

Comments
 (0)