From: Dmitry Stogov Date: Fri, 29 Aug 2008 10:17:08 +0000 (+0000) Subject: Imporoved compile-time constant substitution (Matt) X-Git-Tag: BEFORE_NS_RULES_CHANGE~558 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8bf32f28f28e0a3c3f039d6f2ae6cfc1f6fc8012;p=php Imporoved compile-time constant substitution (Matt) --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index fa87fe8f33..daf67de39f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1392,7 +1392,7 @@ void zend_do_begin_lambda_function_declaration(znode *result, znode *function_to zend_do_begin_function_declaration(function_token, &function_name, 0, return_reference, NULL TSRMLS_CC); result->op_type = IS_TMP_VAR; - result->u.var = get_temporary_variable(current_op_array);; + result->u.var = get_temporary_variable(current_op_array); current_op = ¤t_op_array->opcodes[current_op_number]; current_op->opcode = ZEND_DECLARE_LAMBDA_FUNCTION; @@ -3767,7 +3767,7 @@ void zend_do_end_new_object(znode *result, const znode *new_token, const znode * *result = CG(active_op_array)->opcodes[new_token->u.opline_num].result; } -static zend_constant* zend_get_ct_const(const zval *const_name, int mode TSRMLS_DC) /* {{{ */ +static zend_constant* zend_get_ct_const(const zval *const_name, int all_internal_constants_substitution TSRMLS_DC) /* {{{ */ { zend_constant *c = NULL; @@ -3786,9 +3786,8 @@ static zend_constant* zend_get_ct_const(const zval *const_name, int mode TSRMLS_ if (c->flags & CONST_CT_SUBST) { return c; } - if (mode == ZEND_RT && + if (all_internal_constants_substitution && (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) { @@ -3798,9 +3797,9 @@ static zend_constant* zend_get_ct_const(const zval *const_name, int mode TSRMLS_ } /* }}} */ -static int zend_constant_ct_subst(znode *result, zval *const_name, int mode TSRMLS_DC) /* {{{ */ +static int zend_constant_ct_subst(znode *result, zval *const_name, int all_internal_constants_substitution TSRMLS_DC) /* {{{ */ { - zend_constant *c = zend_get_ct_const(const_name, mode TSRMLS_CC); + zend_constant *c = zend_get_ct_const(const_name, all_internal_constants_substitution TSRMLS_CC); if (c) { zval_dtor(const_name); @@ -3827,7 +3826,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con zval_dtor(&constant_container->u.constant); check_namespace = 1; constant_container = NULL; - fetch_type = ZEND_FETCH_CLASS_RT_NS_CHECK | IS_CONSTANT_RT_NS_CHECK;; + fetch_type = ZEND_FETCH_CLASS_RT_NS_CHECK | IS_CONSTANT_RT_NS_CHECK; } switch (mode) { @@ -3843,7 +3842,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con zend_do_build_full_name(NULL, constant_container, constant_name TSRMLS_CC); *result = *constant_container; result->u.constant.type = IS_CONSTANT | fetch_type; - } else if (fetch_type || !zend_constant_ct_subst(result, &constant_name->u.constant, ZEND_CT TSRMLS_CC)) { + } else if (fetch_type || !zend_constant_ct_subst(result, &constant_name->u.constant, 0 TSRMLS_CC)) { if (check_namespace && CG(current_namespace)) { /* We assume we use constant from the current namespace if it is not prefixed. */ @@ -3860,7 +3859,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con break; case ZEND_RT: if (constant_container || - !zend_constant_ct_subst(result, &constant_name->u.constant, ZEND_RT TSRMLS_CC)) { + !zend_constant_ct_subst(result, &constant_name->u.constant, (!CG(current_namespace) || !check_namespace) TSRMLS_CC)) { zend_op *opline; if (constant_container) { @@ -5166,7 +5165,7 @@ void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ zend_error(E_COMPILE_ERROR, "Arrays are not allowed as constants"); } - if (zend_get_ct_const(&name->u.constant, ZEND_CT TSRMLS_CC)) { + if (zend_get_ct_const(&name->u.constant, 0 TSRMLS_CC)) { zend_error(E_COMPILE_ERROR, "Cannot redeclare constant '%s'", Z_STRVAL(name->u.constant)); }