]> granicus.if.org Git - php/commitdiff
Substitute persistent constants by their values at compile time. (Matt)
authorDmitry Stogov <dmitry@php.net>
Fri, 25 Jul 2008 04:54:08 +0000 (04:54 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 25 Jul 2008 04:54:08 +0000 (04:54 +0000)
NEWS
Zend/zend_compile.c
Zend/zend_compile.h

diff --git a/NEWS b/NEWS
index 345efcb41f68a23f6febfa86881427d6d7d325b8..8a9e422f95fda02ad7be6a53b7ef64cbb0efbdac 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -43,6 +43,7 @@ PHP                                                                        NEWS
   . Added ability to handle exceptions in destructors. (Marcus)
 
 - Improved PHP runtime speed and memory usage:
+  . Substitute persistent constants by their values at compile time. (Matt)
   . Optimized ZEND_SIGNED_MULTIPLY_LONG() (Matt)
   . Removed direct executor recursion. (Dmitry)
   . Use fastcall calling convention in executor on x86. (Dmitry)
index 48e5eb967addc16ef37369bc20ea1665db0ad8ed..afd0d851a7c14eb3bca28c2a0483fd463724918d 100644 (file)
@@ -3804,6 +3804,13 @@ static zend_constant* zend_get_ct_const(zval *const_name TSRMLS_DC) /* {{{ */
        if (c->flags & CONST_CT_SUBST) {
                return c;
        }
+       if ((c->flags & CONST_PERSISTENT) &&
+           !CG(current_namespace) &&
+           !(CG(compiler_options) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION) &&
+           Z_TYPE(c->value) != IS_CONSTANT &&
+           Z_TYPE(c->value) != IS_CONSTANT_ARRAY) {
+               return c;
+       }
        return NULL;
 }
 /* }}} */
@@ -5171,12 +5178,14 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{
 void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */
 {
        zend_op *opline;
+       zend_constant *c;
 
        if(Z_TYPE(value->u.constant) == IS_CONSTANT_ARRAY) {
                zend_error(E_COMPILE_ERROR, "Arrays are not allowed as constants");
        }
 
-       if (zend_get_ct_const(&name->u.constant TSRMLS_CC)) {
+       c = zend_get_ct_const(&name->u.constant TSRMLS_CC);
+       if (c && (c->flags & CONST_CT_SUBST)) {
                zend_error(E_COMPILE_ERROR, "Cannot redeclare constant '%s'", Z_STRVAL(name->u.constant));
        }
 
index 7ddbe50f5639aa0de2a3ab16164fa2fe43088f27..975c075473eb10449ef33d96c59d3ecc966f8cc5 100644 (file)
@@ -762,6 +762,9 @@ END_EXTERN_C()
 /* generate ZEND_DECLARE_INHERITED_CLASS_DELAYED opcode to delay early binding */
 #define ZEND_COMPILE_DELAYED_BINDING                   (1<<4)
 
+/* disable constant substitution at compile-time */
+#define ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION  (1<<5)
+
 /* The default value for CG(compiler_options) */
 #define ZEND_COMPILE_DEFAULT                                   ZEND_COMPILE_HANDLE_OP_ARRAY