Skip to content

Commit 85a98d3

Browse files
committed
Promote warnings to exceptions in ext/gettext, ext/sysvmsg and ext/xml
1 parent 79981a3 commit 85a98d3

13 files changed

+102
-93
lines changed

ext/gettext/gettext.c

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@ ZEND_GET_MODULE(php_gettext)
4949
#define PHP_GETTEXT_MAX_DOMAIN_LENGTH 1024
5050
#define PHP_GETTEXT_MAX_MSGID_LENGTH 4096
5151

52-
#define PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len) \
52+
#define PHP_GETTEXT_DOMAIN_LENGTH_CHECK(_arg_num, domain_len) \
5353
if (UNEXPECTED(domain_len > PHP_GETTEXT_MAX_DOMAIN_LENGTH)) { \
54-
php_error_docref(NULL, E_WARNING, "Domain passed too long"); \
55-
RETURN_FALSE; \
54+
zend_argument_value_error(_arg_num, "is too long"); \
55+
RETURN_THROWS(); \
5656
}
5757

58-
#define PHP_GETTEXT_LENGTH_CHECK(check_name, check_len) \
58+
#define PHP_GETTEXT_LENGTH_CHECK(_arg_num, check_len) \
5959
if (UNEXPECTED(check_len > PHP_GETTEXT_MAX_MSGID_LENGTH)) { \
60-
php_error_docref(NULL, E_WARNING, "%s passed too long", check_name); \
61-
RETURN_FALSE; \
60+
zend_argument_value_error(_arg_num, "is too long"); \
61+
RETURN_THROWS(); \
6262
}
6363

6464
PHP_MINFO_FUNCTION(php_gettext)
@@ -78,7 +78,7 @@ PHP_FUNCTION(textdomain)
7878
RETURN_THROWS();
7979
}
8080

81-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len)
81+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(2, domain_len)
8282

8383
if (domain != NULL && strcmp(domain, "") && strcmp(domain, "0")) {
8484
domain_name = domain;
@@ -102,7 +102,7 @@ PHP_FUNCTION(gettext)
102102
Z_PARAM_STR(msgid)
103103
ZEND_PARSE_PARAMETERS_END();
104104

105-
PHP_GETTEXT_LENGTH_CHECK("msgid", ZSTR_LEN(msgid))
105+
PHP_GETTEXT_LENGTH_CHECK(1, ZSTR_LEN(msgid))
106106
msgstr = gettext(ZSTR_VAL(msgid));
107107

108108
if (msgstr != ZSTR_VAL(msgid)) {
@@ -123,8 +123,8 @@ PHP_FUNCTION(dgettext)
123123
RETURN_THROWS();
124124
}
125125

126-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(ZSTR_LEN(domain))
127-
PHP_GETTEXT_LENGTH_CHECK("msgid", ZSTR_LEN(msgid))
126+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, ZSTR_LEN(domain))
127+
PHP_GETTEXT_LENGTH_CHECK(2, ZSTR_LEN(msgid))
128128

129129
msgstr = dgettext(ZSTR_VAL(domain), ZSTR_VAL(msgid));
130130

@@ -147,8 +147,8 @@ PHP_FUNCTION(dcgettext)
147147
RETURN_THROWS();
148148
}
149149

150-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(ZSTR_LEN(domain))
151-
PHP_GETTEXT_LENGTH_CHECK("msgid", ZSTR_LEN(msgid))
150+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, ZSTR_LEN(domain))
151+
PHP_GETTEXT_LENGTH_CHECK(2, ZSTR_LEN(msgid))
152152

153153
msgstr = dcgettext(ZSTR_VAL(domain), ZSTR_VAL(msgid), category);
154154

@@ -171,11 +171,11 @@ PHP_FUNCTION(bindtextdomain)
171171
RETURN_THROWS();
172172
}
173173

174-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len)
174+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len)
175175

176176
if (domain[0] == '\0') {
177-
php_error(E_WARNING, "The first parameter of bindtextdomain must not be empty");
178-
RETURN_FALSE;
177+
zend_argument_value_error(1, "cannot be empty");
178+
RETURN_THROWS();
179179
}
180180

181181
if (dir[0] != '\0' && strcmp(dir, "0")) {
@@ -204,8 +204,8 @@ PHP_FUNCTION(ngettext)
204204
RETURN_THROWS();
205205
}
206206

207-
PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len)
208-
PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len)
207+
PHP_GETTEXT_LENGTH_CHECK(1, msgid1_len)
208+
PHP_GETTEXT_LENGTH_CHECK(2, msgid2_len)
209209

210210
msgstr = ngettext(msgid1, msgid2, count);
211211

@@ -228,9 +228,9 @@ PHP_FUNCTION(dngettext)
228228
RETURN_THROWS();
229229
}
230230

231-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len)
232-
PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len)
233-
PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len)
231+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len)
232+
PHP_GETTEXT_LENGTH_CHECK(2, msgid1_len)
233+
PHP_GETTEXT_LENGTH_CHECK(3, msgid2_len)
234234

235235
msgstr = dngettext(domain, msgid1, msgid2, count);
236236

@@ -255,9 +255,9 @@ PHP_FUNCTION(dcngettext)
255255
RETURN_THROWS();
256256
}
257257

258-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len)
259-
PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len)
260-
PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len)
258+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len)
259+
PHP_GETTEXT_LENGTH_CHECK(2, msgid1_len)
260+
PHP_GETTEXT_LENGTH_CHECK(3, msgid2_len)
261261

262262
msgstr = dcngettext(domain, msgid1, msgid2, count, category);
263263

@@ -279,7 +279,7 @@ PHP_FUNCTION(bind_textdomain_codeset)
279279
RETURN_THROWS();
280280
}
281281

282-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len)
282+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len)
283283

284284
retval = bind_textdomain_codeset(domain, codeset);
285285

ext/gettext/gettext.stub.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,29 @@
22

33
/** @generate-function-entries */
44

5-
function textdomain(?string $domain): string|false {}
5+
function textdomain(?string $domain): string {}
66

7-
function gettext(string $msgid): string|false {}
7+
function gettext(string $msgid): string {}
88

99
/** @alias gettext */
10-
function _(string $msgid): string|false {}
10+
function _(string $msgid): string {}
1111

12-
function dgettext(string $domain_name, string $msgid): string|false {}
12+
function dgettext(string $domain, string $msgid): string {}
1313

14-
function dcgettext(string $domain_name, string $msgid, int $category): string|false {}
14+
function dcgettext(string $domain, string $msgid, int $category): string {}
1515

16-
function bindtextdomain(string $domain_name, string $dir): string|false {}
16+
function bindtextdomain(string $domain, string $dir): string|false {}
1717

1818
#ifdef HAVE_NGETTEXT
19-
function ngettext(string $msgid1, string $msgid2, int $n): string|false {}
19+
function ngettext(string $msgid1, string $msgid2, int $n): string {}
2020
#endif
2121

2222
#ifdef HAVE_DNGETTEXT
23-
function dngettext(string $domain, string $msgid1, string $msgid2, int $count): string|false {}
23+
function dngettext(string $domain, string $msgid1, string $msgid2, int $count): string {}
2424
#endif
2525

2626
#ifdef HAVE_DCNGETTEXT
27-
function dcngettext(string $domain, string $msgid1, string $msgid2, int $count, int $category): string|false {}
27+
function dcngettext(string $domain, string $msgid1, string $msgid2, int $count, int $category): string {}
2828
#endif
2929

3030
#ifdef HAVE_BIND_TEXTDOMAIN_CODESET

ext/gettext/gettext_arginfo.h

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,42 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 29c84ba2a2aa940baec3bd32503fc7c8e67885fe */
2+
* Stub hash: a8b64ae24724f0552a62cd4146f6cfb3cd75fa19 */
33

4-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_textdomain, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
4+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_textdomain, 0, 1, IS_STRING, 0)
55
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 1)
66
ZEND_END_ARG_INFO()
77

8-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gettext, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
8+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gettext, 0, 1, IS_STRING, 0)
99
ZEND_ARG_TYPE_INFO(0, msgid, IS_STRING, 0)
1010
ZEND_END_ARG_INFO()
1111

1212
#define arginfo__ arginfo_gettext
1313

14-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dgettext, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
15-
ZEND_ARG_TYPE_INFO(0, domain_name, IS_STRING, 0)
14+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dgettext, 0, 2, IS_STRING, 0)
15+
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 0)
1616
ZEND_ARG_TYPE_INFO(0, msgid, IS_STRING, 0)
1717
ZEND_END_ARG_INFO()
1818

19-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dcgettext, 0, 3, MAY_BE_STRING|MAY_BE_FALSE)
20-
ZEND_ARG_TYPE_INFO(0, domain_name, IS_STRING, 0)
19+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dcgettext, 0, 3, IS_STRING, 0)
20+
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 0)
2121
ZEND_ARG_TYPE_INFO(0, msgid, IS_STRING, 0)
2222
ZEND_ARG_TYPE_INFO(0, category, IS_LONG, 0)
2323
ZEND_END_ARG_INFO()
2424

2525
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_bindtextdomain, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
26-
ZEND_ARG_TYPE_INFO(0, domain_name, IS_STRING, 0)
26+
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 0)
2727
ZEND_ARG_TYPE_INFO(0, dir, IS_STRING, 0)
2828
ZEND_END_ARG_INFO()
2929

3030
#if defined(HAVE_NGETTEXT)
31-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ngettext, 0, 3, MAY_BE_STRING|MAY_BE_FALSE)
31+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ngettext, 0, 3, IS_STRING, 0)
3232
ZEND_ARG_TYPE_INFO(0, msgid1, IS_STRING, 0)
3333
ZEND_ARG_TYPE_INFO(0, msgid2, IS_STRING, 0)
3434
ZEND_ARG_TYPE_INFO(0, n, IS_LONG, 0)
3535
ZEND_END_ARG_INFO()
3636
#endif
3737

3838
#if defined(HAVE_DNGETTEXT)
39-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dngettext, 0, 4, MAY_BE_STRING|MAY_BE_FALSE)
39+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dngettext, 0, 4, IS_STRING, 0)
4040
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 0)
4141
ZEND_ARG_TYPE_INFO(0, msgid1, IS_STRING, 0)
4242
ZEND_ARG_TYPE_INFO(0, msgid2, IS_STRING, 0)
@@ -45,7 +45,7 @@ ZEND_END_ARG_INFO()
4545
#endif
4646

4747
#if defined(HAVE_DCNGETTEXT)
48-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dcngettext, 0, 5, MAY_BE_STRING|MAY_BE_FALSE)
48+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dcngettext, 0, 5, IS_STRING, 0)
4949
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 0)
5050
ZEND_ARG_TYPE_INFO(0, msgid1, IS_STRING, 0)
5151
ZEND_ARG_TYPE_INFO(0, msgid2, IS_STRING, 0)

ext/ldap/ldap_arginfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 9ecb7515850d95a20199b3c52aaccb8b2b04e0cd */
2+
* Stub hash: fb889b72e823f3033a54209059f8c6803961cef3 */
33

44
#if defined(HAVE_ORALDAP)
55
ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_connect, 0, 0, 0)

ext/sysvmsg/sysvmsg.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,8 @@ PHP_FUNCTION(msg_receive)
295295
}
296296

297297
if (maxsize <= 0) {
298-
php_error_docref(NULL, E_WARNING, "Maximum size of the message has to be greater than zero");
299-
return;
298+
zend_argument_value_error(4, "must be greater than 0");
299+
RETURN_THROWS();
300300
}
301301

302302
if (flags != 0) {
@@ -399,7 +399,6 @@ PHP_FUNCTION(msg_send)
399399
p = Z_STRVAL_P(message);
400400
message_len = Z_STRLEN_P(message);
401401
break;
402-
403402
case IS_LONG:
404403
message_len = spprintf(&p, 0, ZEND_LONG_FMT, Z_LVAL_P(message));
405404
break;
@@ -412,9 +411,10 @@ PHP_FUNCTION(msg_send)
412411
case IS_DOUBLE:
413412
message_len = spprintf(&p, 0, "%F", Z_DVAL_P(message));
414413
break;
414+
415415
default:
416-
php_error_docref(NULL, E_WARNING, "Message parameter must be either a string or a number.");
417-
RETURN_FALSE;
416+
zend_argument_type_error(3, "must be of type string|int|float|bool, %s given", zend_zval_type_name(message));
417+
RETURN_THROWS();
418418
}
419419

420420
messagebuffer = safe_emalloc(message_len, 1, sizeof(struct php_msgbuf));

ext/sysvmsg/tests/005.phpt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,12 @@ foreach ($tests as $i => $q) {
2727

2828
var_dump(msg_receive($q, 0, $null, 1, $msg, true, 0, $errno));
2929
var_dump($errno != 0);
30-
// again, but triggering an E_WARNING
31-
var_dump(msg_receive($q, 0, $null, 0, $msg));
30+
// again, but triggering an exception
31+
try {
32+
msg_receive($q, 0, $null, 0, $msg);
33+
} catch (ValueError $exception) {
34+
echo $exception->getMessage() . "\n";
35+
}
3236

3337
var_dump(msg_send($q, 1, 'foo', true, true, $errno));
3438
var_dump($errno != 0);
@@ -42,9 +46,7 @@ bool(false)
4246
bool(false)
4347
bool(false)
4448
bool(true)
45-
46-
Warning: msg_receive(): Maximum size of the message has to be greater than zero in %s on line %d
47-
bool(false)
49+
msg_receive(): Argument #4 ($maxsize) must be greater than 0
4850

4951
Warning: msg_send(): msgsnd failed: Invalid argument in %s on line %d
5052
bool(false)
@@ -54,9 +56,7 @@ bool(false)
5456
bool(false)
5557
bool(false)
5658
bool(true)
57-
58-
Warning: msg_receive(): Maximum size of the message has to be greater than zero in %s on line %d
59-
bool(false)
59+
msg_receive(): Argument #4 ($maxsize) must be greater than 0
6060

6161
Warning: msg_send(): msgsnd failed: Invalid argument in %s on line %d
6262
bool(false)

ext/sysvmsg/tests/006.phpt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ $tests = array('foo', 123, PHP_INT_MAX +1, true, 1.01, null, array('bar'));
1111

1212
foreach ($tests as $elem) {
1313
echo @"Sending/receiving '$elem':\n";
14-
var_dump(msg_send($queue, 1, $elem, false));
14+
try {
15+
var_dump(msg_send($queue, 1, $elem, false));
16+
} catch (TypeError $exception) {
17+
echo $exception->getMessage() . "\n";
18+
}
1519

1620
unset($msg);
1721
var_dump(msg_receive($queue, 1, $msg_type, 1024, $msg, false, MSG_IPC_NOWAIT));
@@ -53,15 +57,13 @@ bool(true)
5357
bool(true)
5458
bool(false)
5559
Sending/receiving '':
56-
57-
Warning: msg_send(): Message parameter must be either a string or a number. in %s on line %d
60+
msg_send(): Argument #3 ($message) must be of type string|int|float|bool, null given
5861
bool(false)
5962
bool(false)
6063
bool(true)
6164
bool(false)
6265
Sending/receiving 'Array':
63-
64-
Warning: msg_send(): Message parameter must be either a string or a number. in %s on line %d
66+
msg_send(): Argument #3 ($message) must be of type string|int|float|bool, array given
6567
bool(false)
6668
bool(false)
6769
bool(false)

ext/xml/tests/xml_parser_get_option_variation4.phpt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ if (!extension_loaded('xml')) {
1111

1212
$xmlParser = xml_parser_create();
1313

14-
var_dump(xml_parser_get_option ($xmlParser, 42));
14+
try {
15+
xml_parser_get_option ($xmlParser, 42);
16+
} catch (ValueError $exception) {
17+
echo $exception->getMessage() . "\n";
18+
}
1519

1620
?>
17-
--EXPECTF--
18-
Warning: xml_parser_get_option(): Unknown option in %s on line %d
19-
bool(false)
21+
--EXPECT--
22+
xml_parser_get_option(): Argument #2 ($option) must be one of PHP_XML_OPTION_CASE_FOLDING, PHP_XML_OPTION_SKIP_TAGSTART, PHP_XML_OPTION_SKIP_WHITE, PHP_XML_OPTION_TARGET_ENCODING

ext/xml/tests/xml_parser_set_option_variation4.phpt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@ if (!extension_loaded("xml")) {
1515
$xmlParser = xml_parser_create();
1616

1717
var_dump(xml_parser_set_option($xmlParser, XML_OPTION_SKIP_WHITE, 1));
18-
var_dump(xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, 'Invalid Encoding'));
18+
19+
try {
20+
var_dump(xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, 'Invalid Encoding'));
21+
} catch (ValueError $exception) {
22+
echo $exception->getMessage() . "\n";
23+
}
1924

2025
?>
21-
--EXPECTF--
26+
--EXPECT--
2227
bool(true)
2328

24-
Warning: xml_parser_set_option(): Unsupported target encoding "Invalid Encoding" in %s on line %d
25-
bool(false)
29+
xml_parser_get_option(): Argument #2 ($option) must be one of PHP_XML_OPTION_CASE_FOLDING, PHP_XML_OPTION_SKIP_TAGSTART, PHP_XML_OPTION_SKIP_WHITE, PHP_XML_OPTION_TARGET_ENCODING

ext/xml/tests/xml_parser_set_option_variation5.phpt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ if (!extension_loaded('xml')) {
1111

1212
$xmlParser = xml_parser_create();
1313

14-
var_dump(xml_parser_set_option($xmlParser, 42, 1));
14+
try {
15+
xml_parser_set_option($xmlParser, 42, 1);
16+
} catch (ValueError $exception) {
17+
echo $exception->getMessage() . "\n";
18+
}
1519

1620
?>
17-
--EXPECTF--
18-
Warning: xml_parser_set_option(): Unknown option in %s on line %d
19-
bool(false)
21+
--EXPECT--
22+
xml_parser_get_option(): Argument #2 ($option) must be one of PHP_XML_OPTION_CASE_FOLDING, PHP_XML_OPTION_SKIP_TAGSTART, PHP_XML_OPTION_SKIP_WHITE, PHP_XML_OPTION_TARGET_ENCODING

0 commit comments

Comments
 (0)