@@ -43,6 +43,7 @@ int ini_parse(void);
4343#endif
4444
4545#define ZEND_SYSTEM_INI CG (ini_parser_unbuffered_errors)
46+ #define INI_ZVAL_IS_NUMBER 1
4647
4748static int get_int_val (zval *op) {
4849 switch (Z_TYPE_P (op)) {
@@ -92,8 +93,12 @@ static void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
9293 break ;
9394 }
9495
95- str_len = sprintf (str_result, " %d" , i_result);
96- ZVAL_NEW_STR (result, zend_string_init (str_result, str_len, ZEND_SYSTEM_INI));
96+ if (INI_SCNG (scanner_mode) != ZEND_INI_SCANNER_TYPED) {
97+ str_len = sprintf (str_result, " %d" , i_result);
98+ ZVAL_NEW_STR (result, zend_string_init (str_result, str_len, ZEND_SYSTEM_INI));
99+ } else {
100+ ZVAL_LONG (result, i_result);
101+ }
97102}
98103/* }}} */
99104
@@ -276,6 +281,41 @@ static void zval_ini_dtor(zval *zv)
276281}
277282/* }}} */
278283
284+ static inline zend_result convert_to_number (zval *retval, const char *str, const int str_len)
285+ {
286+ uint8_t type;
287+ int overflow;
288+ zend_long lval;
289+ double dval;
290+
291+ if ((type = is_numeric_string_ex (str, str_len, &lval, &dval, 0 , &overflow, NULL )) != 0 ) {
292+ if (type == IS_LONG) {
293+ ZVAL_LONG (retval, lval);
294+ return SUCCESS;
295+ } else if (type == IS_DOUBLE && !overflow) {
296+ ZVAL_DOUBLE (retval, dval);
297+ return SUCCESS;
298+ }
299+ }
300+
301+ return FAILURE;
302+ }
303+
304+ static void normalize_value (zval *zv)
305+ {
306+ if (INI_SCNG (scanner_mode) != ZEND_INI_SCANNER_TYPED) {
307+ return ;
308+ }
309+
310+ if (Z_EXTRA_P (zv) == INI_ZVAL_IS_NUMBER && Z_TYPE_P (zv) == IS_STRING) {
311+ zval number_rv;
312+ if (convert_to_number (&number_rv, Z_STRVAL_P (zv), Z_STRLEN_P (zv)) == SUCCESS) {
313+ zval_ptr_dtor (zv);
314+ ZVAL_COPY_VALUE (zv, &number_rv);
315+ }
316+ }
317+ }
318+
279319%}
280320
281321%expect 0
@@ -351,7 +391,7 @@ section_string_or_value:
351391;
352392
353393string_or_value:
354- expr { $$ = $1; }
394+ expr { $$ = $1; normalize_value(&$$); }
355395 | BOOL_TRUE { $$ = $1; }
356396 | BOOL_FALSE { $$ = $1; }
357397 | NULL_NULL { $$ = $1; }
@@ -412,7 +452,11 @@ constant_literal:
412452constant_string:
413453 TC_CONSTANT { zend_ini_get_constant(&$$, &$1); }
414454 | TC_RAW { $$ = $1; /*printf("TC_RAW: ' %s ' \n", Z_STRVAL($1));*/ }
415- | TC_NUMBER { $$ = $1; /*printf("TC_NUMBER: ' %s ' \n", Z_STRVAL($1));*/ }
455+ | TC_NUMBER {
456+ $$ = $1;
457+ Z_EXTRA($$) = INI_ZVAL_IS_NUMBER;
458+ /*printf("TC_NUMBER: ' %s ' \n", Z_STRVAL($1));*/
459+ }
416460 | TC_STRING { $$ = $1; /*printf("TC_STRING: ' %s ' \n", Z_STRVAL($1));*/ }
417461 | TC_WHITESPACE { $$ = $1; /*printf("TC_WHITESPACE: ' %s ' \n", Z_STRVAL($1));*/ }
418462;
0 commit comments