From 989c6ecfb55da1b5d3a4b6f95b5bbc9a9761fe2a Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 19 Dec 2014 05:05:30 +0300 Subject: [PATCH] Improved chr() function. Use FAST_ZPP, use interned strings. --- ext/standard/string.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index c686cdd56a..4ea0c9ff4b 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2641,20 +2641,29 @@ PHP_FUNCTION(ord) PHP_FUNCTION(chr) { zend_long c; - char temp[2]; if (ZEND_NUM_ARGS() != 1) { WRONG_PARAM_COUNT; } +#ifndef FAST_ZPP if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "l", &c) == FAILURE) { c = 0; } +#else + ZEND_PARSE_PARAMETERS_START_EX(ZEND_PARSE_PARAMS_QUIET, 1, 1) + Z_PARAM_LONG(c) + ZEND_PARSE_PARAMETERS_END_EX(c = 0); +#endif - temp[0] = (char)c; - temp[1] = '\0'; - - RETURN_STRINGL(temp, 1); + c &= 0xff; + if (CG(one_char_string)[c]) { + ZVAL_INTERNED_STR(return_value, CG(one_char_string)[c]); + } else { + ZVAL_NEW_STR(return_value, zend_string_alloc(1, 0)); + Z_STRVAL_P(return_value)[0] = (char)c; + Z_STRVAL_P(return_value)[1] = '\0'; + } } /* }}} */ -- 2.40.0