Permalink
Browse files

Update logging to support levels, print messages in Android logcat on…

… assertion failures

Summary: The goal of this diff is to have assertion failures show up as error logs on Android. To do this, I updated the logging API to take calls with log levels. We now have to pass around va_list unfortunately since you can't re-expand or pass along var-args to a subcall.

Reviewed By: emilsjolander

Differential Revision: D4140898

fbshipit-source-id: e0eb9a1f0b08a7d90a8233f66bb857d5b871b6ad
  • Loading branch information...
1 parent 33fb428 commit a731a23d91ca6df8dd6cc238784d0d4edeffcbb6 @astreet astreet committed with Facebook Github Bot Nov 9, 2016
Showing with 86 additions and 43 deletions.
  1. +75 −41 React/CSSLayout/CSSLayout.c
  2. +10 −1 React/CSSLayout/CSSLayout.h
  3. +1 −1 React/CSSLayout/CSSMacros.h
@@ -104,16 +104,43 @@ static void _CSSNodeMarkDirty(const CSSNodeRef node);
#ifdef ANDROID
#include <android/log.h>
-static int _csslayoutAndroidLog(const char *format, ...) {
- va_list args;
- va_start(args, format);
- const int result = __android_log_vprint(ANDROID_LOG_DEBUG, "css-layout", format, args);
- va_end(args);
+static int _csslayoutAndroidLog(CSSLogLevel level, const char *format, va_list args) {
+ int androidLevel = CSSLogLevelDebug;
+ switch (level) {
+ case CSSLogLevelError:
+ androidLevel = ANDROID_LOG_ERROR;
+ break;
+ case CSSLogLevelWarn:
+ androidLevel = ANDROID_LOG_WARN;
+ break;
+ case CSSLogLevelInfo:
+ androidLevel = ANDROID_LOG_INFO;
+ break;
+ case CSSLogLevelDebug:
+ androidLevel = ANDROID_LOG_DEBUG;
+ break;
+ case CSSLogLevelVerbose:
+ androidLevel = ANDROID_LOG_VERBOSE;
+ break;
+ }
+ const int result = __android_log_vprint(androidLevel, "css-layout", format, args);
return result;
}
static CSSLogger gLogger = &_csslayoutAndroidLog;
#else
-static CSSLogger gLogger = &printf;
+static int _csslayoutDefaultLog(CSSLogLevel level, const char *format, va_list args) {
+ switch (level) {
+ case CSSLogLevelError:
+ return vfprintf(stderr, format, args);
+ case CSSLogLevelWarn:
+ case CSSLogLevelInfo:
+ case CSSLogLevelDebug:
+ case CSSLogLevelVerbose:
+ default:
+ return vprintf(format, args);
+ }
+}
+static CSSLogger gLogger = &_csslayoutDefaultLog;
#endif
static inline float computedEdgeValue(const float edges[CSSEdgeCount],
@@ -446,19 +473,19 @@ static inline bool eq(const float a, const float b) {
static void indent(const uint32_t n) {
for (uint32_t i = 0; i < n; i++) {
- gLogger(" ");
+ CSSLog(CSSLogLevelDebug, " ");
}
}
static void printNumberIfNotZero(const char *str, const float number) {
if (!eq(number, 0)) {
- gLogger("%s: %g, ", str, number);
+ CSSLog(CSSLogLevelDebug, "%s: %g, ", str, number);
}
}
static void printNumberIfNotUndefined(const char *str, const float number) {
if (!CSSValueIsUndefined(number)) {
- gLogger("%s: %g, ", str, number);
+ CSSLog(CSSLogLevelDebug, "%s: %g, ", str, number);
}
}
@@ -470,78 +497,78 @@ static void _CSSNodePrint(const CSSNodeRef node,
const CSSPrintOptions options,
const uint32_t level) {
indent(level);
- gLogger("{");
+ CSSLog(CSSLogLevelDebug, "{");
if (node->print) {
node->print(node);
}
if (options & CSSPrintOptionsLayout) {
- gLogger("layout: {");
- gLogger("width: %g, ", node->layout.dimensions[CSSDimensionWidth]);
- gLogger("height: %g, ", node->layout.dimensions[CSSDimensionHeight]);
- gLogger("top: %g, ", node->layout.position[CSSEdgeTop]);
- gLogger("left: %g", node->layout.position[CSSEdgeLeft]);
- gLogger("}, ");
+ CSSLog(CSSLogLevelDebug, "layout: {");
+ CSSLog(CSSLogLevelDebug, "width: %g, ", node->layout.dimensions[CSSDimensionWidth]);
+ CSSLog(CSSLogLevelDebug, "height: %g, ", node->layout.dimensions[CSSDimensionHeight]);
+ CSSLog(CSSLogLevelDebug, "top: %g, ", node->layout.position[CSSEdgeTop]);
+ CSSLog(CSSLogLevelDebug, "left: %g", node->layout.position[CSSEdgeLeft]);
+ CSSLog(CSSLogLevelDebug, "}, ");
}
if (options & CSSPrintOptionsStyle) {
if (node->style.flexDirection == CSSFlexDirectionColumn) {
- gLogger("flexDirection: 'column', ");
+ CSSLog(CSSLogLevelDebug, "flexDirection: 'column', ");
} else if (node->style.flexDirection == CSSFlexDirectionColumnReverse) {
- gLogger("flexDirection: 'column-reverse', ");
+ CSSLog(CSSLogLevelDebug, "flexDirection: 'column-reverse', ");
} else if (node->style.flexDirection == CSSFlexDirectionRow) {
- gLogger("flexDirection: 'row', ");
+ CSSLog(CSSLogLevelDebug, "flexDirection: 'row', ");
} else if (node->style.flexDirection == CSSFlexDirectionRowReverse) {
- gLogger("flexDirection: 'row-reverse', ");
+ CSSLog(CSSLogLevelDebug, "flexDirection: 'row-reverse', ");
}
if (node->style.justifyContent == CSSJustifyCenter) {
- gLogger("justifyContent: 'center', ");
+ CSSLog(CSSLogLevelDebug, "justifyContent: 'center', ");
} else if (node->style.justifyContent == CSSJustifyFlexEnd) {
- gLogger("justifyContent: 'flex-end', ");
+ CSSLog(CSSLogLevelDebug, "justifyContent: 'flex-end', ");
} else if (node->style.justifyContent == CSSJustifySpaceAround) {
- gLogger("justifyContent: 'space-around', ");
+ CSSLog(CSSLogLevelDebug, "justifyContent: 'space-around', ");
} else if (node->style.justifyContent == CSSJustifySpaceBetween) {
- gLogger("justifyContent: 'space-between', ");
+ CSSLog(CSSLogLevelDebug, "justifyContent: 'space-between', ");
}
if (node->style.alignItems == CSSAlignCenter) {
- gLogger("alignItems: 'center', ");
+ CSSLog(CSSLogLevelDebug, "alignItems: 'center', ");
} else if (node->style.alignItems == CSSAlignFlexEnd) {
- gLogger("alignItems: 'flex-end', ");
+ CSSLog(CSSLogLevelDebug, "alignItems: 'flex-end', ");
} else if (node->style.alignItems == CSSAlignStretch) {
- gLogger("alignItems: 'stretch', ");
+ CSSLog(CSSLogLevelDebug, "alignItems: 'stretch', ");
}
if (node->style.alignContent == CSSAlignCenter) {
- gLogger("alignContent: 'center', ");
+ CSSLog(CSSLogLevelDebug, "alignContent: 'center', ");
} else if (node->style.alignContent == CSSAlignFlexEnd) {
- gLogger("alignContent: 'flex-end', ");
+ CSSLog(CSSLogLevelDebug, "alignContent: 'flex-end', ");
} else if (node->style.alignContent == CSSAlignStretch) {
- gLogger("alignContent: 'stretch', ");
+ CSSLog(CSSLogLevelDebug, "alignContent: 'stretch', ");
}
if (node->style.alignSelf == CSSAlignFlexStart) {
- gLogger("alignSelf: 'flex-start', ");
+ CSSLog(CSSLogLevelDebug, "alignSelf: 'flex-start', ");
} else if (node->style.alignSelf == CSSAlignCenter) {
- gLogger("alignSelf: 'center', ");
+ CSSLog(CSSLogLevelDebug, "alignSelf: 'center', ");
} else if (node->style.alignSelf == CSSAlignFlexEnd) {
- gLogger("alignSelf: 'flex-end', ");
+ CSSLog(CSSLogLevelDebug, "alignSelf: 'flex-end', ");
} else if (node->style.alignSelf == CSSAlignStretch) {
- gLogger("alignSelf: 'stretch', ");
+ CSSLog(CSSLogLevelDebug, "alignSelf: 'stretch', ");
}
printNumberIfNotUndefined("flexGrow", CSSNodeStyleGetFlexGrow(node));
printNumberIfNotUndefined("flexShrink", CSSNodeStyleGetFlexShrink(node));
printNumberIfNotUndefined("flexBasis", CSSNodeStyleGetFlexBasis(node));
if (node->style.overflow == CSSOverflowHidden) {
- gLogger("overflow: 'hidden', ");
+ CSSLog(CSSLogLevelDebug, "overflow: 'hidden', ");
} else if (node->style.overflow == CSSOverflowVisible) {
- gLogger("overflow: 'visible', ");
+ CSSLog(CSSLogLevelDebug, "overflow: 'visible', ");
} else if (node->style.overflow == CSSOverflowScroll) {
- gLogger("overflow: 'scroll', ");
+ CSSLog(CSSLogLevelDebug, "overflow: 'scroll', ");
}
if (eqFour(node->style.margin)) {
@@ -590,7 +617,7 @@ static void _CSSNodePrint(const CSSNodeRef node,
printNumberIfNotUndefined("minHeight", node->style.minDimensions[CSSDimensionHeight]);
if (node->style.positionType == CSSPositionTypeAbsolute) {
- gLogger("position: 'absolute', ");
+ CSSLog(CSSLogLevelDebug, "position: 'absolute', ");
}
printNumberIfNotUndefined("left",
@@ -605,14 +632,14 @@ static void _CSSNodePrint(const CSSNodeRef node,
const uint32_t childCount = CSSNodeListCount(node->children);
if (options & CSSPrintOptionsChildren && childCount > 0) {
- gLogger("children: [\n");
+ CSSLog(CSSLogLevelDebug, "children: [\n");
for (uint32_t i = 0; i < childCount; i++) {
_CSSNodePrint(CSSNodeGetChild(node, i), options, level + 1);
}
indent(level);
- gLogger("]},\n");
+ CSSLog(CSSLogLevelDebug, "]},\n");
} else {
- gLogger("},\n");
+ CSSLog(CSSLogLevelDebug, "},\n");
}
}
@@ -2441,6 +2468,13 @@ void CSSLayoutSetLogger(CSSLogger logger) {
gLogger = logger;
}
+void CSSLog(CSSLogLevel level, const char *format, ...) {
+ va_list args;
+ va_start(args, format);
+ gLogger(level, format, args);
+ va_end(args);
+}
+
#ifdef CSS_ASSERT_FAIL_ENABLED
static CSSAssertFailFunc gAssertFailFunc;
@@ -115,14 +115,22 @@ typedef struct CSSSize {
float height;
} CSSSize;
+typedef enum CSSLogLevel {
+ CSSLogLevelError,
+ CSSLogLevelWarn,
+ CSSLogLevelInfo,
+ CSSLogLevelDebug,
+ CSSLogLevelVerbose,
+} CSSLogLevel;
+
typedef struct CSSNode *CSSNodeRef;
typedef CSSSize (*CSSMeasureFunc)(CSSNodeRef node,
float width,
CSSMeasureMode widthMode,
float height,
CSSMeasureMode heightMode);
typedef void (*CSSPrintFunc)(CSSNodeRef node);
-typedef int (*CSSLogger)(const char *format, ...);
+typedef int (*CSSLogger)(CSSLogLevel level, const char *format, va_list args);
#ifdef CSS_ASSERT_FAIL_ENABLED
typedef void (*CSSAssertFailFunc)(const char *message);
@@ -232,6 +240,7 @@ CSS_NODE_LAYOUT_PROPERTY(float, Height);
CSS_NODE_LAYOUT_PROPERTY(CSSDirection, Direction);
WIN_EXPORT void CSSLayoutSetLogger(CSSLogger logger);
+WIN_EXPORT void CSSLog(CSSLogLevel level, const char *message, ...);
#ifdef CSS_ASSERT_FAIL_ENABLED
// Assert
@@ -36,7 +36,7 @@
#if CSS_ASSERT_FAIL_ENABLED
#define CSS_ERROR_FUNC(message) CSSAssertFail(message)
#else
-#define CSS_ERROR_FUNC(message) fprintf(stderr, "%s", message)
+#define CSS_ERROR_FUNC(message) CSSLog(CSSLogLevelError, "%s", message)
#endif
#ifndef CSS_ASSERT

0 comments on commit a731a23

Please sign in to comment.