summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--Zend/zend_compile.c11
-rw-r--r--Zend/zend_compile.h3
3 files changed, 14 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 345efcb41f..8a9e422f95 100644
--- 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)
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 48e5eb967a..afd0d851a7 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -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));
}
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index 7ddbe50f56..975c075473 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -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