Summary:
Changelog: [internal]

Logger needs to be supplied to YGConfig, otherwise the app crashes when Yoga tries to log.

Reviewed By: fkgozali

Differential Revision: D30394676

fbshipit-source-id: bda464a4e43cb815c00650e1fedf43fe0a06f973
This commit is contained in:
Samuel Susla 2021-08-20 04:38:13 -07:00 коммит произвёл Facebook GitHub Bot
Родитель b7616242aa
Коммит 1036c14888
1 изменённых файлов: 37 добавлений и 19 удалений

Просмотреть файл

@ -23,6 +23,41 @@
namespace facebook {
namespace react {
static int FabricDefaultYogaLog(
const YGConfigRef,
const YGNodeRef,
YGLogLevel level,
const char *format,
va_list args) {
va_list args_copy;
va_copy(args_copy, args);
// Adding 1 to add space for terminating null character.
int size_s = vsnprintf(NULL, 0, format, args);
auto size = static_cast<size_t>(size_s);
std::vector<char> buffer(size);
vsnprintf(buffer.data(), size, format, args_copy);
switch (level) {
case YGLogLevelError:
react_native_log_error(buffer.data());
break;
case YGLogLevelFatal:
react_native_log_fatal(buffer.data());
break;
case YGLogLevelWarn:
react_native_log_warn(buffer.data());
break;
case YGLogLevelInfo:
case YGLogLevelDebug:
case YGLogLevelVerbose:
default:
react_native_log_info(buffer.data());
}
return size_s;
}
thread_local LayoutContext threadLocalLayoutContext;
ShadowNodeTraits YogaLayoutableShadowNode::BaseTraits() {
@ -36,7 +71,7 @@ YogaLayoutableShadowNode::YogaLayoutableShadowNode(
ShadowNodeFamily::Shared const &family,
ShadowNodeTraits traits)
: LayoutableShadowNode(fragment, family, traits),
yogaConfig_(nullptr),
yogaConfig_(FabricDefaultYogaLog),
yogaNode_(&initializeYogaConfig(yogaConfig_)) {
yogaNode_.setContext(this);
@ -62,7 +97,7 @@ YogaLayoutableShadowNode::YogaLayoutableShadowNode(
ShadowNode const &sourceShadowNode,
ShadowNodeFragment const &fragment)
: LayoutableShadowNode(sourceShadowNode, fragment),
yogaConfig_(nullptr),
yogaConfig_(FabricDefaultYogaLog),
yogaNode_(
static_cast<YogaLayoutableShadowNode const &>(sourceShadowNode)
.yogaNode_,
@ -412,7 +447,6 @@ void YogaLayoutableShadowNode::layoutTree(
{
SystraceSection s("YogaLayoutableShadowNode::YGNodeCalculateLayout");
YGNodeCalculateLayout(&yogaNode_, ownerWidth, ownerHeight, direction);
}
@ -572,28 +606,12 @@ YGSize YogaLayoutableShadowNode::yogaNodeMeasureCallbackConnector(
yogaFloatFromFloat(size.width), yogaFloatFromFloat(size.height)};
}
#ifdef RN_DEBUG_YOGA_LOGGER
static int YogaLog(
const YGConfigRef config,
const YGNodeRef node,
YGLogLevel level,
const char *format,
va_list args) {
int result = vsnprintf(NULL, 0, format, args);
std::vector<char> buffer(1 + result);
vsnprintf(buffer.data(), buffer.size(), format, args);
LOG(ERROR) << "RNYogaLogger " << buffer.data();
return result;
}
#endif
YGConfig &YogaLayoutableShadowNode::initializeYogaConfig(YGConfig &config) {
config.setCloneNodeCallback(
YogaLayoutableShadowNode::yogaNodeCloneCallbackConnector);
config.useLegacyStretchBehaviour = true;
#ifdef RN_DEBUG_YOGA_LOGGER
config.printTree = true;
config.setLogger(&YogaLog);
#endif
return config;
}