Skip to content

Commit a731a23

Browse files
astreetFacebook Github Bot
authored and
Facebook Github Bot
committed
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
1 parent 33fb428 commit a731a23

File tree

3 files changed

+86
-43
lines changed

3 files changed

+86
-43
lines changed

React/CSSLayout/CSSLayout.c

+75-41
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,43 @@ static void _CSSNodeMarkDirty(const CSSNodeRef node);
104104

105105
#ifdef ANDROID
106106
#include <android/log.h>
107-
static int _csslayoutAndroidLog(const char *format, ...) {
108-
va_list args;
109-
va_start(args, format);
110-
const int result = __android_log_vprint(ANDROID_LOG_DEBUG, "css-layout", format, args);
111-
va_end(args);
107+
static int _csslayoutAndroidLog(CSSLogLevel level, const char *format, va_list args) {
108+
int androidLevel = CSSLogLevelDebug;
109+
switch (level) {
110+
case CSSLogLevelError:
111+
androidLevel = ANDROID_LOG_ERROR;
112+
break;
113+
case CSSLogLevelWarn:
114+
androidLevel = ANDROID_LOG_WARN;
115+
break;
116+
case CSSLogLevelInfo:
117+
androidLevel = ANDROID_LOG_INFO;
118+
break;
119+
case CSSLogLevelDebug:
120+
androidLevel = ANDROID_LOG_DEBUG;
121+
break;
122+
case CSSLogLevelVerbose:
123+
androidLevel = ANDROID_LOG_VERBOSE;
124+
break;
125+
}
126+
const int result = __android_log_vprint(androidLevel, "css-layout", format, args);
112127
return result;
113128
}
114129
static CSSLogger gLogger = &_csslayoutAndroidLog;
115130
#else
116-
static CSSLogger gLogger = &printf;
131+
static int _csslayoutDefaultLog(CSSLogLevel level, const char *format, va_list args) {
132+
switch (level) {
133+
case CSSLogLevelError:
134+
return vfprintf(stderr, format, args);
135+
case CSSLogLevelWarn:
136+
case CSSLogLevelInfo:
137+
case CSSLogLevelDebug:
138+
case CSSLogLevelVerbose:
139+
default:
140+
return vprintf(format, args);
141+
}
142+
}
143+
static CSSLogger gLogger = &_csslayoutDefaultLog;
117144
#endif
118145

119146
static inline float computedEdgeValue(const float edges[CSSEdgeCount],
@@ -446,19 +473,19 @@ static inline bool eq(const float a, const float b) {
446473

447474
static void indent(const uint32_t n) {
448475
for (uint32_t i = 0; i < n; i++) {
449-
gLogger(" ");
476+
CSSLog(CSSLogLevelDebug, " ");
450477
}
451478
}
452479

453480
static void printNumberIfNotZero(const char *str, const float number) {
454481
if (!eq(number, 0)) {
455-
gLogger("%s: %g, ", str, number);
482+
CSSLog(CSSLogLevelDebug, "%s: %g, ", str, number);
456483
}
457484
}
458485

459486
static void printNumberIfNotUndefined(const char *str, const float number) {
460487
if (!CSSValueIsUndefined(number)) {
461-
gLogger("%s: %g, ", str, number);
488+
CSSLog(CSSLogLevelDebug, "%s: %g, ", str, number);
462489
}
463490
}
464491

@@ -470,78 +497,78 @@ static void _CSSNodePrint(const CSSNodeRef node,
470497
const CSSPrintOptions options,
471498
const uint32_t level) {
472499
indent(level);
473-
gLogger("{");
500+
CSSLog(CSSLogLevelDebug, "{");
474501

475502
if (node->print) {
476503
node->print(node);
477504
}
478505

479506
if (options & CSSPrintOptionsLayout) {
480-
gLogger("layout: {");
481-
gLogger("width: %g, ", node->layout.dimensions[CSSDimensionWidth]);
482-
gLogger("height: %g, ", node->layout.dimensions[CSSDimensionHeight]);
483-
gLogger("top: %g, ", node->layout.position[CSSEdgeTop]);
484-
gLogger("left: %g", node->layout.position[CSSEdgeLeft]);
485-
gLogger("}, ");
507+
CSSLog(CSSLogLevelDebug, "layout: {");
508+
CSSLog(CSSLogLevelDebug, "width: %g, ", node->layout.dimensions[CSSDimensionWidth]);
509+
CSSLog(CSSLogLevelDebug, "height: %g, ", node->layout.dimensions[CSSDimensionHeight]);
510+
CSSLog(CSSLogLevelDebug, "top: %g, ", node->layout.position[CSSEdgeTop]);
511+
CSSLog(CSSLogLevelDebug, "left: %g", node->layout.position[CSSEdgeLeft]);
512+
CSSLog(CSSLogLevelDebug, "}, ");
486513
}
487514

488515
if (options & CSSPrintOptionsStyle) {
489516
if (node->style.flexDirection == CSSFlexDirectionColumn) {
490-
gLogger("flexDirection: 'column', ");
517+
CSSLog(CSSLogLevelDebug, "flexDirection: 'column', ");
491518
} else if (node->style.flexDirection == CSSFlexDirectionColumnReverse) {
492-
gLogger("flexDirection: 'column-reverse', ");
519+
CSSLog(CSSLogLevelDebug, "flexDirection: 'column-reverse', ");
493520
} else if (node->style.flexDirection == CSSFlexDirectionRow) {
494-
gLogger("flexDirection: 'row', ");
521+
CSSLog(CSSLogLevelDebug, "flexDirection: 'row', ");
495522
} else if (node->style.flexDirection == CSSFlexDirectionRowReverse) {
496-
gLogger("flexDirection: 'row-reverse', ");
523+
CSSLog(CSSLogLevelDebug, "flexDirection: 'row-reverse', ");
497524
}
498525

499526
if (node->style.justifyContent == CSSJustifyCenter) {
500-
gLogger("justifyContent: 'center', ");
527+
CSSLog(CSSLogLevelDebug, "justifyContent: 'center', ");
501528
} else if (node->style.justifyContent == CSSJustifyFlexEnd) {
502-
gLogger("justifyContent: 'flex-end', ");
529+
CSSLog(CSSLogLevelDebug, "justifyContent: 'flex-end', ");
503530
} else if (node->style.justifyContent == CSSJustifySpaceAround) {
504-
gLogger("justifyContent: 'space-around', ");
531+
CSSLog(CSSLogLevelDebug, "justifyContent: 'space-around', ");
505532
} else if (node->style.justifyContent == CSSJustifySpaceBetween) {
506-
gLogger("justifyContent: 'space-between', ");
533+
CSSLog(CSSLogLevelDebug, "justifyContent: 'space-between', ");
507534
}
508535

509536
if (node->style.alignItems == CSSAlignCenter) {
510-
gLogger("alignItems: 'center', ");
537+
CSSLog(CSSLogLevelDebug, "alignItems: 'center', ");
511538
} else if (node->style.alignItems == CSSAlignFlexEnd) {
512-
gLogger("alignItems: 'flex-end', ");
539+
CSSLog(CSSLogLevelDebug, "alignItems: 'flex-end', ");
513540
} else if (node->style.alignItems == CSSAlignStretch) {
514-
gLogger("alignItems: 'stretch', ");
541+
CSSLog(CSSLogLevelDebug, "alignItems: 'stretch', ");
515542
}
516543

517544
if (node->style.alignContent == CSSAlignCenter) {
518-
gLogger("alignContent: 'center', ");
545+
CSSLog(CSSLogLevelDebug, "alignContent: 'center', ");
519546
} else if (node->style.alignContent == CSSAlignFlexEnd) {
520-
gLogger("alignContent: 'flex-end', ");
547+
CSSLog(CSSLogLevelDebug, "alignContent: 'flex-end', ");
521548
} else if (node->style.alignContent == CSSAlignStretch) {
522-
gLogger("alignContent: 'stretch', ");
549+
CSSLog(CSSLogLevelDebug, "alignContent: 'stretch', ");
523550
}
524551

525552
if (node->style.alignSelf == CSSAlignFlexStart) {
526-
gLogger("alignSelf: 'flex-start', ");
553+
CSSLog(CSSLogLevelDebug, "alignSelf: 'flex-start', ");
527554
} else if (node->style.alignSelf == CSSAlignCenter) {
528-
gLogger("alignSelf: 'center', ");
555+
CSSLog(CSSLogLevelDebug, "alignSelf: 'center', ");
529556
} else if (node->style.alignSelf == CSSAlignFlexEnd) {
530-
gLogger("alignSelf: 'flex-end', ");
557+
CSSLog(CSSLogLevelDebug, "alignSelf: 'flex-end', ");
531558
} else if (node->style.alignSelf == CSSAlignStretch) {
532-
gLogger("alignSelf: 'stretch', ");
559+
CSSLog(CSSLogLevelDebug, "alignSelf: 'stretch', ");
533560
}
534561

535562
printNumberIfNotUndefined("flexGrow", CSSNodeStyleGetFlexGrow(node));
536563
printNumberIfNotUndefined("flexShrink", CSSNodeStyleGetFlexShrink(node));
537564
printNumberIfNotUndefined("flexBasis", CSSNodeStyleGetFlexBasis(node));
538565

539566
if (node->style.overflow == CSSOverflowHidden) {
540-
gLogger("overflow: 'hidden', ");
567+
CSSLog(CSSLogLevelDebug, "overflow: 'hidden', ");
541568
} else if (node->style.overflow == CSSOverflowVisible) {
542-
gLogger("overflow: 'visible', ");
569+
CSSLog(CSSLogLevelDebug, "overflow: 'visible', ");
543570
} else if (node->style.overflow == CSSOverflowScroll) {
544-
gLogger("overflow: 'scroll', ");
571+
CSSLog(CSSLogLevelDebug, "overflow: 'scroll', ");
545572
}
546573

547574
if (eqFour(node->style.margin)) {
@@ -590,7 +617,7 @@ static void _CSSNodePrint(const CSSNodeRef node,
590617
printNumberIfNotUndefined("minHeight", node->style.minDimensions[CSSDimensionHeight]);
591618

592619
if (node->style.positionType == CSSPositionTypeAbsolute) {
593-
gLogger("position: 'absolute', ");
620+
CSSLog(CSSLogLevelDebug, "position: 'absolute', ");
594621
}
595622

596623
printNumberIfNotUndefined("left",
@@ -605,14 +632,14 @@ static void _CSSNodePrint(const CSSNodeRef node,
605632

606633
const uint32_t childCount = CSSNodeListCount(node->children);
607634
if (options & CSSPrintOptionsChildren && childCount > 0) {
608-
gLogger("children: [\n");
635+
CSSLog(CSSLogLevelDebug, "children: [\n");
609636
for (uint32_t i = 0; i < childCount; i++) {
610637
_CSSNodePrint(CSSNodeGetChild(node, i), options, level + 1);
611638
}
612639
indent(level);
613-
gLogger("]},\n");
640+
CSSLog(CSSLogLevelDebug, "]},\n");
614641
} else {
615-
gLogger("},\n");
642+
CSSLog(CSSLogLevelDebug, "},\n");
616643
}
617644
}
618645

@@ -2441,6 +2468,13 @@ void CSSLayoutSetLogger(CSSLogger logger) {
24412468
gLogger = logger;
24422469
}
24432470

2471+
void CSSLog(CSSLogLevel level, const char *format, ...) {
2472+
va_list args;
2473+
va_start(args, format);
2474+
gLogger(level, format, args);
2475+
va_end(args);
2476+
}
2477+
24442478
#ifdef CSS_ASSERT_FAIL_ENABLED
24452479
static CSSAssertFailFunc gAssertFailFunc;
24462480

React/CSSLayout/CSSLayout.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,22 @@ typedef struct CSSSize {
115115
float height;
116116
} CSSSize;
117117

118+
typedef enum CSSLogLevel {
119+
CSSLogLevelError,
120+
CSSLogLevelWarn,
121+
CSSLogLevelInfo,
122+
CSSLogLevelDebug,
123+
CSSLogLevelVerbose,
124+
} CSSLogLevel;
125+
118126
typedef struct CSSNode *CSSNodeRef;
119127
typedef CSSSize (*CSSMeasureFunc)(CSSNodeRef node,
120128
float width,
121129
CSSMeasureMode widthMode,
122130
float height,
123131
CSSMeasureMode heightMode);
124132
typedef void (*CSSPrintFunc)(CSSNodeRef node);
125-
typedef int (*CSSLogger)(const char *format, ...);
133+
typedef int (*CSSLogger)(CSSLogLevel level, const char *format, va_list args);
126134

127135
#ifdef CSS_ASSERT_FAIL_ENABLED
128136
typedef void (*CSSAssertFailFunc)(const char *message);
@@ -232,6 +240,7 @@ CSS_NODE_LAYOUT_PROPERTY(float, Height);
232240
CSS_NODE_LAYOUT_PROPERTY(CSSDirection, Direction);
233241

234242
WIN_EXPORT void CSSLayoutSetLogger(CSSLogger logger);
243+
WIN_EXPORT void CSSLog(CSSLogLevel level, const char *message, ...);
235244

236245
#ifdef CSS_ASSERT_FAIL_ENABLED
237246
// Assert

React/CSSLayout/CSSMacros.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
#if CSS_ASSERT_FAIL_ENABLED
3737
#define CSS_ERROR_FUNC(message) CSSAssertFail(message)
3838
#else
39-
#define CSS_ERROR_FUNC(message) fprintf(stderr, "%s", message)
39+
#define CSS_ERROR_FUNC(message) CSSLog(CSSLogLevelError, "%s", message)
4040
#endif
4141

4242
#ifndef CSS_ASSERT

0 commit comments

Comments
 (0)