@@ -526,6 +526,31 @@ static void _build_trace_args(zval *arg, smart_str *str) /* {{{ */
526
526
}
527
527
/* }}} */
528
528
529
+ static void _build_trace_args_list (zval * tmp , smart_str * str ) /* {{{ */
530
+ {
531
+ if (Z_TYPE_P (tmp ) == IS_ARRAY ) {
532
+ size_t last_len = ZSTR_LEN (str -> s );
533
+ zend_string * name ;
534
+ zval * arg ;
535
+
536
+ ZEND_HASH_FOREACH_STR_KEY_VAL (Z_ARRVAL_P (tmp ), name , arg ) {
537
+ if (name ) {
538
+ smart_str_append (str , name );
539
+ smart_str_appends (str , ": " );
540
+ }
541
+ _build_trace_args (arg , str );
542
+ } ZEND_HASH_FOREACH_END ();
543
+
544
+ if (last_len != ZSTR_LEN (str -> s )) {
545
+ ZSTR_LEN (str -> s ) -= 2 ; /* remove last ', ' */
546
+ }
547
+ } else {
548
+ /* only happens w/ reflection abuse (Zend/tests/bug63762.phpt) */
549
+ zend_error (E_WARNING , "args element is not an array" );
550
+ }
551
+ }
552
+ /* }}} */
553
+
529
554
static void _build_trace_string (smart_str * str , HashTable * ht , uint32_t num ) /* {{{ */
530
555
{
531
556
zval * file , * tmp ;
@@ -563,25 +588,7 @@ static void _build_trace_string(smart_str *str, HashTable *ht, uint32_t num) /*
563
588
smart_str_appendc (str , '(' );
564
589
tmp = zend_hash_find_known_hash (ht , ZSTR_KNOWN (ZEND_STR_ARGS ));
565
590
if (tmp ) {
566
- if (Z_TYPE_P (tmp ) == IS_ARRAY ) {
567
- size_t last_len = ZSTR_LEN (str -> s );
568
- zend_string * name ;
569
- zval * arg ;
570
-
571
- ZEND_HASH_FOREACH_STR_KEY_VAL (Z_ARRVAL_P (tmp ), name , arg ) {
572
- if (name ) {
573
- smart_str_append (str , name );
574
- smart_str_appends (str , ": " );
575
- }
576
- _build_trace_args (arg , str );
577
- } ZEND_HASH_FOREACH_END ();
578
-
579
- if (last_len != ZSTR_LEN (str -> s )) {
580
- ZSTR_LEN (str -> s ) -= 2 ; /* remove last ', ' */
581
- }
582
- } else {
583
- zend_error (E_WARNING , "args element is not an array" );
584
- }
591
+ _build_trace_args_list (tmp , str );
585
592
}
586
593
smart_str_appends (str , ")\n" );
587
594
}
@@ -595,25 +602,7 @@ ZEND_API zend_string *zend_trace_function_args_to_string(HashTable *frame) {
595
602
596
603
tmp = zend_hash_find_known_hash (frame , ZSTR_KNOWN (ZEND_STR_ARGS ));
597
604
if (tmp ) {
598
- if (Z_TYPE_P (tmp ) == IS_ARRAY ) {
599
- size_t last_len = ZSTR_LEN (str .s );
600
- zend_string * name ;
601
- zval * arg ;
602
-
603
- ZEND_HASH_FOREACH_STR_KEY_VAL (Z_ARRVAL_P (tmp ), name , arg ) {
604
- if (name ) {
605
- smart_str_append (& str , name );
606
- smart_str_appends (& str , ": " );
607
- }
608
- _build_trace_args (arg , & str );
609
- } ZEND_HASH_FOREACH_END ();
610
-
611
- if (last_len != ZSTR_LEN (str .s )) {
612
- ZSTR_LEN (str .s ) -= 2 ; /* remove last ', ' */
613
- }
614
- } else {
615
- smart_str_appends (& str , "<<invalid argument array>>" );
616
- }
605
+ _build_trace_args_list (tmp , & str );
617
606
}
618
607
619
608
smart_str_0 (& str );
0 commit comments