From: Yasuo Ohgaki Date: Wed, 5 Aug 2015 05:36:37 +0000 (+0900) Subject: Add JSON_G(precision) X-Git-Tag: php-7.1.0alpha3~81^2~13 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3aa2aadcf0c39d7d22532c46d8921f443d27166f;p=php Add JSON_G(precision) --- 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;