Skip to content

Commit 87323af

Browse files
committed
ext/soap: Refactor implementation of SoapFault::__toString()
1 parent 563a873 commit 87323af

File tree

1 file changed

+45
-25
lines changed

1 file changed

+45
-25
lines changed

ext/soap/soap.c

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -703,41 +703,61 @@ PHP_METHOD(SoapFault, __construct)
703703
/* {{{ SoapFault constructor */
704704
PHP_METHOD(SoapFault, __toString)
705705
{
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;
711707

712708
if (zend_parse_parameters_none() == FAILURE) {
713709
RETURN_THROWS();
714710
}
715711

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;
721713

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+
}
724723

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);
730737

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+
);
734757

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);
739759

740-
RETVAL_STR(str);
760+
RETURN_NEW_STR(str);
741761
}
742762
/* }}} */
743763

0 commit comments

Comments
 (0)