diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c
index d37648cfa92f6..da2ed2c12d4d9 100644
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@ -681,9 +681,7 @@ ZEND_METHOD(Exception, __toString)
}
if ((Z_OBJCE_P(exception) == zend_ce_type_error || Z_OBJCE_P(exception) == zend_ce_argument_count_error) && strstr(ZSTR_VAL(message), ", called in ")) {
- zval message_zv;
- ZVAL_STR(&message_zv, message);
- zend_string *real_message = zend_strpprintf_unchecked(0, "%Z and defined", &message_zv);
+ zend_string *real_message = zend_strpprintf_unchecked(0, "%S and defined", message);
zend_string_release_ex(message, 0);
message = real_message;
}
@@ -692,23 +690,19 @@ ZEND_METHOD(Exception, __toString)
? zend_string_copy(Z_STR(trace))
: ZSTR_INIT_LITERAL("#0 {main}\n", false);
- zval name_zv, trace_zv, file_zv, prev_str_zv;
- ZVAL_STR(&name_zv, Z_OBJCE_P(exception)->name);
- ZVAL_STR(&trace_zv, tmp_trace);
- ZVAL_STR(&file_zv, file);
- ZVAL_STR(&prev_str_zv, prev_str);
+ zend_string *name = Z_OBJCE_P(exception)->name;
if (ZSTR_LEN(message) > 0) {
zval message_zv;
ZVAL_STR(&message_zv, message);
- str = zend_strpprintf_unchecked(0, "%Z: %Z in %Z:" ZEND_LONG_FMT "\nStack trace:\n%Z%s%Z",
- &name_zv, &message_zv, &file_zv, line,
- &trace_zv, ZSTR_LEN(prev_str) ? "\n\nNext " : "", &prev_str_zv);
+ str = zend_strpprintf_unchecked(0, "%S: %S in %S:" ZEND_LONG_FMT "\nStack trace:\n%S%s%S",
+ name, message, file, line,
+ tmp_trace, ZSTR_LEN(prev_str) ? "\n\nNext " : "", prev_str);
} else {
- str = zend_strpprintf_unchecked(0, "%Z in %Z:" ZEND_LONG_FMT "\nStack trace:\n%Z%s%Z",
- &name_zv, &file_zv, line,
- &trace_zv, ZSTR_LEN(prev_str) ? "\n\nNext " : "", &prev_str_zv);
+ str = zend_strpprintf_unchecked(0, "%S in %S:" ZEND_LONG_FMT "\nStack trace:\n%S%s%S",
+ name, file, line,
+ tmp_trace, ZSTR_LEN(prev_str) ? "\n\nNext " : "", prev_str);
}
zend_string_release_ex(tmp_trace, false);
@@ -951,10 +945,9 @@ ZEND_API ZEND_COLD zend_result zend_exception_error(zend_object *ex, int severit
file = zval_get_string(GET_PROPERTY_SILENT(&exception, ZEND_STR_FILE));
line = zval_get_long(GET_PROPERTY_SILENT(&exception, ZEND_STR_LINE));
- ZVAL_STR(&tmp, str);
zend_error_va(severity | E_DONT_BAIL,
(file && ZSTR_LEN(file) > 0) ? file : NULL, line,
- "Uncaught %Z\n thrown", &tmp);
+ "Uncaught %S\n thrown", str);
zend_string_release_ex(str, 0);
zend_string_release_ex(file, 0);
diff --git a/main/main.c b/main/main.c
index fb68bd1b3dd39..6633689d85d1d 100644
--- a/main/main.c
+++ b/main/main.c
@@ -1361,9 +1361,7 @@ static ZEND_COLD void php_error_cb(int orig_type, zend_string *error_filename, c
php_printf("%s
\n%s: %s in %s on line %" PRIu32 "
\n%s", STR_PRINT(prepend_string), error_type_str, ZSTR_VAL(buf), ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string));
zend_string_free(buf);
} else {
- zval tmp;
- ZVAL_STR(&tmp, message);
- php_printf_unchecked("%s
\n%s: %Z in %s on line %" PRIu32 "
\n%s", STR_PRINT(prepend_string), error_type_str, &tmp, ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string));
+ php_printf_unchecked("%s
\n%s: %S in %s on line %" PRIu32 "
\n%s", STR_PRINT(prepend_string), error_type_str, message, ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string));
}
} else {
/* Write CLI/CGI errors to stderr if display_errors = "stderr" */
@@ -1377,9 +1375,7 @@ static ZEND_COLD void php_error_cb(int orig_type, zend_string *error_filename, c
fflush(stderr);
#endif
} else {
- zval tmp;
- ZVAL_STR(&tmp, message);
- php_printf_unchecked("%s\n%s: %Z in %s on line %" PRIu32 "\n%s", STR_PRINT(prepend_string), error_type_str, &tmp, ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string));
+ php_printf_unchecked("%s\n%s: %S in %s on line %" PRIu32 "\n%s", STR_PRINT(prepend_string), error_type_str, message, ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string));
}
}
}
diff --git a/main/spprintf.c b/main/spprintf.c
index 64bde33406073..f180ad31b3da9 100644
--- a/main/spprintf.c
+++ b/main/spprintf.c
@@ -371,6 +371,15 @@ static void xbuf_format_converter(void *xbuf, bool is_char, const char *fmt, va_
}
break;
}
+ case 'S': {
+ zend_string *str = va_arg(ap, zend_string*);
+ s_len = ZSTR_LEN(str);
+ s = ZSTR_VAL(str);
+ if (adjust_precision && (size_t)precision < s_len) {
+ s_len = precision;
+ }
+ break;
+ }
case 'u':
switch(modifier) {
default: