Skip to content

Commit

Permalink
throw std::logic_error instead of aborting the process and convert to…
Browse files Browse the repository at this point in the history
… java exception

Summary: Changelog: [Internal][Yoga] throw std::logic_error instead of aborting the process and convert to java exception for jni layer

Reviewed By: pasqualeanatriello

Differential Revision: D21301235

fbshipit-source-id: 148b27920e62990a271e1d0df8c85a2cc42f4fd4
  • Loading branch information
SidharthGuglani-zz authored and facebook-github-bot committed May 14, 2020
1 parent ac7c85c commit 07c0d53
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 9 deletions.
7 changes: 7 additions & 0 deletions java/jni/YGJNIVanilla.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,13 @@ static void jni_YGNodeCalculateLayoutJNI(
if (throwable.get()) {
env->Throw(throwable.get());
}
} catch (const std::logic_error& ex) {
env->ExceptionClear();
jclass cl = env->FindClass("Ljava/lang/IllegalStateException;");
static const jmethodID methodId = facebook::yoga::vanillajni::getMethodId(
env, cl, "<init>", "(Ljava/lang/String;)V");
auto throwable = env->NewObject(cl, methodId, env->NewStringUTF(ex.what()));
env->Throw(static_cast<jthrowable>(throwable));
}
}

Expand Down
4 changes: 2 additions & 2 deletions tests/YGMeasureTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -580,7 +580,7 @@ TEST(YogaDeathTest, cannot_add_child_to_node_with_measure_func) {
root->setMeasureFunc(_measure);

const YGNodeRef root_child0 = YGNodeNew();
ASSERT_DEATH(YGNodeInsertChild(root, root_child0, 0), "Cannot add child.*");
ASSERT_THROW(YGNodeInsertChild(root, root_child0, 0), std::logic_error);
YGNodeFree(root_child0);
YGNodeFreeRecursive(root);
}
Expand All @@ -589,7 +589,7 @@ TEST(YogaDeathTest, cannot_add_nonnull_measure_func_to_non_leaf_node) {
const YGNodeRef root = YGNodeNew();
const YGNodeRef root_child0 = YGNodeNew();
YGNodeInsertChild(root, root_child0, 0);
ASSERT_DEATH(root->setMeasureFunc(_measure), "Cannot set measure function.*");
ASSERT_THROW(root->setMeasureFunc(_measure), std::logic_error);
YGNodeFreeRecursive(root);
}

Expand Down
4 changes: 4 additions & 0 deletions yoga/Utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,7 @@ YGFloatOptional YGFloatOptionalMax(YGFloatOptional op1, YGFloatOptional op2) {
}
return op1.isUndefined() ? op2 : op1;
}

void throwLogicalErrorWithMessage(const char* message) {
throw std::logic_error(message);
}
2 changes: 2 additions & 0 deletions yoga/Utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,5 @@ inline YGFloatOptional YGResolveValueMargin(
const float ownerSize) {
return value.isAuto() ? YGFloatOptional{0} : YGResolveValue(value, ownerSize);
}

void throwLogicalErrorWithMessage(const char* message);
6 changes: 3 additions & 3 deletions yoga/Yoga.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,9 +249,6 @@ YOGA_EXPORT YGNodeRef YGNodeClone(YGNodeRef oldNode) {
static YGConfigRef YGConfigClone(const YGConfig& oldConfig) {
const YGConfigRef config = new YGConfig(oldConfig);
YGAssert(config != nullptr, "Could not allocate memory for config");
if (config == nullptr) {
abort();
}
gConfigInstanceCount++;
return config;
}
Expand Down Expand Up @@ -4341,6 +4338,7 @@ YOGA_EXPORT void YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour(
void YGAssert(const bool condition, const char* message) {
if (!condition) {
Log::log(YGNodeRef{nullptr}, YGLogLevelFatal, nullptr, "%s\n", message);
throwLogicalErrorWithMessage(message);
}
}

Expand All @@ -4350,6 +4348,7 @@ void YGAssertWithNode(
const char* message) {
if (!condition) {
Log::log(node, YGLogLevelFatal, nullptr, "%s\n", message);
throwLogicalErrorWithMessage(message);
}
}

Expand All @@ -4359,6 +4358,7 @@ void YGAssertWithConfig(
const char* message) {
if (!condition) {
Log::log(config, YGLogLevelFatal, nullptr, "%s\n", message);
throwLogicalErrorWithMessage(message);
}
}

Expand Down
4 changes: 0 additions & 4 deletions yoga/log.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,6 @@ void vlog(
va_list args) {
YGConfig* logConfig = config != nullptr ? config : YGConfigGetDefault();
logConfig->log(logConfig, node, level, context, format, args);

if (level == YGLogLevelFatal) {
abort();
}
}
} // namespace

Expand Down

0 comments on commit 07c0d53

Please sign in to comment.