]> granicus.if.org Git - php/commitdiff
Improved chr() function. Use FAST_ZPP, use interned strings.
authorDmitry Stogov <dmitry@zend.com>
Fri, 19 Dec 2014 02:05:30 +0000 (05:05 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 19 Dec 2014 02:05:30 +0000 (05:05 +0300)
ext/standard/string.c

index c686cdd56a7288f1a470e41c319231e8417117bd..4ea0c9ff4b4dd316c7bbc1f3aac06a2fed6a6e77 100644 (file)
@@ -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';
+       }
 }
 /* }}} */