@@ -1150,6 +1150,46 @@ void ddtrace_shutdown_span_sampling_limiter(void) {
1150
1150
zend_hash_destroy (& dd_span_sampling_limiters );
1151
1151
}
1152
1152
1153
+ // ParseBool returns the boolean value represented by the string.
1154
+ // It accepts 1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False.
1155
+ // Any other value returns -1.
1156
+ static zend_always_inline double strconv_parse_bool (zend_string * str ) {
1157
+ // See Go's strconv.ParseBool
1158
+ // https://cs.opensource.google/go/go/+/refs/tags/go1.21.5:src/strconv/atob.go;drc=1f137052e4a20dbd302f947b1cf34cdf4b427d65;l=10
1159
+ size_t len = ZSTR_LEN (str );
1160
+ if (len == 0 ) {
1161
+ return -1 ;
1162
+ }
1163
+
1164
+ char * s = ZSTR_VAL (str );
1165
+ switch (len ) {
1166
+ case 1 :
1167
+ switch (s [0 ]) {
1168
+ case '1' :
1169
+ case 't' :
1170
+ case 'T' :
1171
+ return 1 ;
1172
+ case '0' :
1173
+ case 'f' :
1174
+ case 'F' :
1175
+ return 0 ;
1176
+ }
1177
+ break ;
1178
+ case 4 :
1179
+ if (strcmp (s , "TRUE" ) == 0 || strcmp (s , "True" ) == 0 || strcmp (s , "true" ) == 0 ) {
1180
+ return 1 ;
1181
+ }
1182
+ break ;
1183
+ case 5 :
1184
+ if (strcmp (s , "FALSE" ) == 0 || strcmp (s , "False" ) == 0 || strcmp (s , "false" ) == 0 ) {
1185
+ return 0 ;
1186
+ }
1187
+ break ;
1188
+ }
1189
+
1190
+ return -1 ;
1191
+ }
1192
+
1153
1193
void ddtrace_serialize_span_to_array (ddtrace_span_data * span , zval * array ) {
1154
1194
bool is_root_span = span -> std .ce == ddtrace_ce_root_span_data ;
1155
1195
@@ -1273,12 +1313,17 @@ void ddtrace_serialize_span_to_array(ddtrace_span_data *span, zval *array) {
1273
1313
if (analytics_event ) {
1274
1314
zval analytics_event_as_double ;
1275
1315
if (Z_TYPE_P (analytics_event ) == IS_STRING ) {
1276
- ZVAL_DOUBLE (& analytics_event_as_double , zend_is_true (analytics_event )); // 'true' => 1.0, false => 0.0
1316
+ double parsed_analytics_event = strconv_parse_bool (Z_STR_P (analytics_event ));
1317
+ if (parsed_analytics_event >= 0 ) {
1318
+ ZVAL_DOUBLE (& analytics_event_as_double , parsed_analytics_event );
1319
+ zend_array * metrics = ddtrace_property_array (& span -> property_metrics );
1320
+ zend_hash_str_add_new (metrics , ZEND_STRL ("_dd1.sr.eausr" ), & analytics_event_as_double );
1321
+ }
1277
1322
} else {
1278
1323
ZVAL_DOUBLE (& analytics_event_as_double , zval_get_double (analytics_event ));
1324
+ zend_array * metrics = ddtrace_property_array (& span -> property_metrics );
1325
+ zend_hash_str_add_new (metrics , ZEND_STRL ("_dd1.sr.eausr" ), & analytics_event_as_double );
1279
1326
}
1280
- zend_array * metrics = ddtrace_property_array (& span -> property_metrics );
1281
- zend_hash_str_add_new (metrics , ZEND_STRL ("_dd1.sr.eausr" ), & analytics_event_as_double );
1282
1327
zend_hash_str_del (meta , ZEND_STRL ("analytics.event" ));
1283
1328
}
1284
1329
0 commit comments