Skip to content

Commit 9743246

Browse files
committed
Add json_last_error_msg() function
This replaces json_last_error(true) and is consistent with other custom error handling functions.
1 parent b025b9d commit 9743246

File tree

8 files changed

+51
-42
lines changed

8 files changed

+51
-42
lines changed

ext/json/json.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ static PHP_MINFO_FUNCTION(json);
3434
static PHP_FUNCTION(json_encode);
3535
static PHP_FUNCTION(json_decode);
3636
static PHP_FUNCTION(json_last_error);
37+
static PHP_FUNCTION(json_last_error_msg);
3738

3839
static const char digits[] = "0123456789abcdef";
3940

@@ -51,8 +52,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_json_decode, 0, 0, 1)
5152
ZEND_ARG_INFO(0, depth)
5253
ZEND_END_ARG_INFO()
5354

54-
ZEND_BEGIN_ARG_INFO_EX(arginfo_json_last_error, 0, 0, 0)
55-
ZEND_ARG_INFO(0, as_string)
55+
ZEND_BEGIN_ARG_INFO(arginfo_json_last_error, 0)
56+
ZEND_END_ARG_INFO()
57+
58+
ZEND_BEGIN_ARG_INFO(arginfo_json_last_error_msg, 0)
5659
ZEND_END_ARG_INFO()
5760
/* }}} */
5861

@@ -61,6 +64,7 @@ static const function_entry json_functions[] = {
6164
PHP_FE(json_encode, arginfo_json_encode)
6265
PHP_FE(json_decode, arginfo_json_decode)
6366
PHP_FE(json_last_error, arginfo_json_last_error)
67+
PHP_FE(json_last_error_msg, arginfo_json_last_error_msg)
6468
PHP_FE_END
6569
};
6670
/* }}} */
@@ -607,21 +611,25 @@ static PHP_FUNCTION(json_decode)
607611
/* }}} */
608612

609613
/* {{{ proto int json_last_error()
610-
Returns the error code of the last json_decode(). */
614+
Returns the error code of the last json_encode() or json_decode() call. */
611615
static PHP_FUNCTION(json_last_error)
612616
{
613-
zend_bool as_string = 0;
614-
615-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &as_string) == FAILURE) {
617+
if (zend_parse_parameters_none() == FAILURE) {
616618
return;
617619
}
618620

619-
/* return error code (JSON_ERROR_* constants) */
620-
if (!as_string) {
621-
RETURN_LONG(JSON_G(error_code));
621+
RETURN_LONG(JSON_G(error_code));
622+
}
623+
/* }}} */
624+
625+
/* {{{ proto string json_last_error_msg()
626+
Returns the error string of the last json_encode() or json_decode() call. */
627+
static PHP_FUNCTION(json_last_error_msg)
628+
{
629+
if (zend_parse_parameters_none() == FAILURE) {
630+
return;
622631
}
623632

624-
/* return error message (for debugging purposes) */
625633
switch(JSON_G(error_code)) {
626634
case PHP_JSON_ERROR_NONE:
627635
RETURN_STRING("No error", 1);
@@ -644,6 +652,7 @@ static PHP_FUNCTION(json_last_error)
644652
default:
645653
RETURN_STRING("Unknown error", 1);
646654
}
655+
647656
}
648657
/* }}} */
649658

ext/json/tests/003.phpt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@ var_dump($a);
1313
echo "\n";
1414

1515
var_dump(json_encode($a));
16-
var_dump(json_last_error());
17-
var_dump(json_last_error(true));
16+
var_dump(json_last_error(), json_last_error_msg());
1817

1918
echo "\n";
2019

2120
var_dump(json_encode($a, JSON_PARTIAL_OUTPUT_ON_ERROR));
22-
var_dump(json_last_error());
23-
var_dump(json_last_error(true));
21+
var_dump(json_last_error(), json_last_error_msg());
2422

2523
echo "Done\n";
2624
?>

ext/json/tests/004.phpt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@ var_dump($a);
1313
echo "\n";
1414

1515
var_dump(json_encode($a));
16-
var_dump(json_last_error());
17-
var_dump(json_last_error(true));
16+
var_dump(json_last_error(), json_last_error_msg());
1817

1918
echo "\n";
2019

2120
var_dump(json_encode($a, JSON_PARTIAL_OUTPUT_ON_ERROR));
22-
var_dump(json_last_error());
23-
var_dump(json_last_error(true));
21+
var_dump(json_last_error(), json_last_error_msg());
2422

2523
echo "Done\n";
2624
?>

ext/json/tests/007.phpt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ json_last_error() tests
55
--FILE--
66
<?php
77
var_dump(json_decode("[1]"));
8-
var_dump(json_last_error());
8+
var_dump(json_last_error(), json_last_error_msg());
99
var_dump(json_decode("[[1]]", false, 2));
10-
var_dump(json_last_error());
10+
var_dump(json_last_error(), json_last_error_msg());
1111
var_dump(json_decode("[1}"));
12-
var_dump(json_last_error());
12+
var_dump(json_last_error(), json_last_error_msg());
1313
var_dump(json_decode('["' . chr(0) . 'abcd"]'));
14-
var_dump(json_last_error());
14+
var_dump(json_last_error(), json_last_error_msg());
1515
var_dump(json_decode("[1"));
16-
var_dump(json_last_error());
16+
var_dump(json_last_error(), json_last_error_msg());
1717

1818

1919
echo "Done\n";
@@ -24,13 +24,17 @@ array(1) {
2424
int(1)
2525
}
2626
int(0)
27+
string(8) "No error"
2728
NULL
2829
int(1)
30+
string(28) "Maximum stack depth exceeded"
2931
NULL
3032
int(2)
33+
string(42) "State mismatch (invalid or malformed JSON)"
3134
NULL
3235
int(3)
36+
string(53) "Control character error, possibly incorrectly encoded"
3337
NULL
3438
int(4)
39+
string(12) "Syntax error"
3540
Done
36-

ext/json/tests/bug54058.phpt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,25 @@ Bug #54058 (json_last_error() invalid UTF-8 produces wrong error)
88
$bad_utf8 = quoted_printable_decode('=B0');
99

1010
json_encode($bad_utf8);
11-
var_dump(json_last_error());
12-
var_dump(json_last_error(true));
11+
var_dump(json_last_error(), json_last_error_msg());
1312

1413
$a = new stdclass;
1514
$a->foo = quoted_printable_decode('=B0');
1615
json_encode($a);
17-
var_dump(json_last_error());
18-
var_dump(json_last_error(true));
16+
var_dump(json_last_error(), json_last_error_msg());
1917

2018
$b = new stdclass;
2119
$b->foo = $bad_utf8;
2220
$b->bar = 1;
2321
json_encode($b);
24-
var_dump(json_last_error());
25-
var_dump(json_last_error(true));
22+
var_dump(json_last_error(), json_last_error_msg());
2623

2724
$c = array(
2825
'foo' => $bad_utf8,
2926
'bar' => 1
3027
);
3128
json_encode($c);
32-
var_dump(json_last_error());
33-
var_dump(json_last_error(true));
29+
var_dump(json_last_error(), json_last_error_msg());
3430

3531
?>
3632
--EXPECTF--

ext/json/tests/bug61537.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@ Bug #61537 (json_encode() incorrectly truncates/discards information)
77
$invalid_utf8 = "\x9f";
88

99
var_dump(json_encode($invalid_utf8));
10-
var_dump(json_last_error(), json_last_error(true));
10+
var_dump(json_last_error(), json_last_error_msg());
1111

1212
var_dump(json_encode($invalid_utf8, JSON_PARTIAL_OUTPUT_ON_ERROR));
13-
var_dump(json_last_error(), json_last_error(true));
13+
var_dump(json_last_error(), json_last_error_msg());
1414

1515
echo "\n";
1616

1717
$invalid_utf8 = "an invalid sequen\xce in the middle of a string";
1818

1919
var_dump(json_encode($invalid_utf8));
20-
var_dump(json_last_error(), json_last_error(true));
20+
var_dump(json_last_error(), json_last_error_msg());
2121

2222
var_dump(json_encode($invalid_utf8, JSON_PARTIAL_OUTPUT_ON_ERROR));
23-
var_dump(json_last_error(), json_last_error(true));
23+
var_dump(json_last_error(), json_last_error_msg());
2424

2525
?>
2626
--EXPECTF--

ext/json/tests/inf_nan_error.phpt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
--TEST--
22
An error is thrown when INF or NaN are encoded
3+
--SKIPIF--
4+
<?php if (!extension_loaded("json")) print "skip"; ?>
35
--FILE--
46
<?php
57

@@ -8,10 +10,10 @@ $inf = INF;
810
var_dump($inf);
911

1012
var_dump(json_encode($inf));
11-
var_dump(json_last_error(), json_last_error(true));
13+
var_dump(json_last_error(), json_last_error_msg());
1214

1315
var_dump(json_encode($inf, JSON_PARTIAL_OUTPUT_ON_ERROR));
14-
var_dump(json_last_error(), json_last_error(true));
16+
var_dump(json_last_error(), json_last_error_msg());
1517

1618
echo "\n";
1719

@@ -20,10 +22,10 @@ $nan = NAN;
2022
var_dump($nan);
2123

2224
var_dump(json_encode($nan));
23-
var_dump(json_last_error(), json_last_error(true));
25+
var_dump(json_last_error(), json_last_error_msg());
2426

2527
var_dump(json_encode($nan, JSON_PARTIAL_OUTPUT_ON_ERROR));
26-
var_dump(json_last_error(), json_last_error(true));
28+
var_dump(json_last_error(), json_last_error_msg());
2729
?>
2830
--EXPECTF--
2931
float(INF)

ext/json/tests/unsupported_type_error.phpt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
--TEST--
22
An error is thrown when an unsupported type is encoded
3+
--SKIPIF--
4+
<?php if (!extension_loaded("json")) print "skip"; ?>
35
--FILE--
46
<?php
57

@@ -8,10 +10,10 @@ $resource = fopen(__FILE__, "r");
810
var_dump($resource);
911

1012
var_dump(json_encode($resource));
11-
var_dump(json_last_error(), json_last_error(true));
13+
var_dump(json_last_error(), json_last_error_msg());
1214

1315
var_dump(json_encode($resource, JSON_PARTIAL_OUTPUT_ON_ERROR));
14-
var_dump(json_last_error(), json_last_error(true));
16+
var_dump(json_last_error(), json_last_error_msg());
1517

1618
?>
1719
--EXPECTF--

0 commit comments

Comments
 (0)