@@ -43,6 +43,7 @@ int ini_parse(void);
43
43
#endif
44
44
45
45
#define ZEND_SYSTEM_INI CG (ini_parser_unbuffered_errors)
46
+ #define INI_ZVAL_IS_NUMBER 1
46
47
47
48
static int get_int_val (zval *op) {
48
49
switch (Z_TYPE_P (op)) {
@@ -92,8 +93,12 @@ static void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
92
93
break ;
93
94
}
94
95
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
+ }
97
102
}
98
103
/* }}} */
99
104
@@ -276,6 +281,41 @@ static void zval_ini_dtor(zval *zv)
276
281
}
277
282
/* }}} */
278
283
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
+
279
319
%}
280
320
281
321
%expect 0
@@ -351,7 +391,7 @@ section_string_or_value:
351
391
;
352
392
353
393
string_or_value:
354
- expr { $$ = $1; }
394
+ expr { $$ = $1; normalize_value(&$$); }
355
395
| BOOL_TRUE { $$ = $1; }
356
396
| BOOL_FALSE { $$ = $1; }
357
397
| NULL_NULL { $$ = $1; }
@@ -412,7 +452,11 @@ constant_literal:
412
452
constant_string:
413
453
TC_CONSTANT { zend_ini_get_constant(&$$, &$1); }
414
454
| 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
+ }
416
460
| TC_STRING { $$ = $1; /*printf("TC_STRING: ' %s ' \n", Z_STRVAL($1));*/ }
417
461
| TC_WHITESPACE { $$ = $1; /*printf("TC_WHITESPACE: ' %s ' \n", Z_STRVAL($1));*/ }
418
462
;
0 commit comments