From 0bdf36f5d130381284dc71dd74c996a494369eaf Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Tue, 19 Feb 2019 09:54:45 -0800 Subject: [PATCH] Call logger from within `YGConfig` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: @public Stricter encapsulation of logging callbacks within `YGConfig`. Instead of invoking the logging callback directly (`node->logger(...)`), callers now have to go through `YGConfig::log()`. This change will allow us to add the concept of a *Layout Context,* where logging functions will be able to receive an additional `void *` argument if configured accordingly. This API will be used internally for Yoga’s JNI bindings, to avoid storing a weak JNI reference for each node, and avoid reference table overflows. Changed API: - `YGConfig::logger()` -> `YGConfig::log()` Reviewed By: SidharthGuglani Differential Revision: D14123483 fbshipit-source-id: 87b8bb7de0e4346b6a41e57a70ac4eb8d79b24af --- yoga/YGConfig.cpp | 11 ++++++++++- yoga/YGConfig.h | 13 ++++++++++--- yoga/Yoga.cpp | 6 +++--- yoga/log.cpp | 2 +- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/yoga/YGConfig.cpp b/yoga/YGConfig.cpp index 2f73dd9a..c6c3380b 100644 --- a/yoga/YGConfig.cpp +++ b/yoga/YGConfig.cpp @@ -6,4 +6,13 @@ */ #include "YGConfig.h" -YGConfig::YGConfig(YGLogger logger) : logger(logger) {} +YGConfig::YGConfig(YGLogger logger) : logger_{logger} {} + +void YGConfig::log( + YGConfig* config, + YGNode* node, + YGLogLevel logLevel, + const char* format, + va_list args) { + logger_(config, node, logLevel, format, args); +} diff --git a/yoga/YGConfig.h b/yoga/YGConfig.h index 00415ce9..b4b2748b 100644 --- a/yoga/YGConfig.h +++ b/yoga/YGConfig.h @@ -10,17 +10,24 @@ #include "Yoga.h" struct YGConfig { - std::array()> - experimentalFeatures = {}; +private: + YGLogger logger_; + +public: bool useWebDefaults = false; bool useLegacyStretchBehaviour = false; bool shouldDiffLayoutWithoutLegacyStretchBehaviour = false; bool printTree = false; float pointScaleFactor = 1.0f; - YGLogger logger; YGCloneNodeFunc cloneNodeCallback = nullptr; + std::array()> + experimentalFeatures = {}; void* context = nullptr; YGMarkerCallbacks markerCallbacks = {nullptr, nullptr}; YGConfig(YGLogger logger); + void log(YGConfig*, YGNode*, YGLogLevel, const char*, va_list); + void setLogger(YGLogger logger) { + logger_ = logger; + } }; diff --git a/yoga/Yoga.cpp b/yoga/Yoga.cpp index 3b3208af..5dd7a816 100644 --- a/yoga/Yoga.cpp +++ b/yoga/Yoga.cpp @@ -4182,12 +4182,12 @@ void YGNodeCalculateLayout( void YGConfigSetLogger(const YGConfigRef config, YGLogger logger) { if (logger != nullptr) { - config->logger = logger; + config->setLogger(logger); } else { #ifdef ANDROID - config->logger = &YGAndroidLog; + config->setLogger(&YGAndroidLog); #else - config->logger = &YGDefaultLog; + config->setLogger(&YGDefaultLog); #endif } } diff --git a/yoga/log.cpp b/yoga/log.cpp index 256bd811..390c581f 100644 --- a/yoga/log.cpp +++ b/yoga/log.cpp @@ -24,7 +24,7 @@ void vlog( const char* format, va_list args) { YGConfig* logConfig = config != nullptr ? config : YGConfigGetDefault(); - logConfig->logger(logConfig, node, level, format, args); + logConfig->log(logConfig, node, level, format, args); if (level == YGLogLevelFatal) { abort();