From d8208b0541a44a6917cbe65a84001b6180cde3b5 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 25 Jul 2008 04:54:56 +0000 Subject: [PATCH] Substitute persistent constants by their values at compile time. (Matt) --- Zend/zend_compile.c | 11 ++++++++++- Zend/zend_compile.h | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index dfd9306394..7057101554 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -4009,6 +4009,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; } /* }}} */ @@ -5546,12 +5553,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 '%R'", Z_TYPE(name->u.constant), Z_UNIVAL(name->u.constant)); } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 0f8d6a8208..df64ee090f 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -789,6 +789,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 -- 2.40.0