@@ -703,41 +703,61 @@ PHP_METHOD(SoapFault, __construct)
703
703
/* {{{ SoapFault constructor */
704
704
PHP_METHOD (SoapFault , __toString )
705
705
{
706
- zval * faultcode , * faultstring , * file , * line , trace , rv1 , rv2 , rv3 , rv4 ;
707
- zend_string * str ;
708
- zval * this_ptr ;
709
- zend_string * faultcode_val , * faultstring_val , * file_val ;
710
- zend_long line_val ;
706
+ zval * line , rv1 , rv2 , rv3 , rv4 , rv5 ;
711
707
712
708
if (zend_parse_parameters_none () == FAILURE ) {
713
709
RETURN_THROWS ();
714
710
}
715
711
716
- this_ptr = ZEND_THIS ;
717
- faultcode = zend_read_property (soap_fault_class_entry , Z_OBJ_P (this_ptr ), "faultcode" , sizeof ("faultcode" )- 1 , 1 , & rv1 );
718
- faultstring = zend_read_property (soap_fault_class_entry , Z_OBJ_P (this_ptr ), "faultstring" , sizeof ("faultstring" )- 1 , 1 , & rv2 );
719
- file = zend_read_property_ex (soap_fault_class_entry , Z_OBJ_P (this_ptr ), ZSTR_KNOWN (ZEND_STR_FILE ), /* silent */ true, & rv3 );
720
- line = zend_read_property_ex (soap_fault_class_entry , Z_OBJ_P (this_ptr ), ZSTR_KNOWN (ZEND_STR_LINE ), /* silent */ true, & rv4 );
712
+ zval * this_ptr = ZEND_THIS ;
721
713
722
- zend_call_method_with_0_params (
723
- Z_OBJ_P (ZEND_THIS ), Z_OBJCE_P (ZEND_THIS ), NULL , "gettraceasstring" , & trace );
714
+ /* SoapFault uses typed properties */
715
+ const zval * faultcode = zend_read_property (soap_fault_class_entry , Z_OBJ_P (this_ptr ), "faultcode" , sizeof ("faultcode" )- 1 , /* silent */ true, & rv1 );
716
+ const zend_string * faultcode_val ;
717
+ if (UNEXPECTED (Z_TYPE_P (faultcode ) == IS_NULL )) {
718
+ faultcode_val = zend_empty_string ;
719
+ } else {
720
+ ZEND_ASSERT (Z_TYPE_P (faultcode ) == IS_STRING );
721
+ faultcode_val = Z_STR_P (faultcode );
722
+ }
724
723
725
- faultcode_val = zval_get_string (faultcode );
726
- faultstring_val = zval_get_string (faultstring );
727
- file_val = zval_get_string (file );
728
- line_val = zval_get_long (line );
729
- convert_to_string (& trace );
724
+ const zval * faultstring = zend_read_property (soap_fault_class_entry , Z_OBJ_P (this_ptr ), "faultstring" , sizeof ("faultstring" )- 1 , /* silent */ true, & rv2 );
725
+ const zend_string * faultstring_val ;
726
+ if (UNEXPECTED (Z_TYPE_P (faultstring ) == IS_NULL )) {
727
+ faultstring_val = zend_empty_string ;
728
+ } else {
729
+ ZEND_ASSERT (Z_TYPE_P (faultstring ) == IS_STRING );
730
+ faultstring_val = Z_STR_P (faultstring );
731
+ }
732
+
733
+ /* Exception uses typed properties */
734
+ const zval * file = zend_read_property_ex (soap_fault_class_entry , Z_OBJ_P (this_ptr ), ZSTR_KNOWN (ZEND_STR_FILE ), /* silent */ true, & rv3 );
735
+ ZEND_ASSERT (Z_TYPE_P (file ) == IS_STRING );
736
+ const zend_string * file_val = Z_STR_P (faultstring );
730
737
731
- str = strpprintf (0 , "SoapFault exception: [%s] %s in %s:" ZEND_LONG_FMT "\nStack trace:\n%s" ,
732
- ZSTR_VAL (faultcode_val ), ZSTR_VAL (faultstring_val ), ZSTR_VAL (file_val ), line_val ,
733
- Z_STRLEN (trace ) ? Z_STRVAL (trace ) : "#0 {main}\n" );
738
+ line = zend_read_property_ex (soap_fault_class_entry , Z_OBJ_P (this_ptr ), ZSTR_KNOWN (ZEND_STR_LINE ), /* silent */ true, & rv4 );
739
+ ZEND_ASSERT (Z_TYPE_P (line ) == IS_LONG );
740
+ zend_long line_val = Z_LVAL_P (line );
741
+
742
+ /* Grab private $trace property from base Exception class */
743
+ zval * trace = zend_read_property_ex (zend_ce_exception , Z_OBJ_P (this_ptr ), ZSTR_KNOWN (ZEND_STR_TRACE ), /* silent */ true, & rv5 );
744
+ ZEND_ASSERT (Z_TYPE_P (trace ) == IS_ARRAY );
745
+ zend_string * trace_str = zend_trace_to_string (Z_ARRVAL_P (trace ), /* include_main */ true);
746
+
747
+ size_t max_length = ZSTR_LEN (faultcode_val )
748
+ + ZSTR_LEN (faultstring_val )
749
+ + ZSTR_LEN (file_val )
750
+ + ZSTR_LEN (trace_str )
751
+ + sizeof ("9223372036854775807" )
752
+ + sizeof ("SoapFault exception: [] in :\nStack trace:\n" );
753
+ zend_string * str = strpprintf (max_length ,
754
+ "SoapFault exception: [%s] %s in %s:" ZEND_LONG_FMT "\nStack trace:\n%s" ,
755
+ ZSTR_VAL (faultcode_val ), ZSTR_VAL (faultstring_val ), ZSTR_VAL (file_val ), line_val , ZSTR_VAL (trace_str )
756
+ );
734
757
735
- zend_string_release_ex (file_val , 0 );
736
- zend_string_release_ex (faultstring_val , 0 );
737
- zend_string_release_ex (faultcode_val , 0 );
738
- zval_ptr_dtor (& trace );
758
+ zend_string_release (trace_str );
739
759
740
- RETVAL_STR (str );
760
+ RETURN_NEW_STR (str );
741
761
}
742
762
/* }}} */
743
763
0 commit comments