summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYasuo Ohgaki <yohgaki@ohgaki.net>2015-08-05 14:36:37 +0900
committerJakub Zelenka <bukka@php.net>2016-06-26 13:26:43 +0100
commit3aa2aadcf0c39d7d22532c46d8921f443d27166f (patch)
treebc11f20aee95df13fb78072ddb85c53127e05121
parentf943daf2d7eeed98d3ead5c05637c2ea8a2ff0e6 (diff)
downloadphp-git-3aa2aadcf0c39d7d22532c46d8921f443d27166f.tar.gz
Add JSON_G(precision)
-rw-r--r--ext/json/json.c39
-rw-r--r--ext/json/json_encoder.c4
-rw-r--r--ext/json/php_json.h1
3 files changed, 41 insertions, 3 deletions
diff --git a/ext/json/json.c b/ext/json/json.c
index d3c6111d4d..0cfffe8b66 100644
--- a/ext/json/json.c
+++ b/ext/json/json.c
@@ -93,6 +93,31 @@ static const zend_function_entry json_serializable_interface[] = {
};
/* }}} */
+
+/* {{{ PHP_INI_MH
+ */
+static PHP_INI_MH(OnSetJsonPrecision)
+{
+ zend_long i;
+
+ ZEND_ATOL(i, ZSTR_VAL(new_value));
+ if (i >= -1) {
+ JSON_G(precision) = i;
+ return SUCCESS;
+ } else {
+ return FAILURE;
+ }
+}
+/* }}} */
+
+
+/* {{{ PHP_INI
+ */
+PHP_INI_BEGIN()
+STD_PHP_INI_ENTRY("json.precision", "-1", PHP_INI_ALL, OnSetJsonPrecision, precision, zend_json_globals, json_globals)
+PHP_INI_END()
+/* }}} */
+
/* Register constant for options and errors */
#define PHP_JSON_REGISTER_CONSTANT(_name, _value) \
REGISTER_LONG_CONSTANT(_name, _value, CONST_CS | CONST_PERSISTENT);
@@ -102,6 +127,8 @@ static PHP_MINIT_FUNCTION(json)
{
zend_class_entry ce;
+ REGISTER_INI_ENTRIES();
+
INIT_CLASS_ENTRY(ce, "JsonSerializable", json_serializable_interface);
php_json_serializable_ce = zend_register_internal_interface(&ce);
@@ -153,6 +180,16 @@ static PHP_GINIT_FUNCTION(json)
}
/* }}} */
+/* {{{ PHP_MSHUTDOWN_FUNCTION
+*/
+static PHP_MSHUTDOWN_FUNCTION(json)
+{
+ UNREGISTER_INI_ENTRIES();
+
+ return SUCCESS;
+}
+/* }}} */
+
/* {{{ json_module_entry
*/
@@ -161,7 +198,7 @@ zend_module_entry json_module_entry = {
"json",
json_functions,
PHP_MINIT(json),
- NULL,
+ PHP_MSHUTDOWN(json),
NULL,
NULL,
PHP_MINFO(json),
diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c
index 92ab413cf0..cf9d9adaa2 100644
--- a/ext/json/json_encoder.c
+++ b/ext/json/json_encoder.c
@@ -104,10 +104,10 @@ static inline void php_json_encode_double(smart_str *buf, double d, int options)
{
size_t len;
char num[PHP_JSON_DOUBLE_MAX_LENGTH];
- if (PG(serialize_precision) == -1) {
+ if (JSON_G(precision) == -1) {
php_0cvt(d, 17, '.', 'e', num);
} else {
- php_gcvt(d, PG(serialize_precision), '.', 'e', num);
+ php_gcvt(d, JSON_G(precision), '.', 'e', num);
}
len = strlen(num);
if (options & PHP_JSON_PRESERVE_ZERO_FRACTION && strchr(num, '.') == NULL && len < PHP_JSON_DOUBLE_MAX_LENGTH - 2) {
diff --git a/ext/json/php_json.h b/ext/json/php_json.h
index d1fabd1e6b..2bf1c68eb4 100644
--- a/ext/json/php_json.h
+++ b/ext/json/php_json.h
@@ -81,6 +81,7 @@ typedef enum {
#define PHP_JSON_PARSER_DEFAULT_DEPTH 512
ZEND_BEGIN_MODULE_GLOBALS(json)
+ zend_long precision;
int encoder_depth;
int encode_max_depth;
php_json_error_code error_code;