Skip to content

Commit 8d5c3e6

Browse files
authored
Introduce %S modifier and use it (php#13168)
1 parent 055c886 commit 8d5c3e6

File tree

3 files changed

+20
-22
lines changed

3 files changed

+20
-22
lines changed

Zend/zend_exceptions.c

+9-16
Original file line numberDiff line numberDiff line change
@@ -681,9 +681,7 @@ ZEND_METHOD(Exception, __toString)
681681
}
682682

683683
if ((Z_OBJCE_P(exception) == zend_ce_type_error || Z_OBJCE_P(exception) == zend_ce_argument_count_error) && strstr(ZSTR_VAL(message), ", called in ")) {
684-
zval message_zv;
685-
ZVAL_STR(&message_zv, message);
686-
zend_string *real_message = zend_strpprintf_unchecked(0, "%Z and defined", &message_zv);
684+
zend_string *real_message = zend_strpprintf_unchecked(0, "%S and defined", message);
687685
zend_string_release_ex(message, 0);
688686
message = real_message;
689687
}
@@ -692,23 +690,19 @@ ZEND_METHOD(Exception, __toString)
692690
? zend_string_copy(Z_STR(trace))
693691
: ZSTR_INIT_LITERAL("#0 {main}\n", false);
694692

695-
zval name_zv, trace_zv, file_zv, prev_str_zv;
696-
ZVAL_STR(&name_zv, Z_OBJCE_P(exception)->name);
697-
ZVAL_STR(&trace_zv, tmp_trace);
698-
ZVAL_STR(&file_zv, file);
699-
ZVAL_STR(&prev_str_zv, prev_str);
693+
zend_string *name = Z_OBJCE_P(exception)->name;
700694

701695
if (ZSTR_LEN(message) > 0) {
702696
zval message_zv;
703697
ZVAL_STR(&message_zv, message);
704698

705-
str = zend_strpprintf_unchecked(0, "%Z: %Z in %Z:" ZEND_LONG_FMT "\nStack trace:\n%Z%s%Z",
706-
&name_zv, &message_zv, &file_zv, line,
707-
&trace_zv, ZSTR_LEN(prev_str) ? "\n\nNext " : "", &prev_str_zv);
699+
str = zend_strpprintf_unchecked(0, "%S: %S in %S:" ZEND_LONG_FMT "\nStack trace:\n%S%s%S",
700+
name, message, file, line,
701+
tmp_trace, ZSTR_LEN(prev_str) ? "\n\nNext " : "", prev_str);
708702
} else {
709-
str = zend_strpprintf_unchecked(0, "%Z in %Z:" ZEND_LONG_FMT "\nStack trace:\n%Z%s%Z",
710-
&name_zv, &file_zv, line,
711-
&trace_zv, ZSTR_LEN(prev_str) ? "\n\nNext " : "", &prev_str_zv);
703+
str = zend_strpprintf_unchecked(0, "%S in %S:" ZEND_LONG_FMT "\nStack trace:\n%S%s%S",
704+
name, file, line,
705+
tmp_trace, ZSTR_LEN(prev_str) ? "\n\nNext " : "", prev_str);
712706
}
713707
zend_string_release_ex(tmp_trace, false);
714708

@@ -951,10 +945,9 @@ ZEND_API ZEND_COLD zend_result zend_exception_error(zend_object *ex, int severit
951945
file = zval_get_string(GET_PROPERTY_SILENT(&exception, ZEND_STR_FILE));
952946
line = zval_get_long(GET_PROPERTY_SILENT(&exception, ZEND_STR_LINE));
953947

954-
ZVAL_STR(&tmp, str);
955948
zend_error_va(severity | E_DONT_BAIL,
956949
(file && ZSTR_LEN(file) > 0) ? file : NULL, line,
957-
"Uncaught %Z\n thrown", &tmp);
950+
"Uncaught %S\n thrown", str);
958951

959952
zend_string_release_ex(str, 0);
960953
zend_string_release_ex(file, 0);

main/main.c

+2-6
Original file line numberDiff line numberDiff line change
@@ -1361,9 +1361,7 @@ static ZEND_COLD void php_error_cb(int orig_type, zend_string *error_filename, c
13611361
php_printf("%s<br />\n<b>%s</b>: %s in <b>%s</b> on line <b>%" PRIu32 "</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, ZSTR_VAL(buf), ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string));
13621362
zend_string_free(buf);
13631363
} else {
1364-
zval tmp;
1365-
ZVAL_STR(&tmp, message);
1366-
php_printf_unchecked("%s<br />\n<b>%s</b>: %Z in <b>%s</b> on line <b>%" PRIu32 "</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, &tmp, ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string));
1364+
php_printf_unchecked("%s<br />\n<b>%s</b>: %S in <b>%s</b> on line <b>%" PRIu32 "</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, message, ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string));
13671365
}
13681366
} else {
13691367
/* 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
13771375
fflush(stderr);
13781376
#endif
13791377
} else {
1380-
zval tmp;
1381-
ZVAL_STR(&tmp, message);
1382-
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));
1378+
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));
13831379
}
13841380
}
13851381
}

main/spprintf.c

+9
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,15 @@ static void xbuf_format_converter(void *xbuf, bool is_char, const char *fmt, va_
371371
}
372372
break;
373373
}
374+
case 'S': {
375+
zend_string *str = va_arg(ap, zend_string*);
376+
s_len = ZSTR_LEN(str);
377+
s = ZSTR_VAL(str);
378+
if (adjust_precision && (size_t)precision < s_len) {
379+
s_len = precision;
380+
}
381+
break;
382+
}
374383
case 'u':
375384
switch(modifier) {
376385
default:

0 commit comments

Comments
 (0)