Add JSON_G(precision)

This commit is contained in:
Yasuo Ohgaki 2015-08-05 14:36:37 +09:00 committed by Jakub Zelenka
parent f943daf2d7
commit 3aa2aadcf0
3 changed files with 41 additions and 3 deletions

View File

@ -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),

View File

@ -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) {

View File

@ -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;