]> granicus.if.org Git - php/commitdiff
Imporoved compile-time constant substitution (Matt)
authorDmitry Stogov <dmitry@php.net>
Fri, 29 Aug 2008 10:17:08 +0000 (10:17 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 29 Aug 2008 10:17:08 +0000 (10:17 +0000)
Zend/zend_compile.c

index fa87fe8f338e1060476f35e16590e0f456187f42..daf67de39f11ee99a7490ad852480f6065e1eeaf 100644 (file)
@@ -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 = &current_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));
        }