Index: Zend/zend_compile.c =================================================================== RCS file: /repository/ZendEngine2/zend_compile.c,v retrieving revision 1.647.2.27.2.41.2.73 diff -u -r1.647.2.27.2.41.2.73 zend_compile.c --- Zend/zend_compile.c 17 Jul 2008 19:29:34 -0000 1.647.2.27.2.41.2.73 +++ Zend/zend_compile.c 23 Jul 2008 13:47:20 -0000 @@ -3781,48 +3781,31 @@ *result = CG(active_op_array)->opcodes[new_token->u.opline_num].result; } -static zend_constant* zend_get_ct_const(zval *const_name TSRMLS_DC) /* {{{ */ +static int zend_constant_ct_subst(znode *result, zval *const_name, zend_bool from_namespace TSRMLS_DC) /* {{{ */ { - zend_constant *c = NULL; + zend_constant *c; - if (zend_hash_find(EG(zend_constants), Z_STRVAL_P(const_name), Z_STRLEN_P(const_name)+1, (void **) &c) == FAILURE) { - char *lookup_name = zend_str_tolower_dup(Z_STRVAL_P(const_name), Z_STRLEN_P(const_name)); - - if (zend_hash_find(EG(zend_constants), lookup_name, Z_STRLEN_P(const_name)+1, (void **) &c)==SUCCESS) { - if ((c->flags & CONST_CS) && memcmp(c->name, Z_STRVAL_P(const_name), Z_STRLEN_P(const_name))!=0) { - efree(lookup_name); - return NULL; - } - } else { - efree(lookup_name); - return NULL; + if (CG(is_basic_const)) { + result->u.constant = CG(basic_const_value); + goto done; + } + + if (!from_namespace && zend_hash_find(EG(zend_constants), Z_STRVAL_P(const_name), Z_STRLEN_P(const_name)+1, (void **) &c) == SUCCESS) { + if (c->flags & CONST_PERSISTENT) { + result->u.constant = c->value; +done: + zval_dtor(const_name); + result->op_type = IS_CONST; + zval_copy_ctor(&result->u.constant); + INIT_PZVAL(&result->u.constant); + return 1; } - efree(lookup_name); - } - if (c->flags & CONST_CT_SUBST) { - return c; - } - return NULL; -} -/* }}} */ - -static int zend_constant_ct_subst(znode *result, zval *const_name TSRMLS_DC) /* {{{ */ -{ - zend_constant *c = zend_get_ct_const(const_name TSRMLS_CC); - - if (c) { - zval_dtor(const_name); - result->op_type = IS_CONST; - result->u.constant = c->value; - zval_copy_ctor(&result->u.constant); - INIT_PZVAL(&result->u.constant); - return 1; } return 0; } /* }}} */ -void zend_do_fetch_constant(znode *result, znode *constant_container, znode *constant_name, int mode, zend_bool check_namespace TSRMLS_DC) /* {{{ */ +void zend_do_fetch_constant(znode *result, znode *constant_container, znode *constant_name, int mode, zend_bool from_namespace TSRMLS_DC) /* {{{ */ { ulong fetch_type = 0; znode tmp; @@ -3833,9 +3816,13 @@ Z_STRLEN(constant_container->u.constant) == 0) { /* namespace::const */ zval_dtor(&constant_container->u.constant); - check_namespace = 1; + from_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; + } + + if (!CG(current_namespace)) { + from_namespace = 0; } switch (mode) { @@ -3851,8 +3838,8 @@ 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 TSRMLS_CC)) { - if (check_namespace && CG(current_namespace)) { + } else if (fetch_type || !zend_constant_ct_subst(result, &constant_name->u.constant, from_namespace TSRMLS_CC)) { + if (from_namespace) { /* We assume we use constant from the current namespace if it is not prefixed. */ tmp.op_type = IS_CONST; @@ -3868,7 +3855,7 @@ break; case ZEND_RT: if (constant_container || - !zend_constant_ct_subst(result, &constant_name->u.constant TSRMLS_CC)) { + !zend_constant_ct_subst(result, &constant_name->u.constant, from_namespace TSRMLS_CC)) { zend_op *opline; if (constant_container) { @@ -3879,7 +3866,7 @@ zend_do_fetch_class(&tmp, constant_container TSRMLS_CC); constant_container = &tmp; } - } else if (check_namespace && CG(current_namespace)) { + } else if (from_namespace) { /* We assume we use constant from the current namespace if it is not prefixed. */ tmp.op_type = IS_CONST; @@ -5164,7 +5151,7 @@ } /* }}} */ -void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ +void zend_do_declare_constant(znode *name, znode *value, int is_basic_const TSRMLS_DC) /* {{{ */ { zend_op *opline; @@ -5172,7 +5159,7 @@ zend_error(E_COMPILE_ERROR, "Arrays are not allowed as constants"); } - if (zend_get_ct_const(&name->u.constant TSRMLS_CC)) { + if (is_basic_const) { zend_error(E_COMPILE_ERROR, "Cannot redeclare constant '%s'", Z_STRVAL(name->u.constant)); } Index: Zend/zend_compile.h =================================================================== RCS file: /repository/ZendEngine2/zend_compile.h,v retrieving revision 1.316.2.8.2.12.2.26 diff -u -r1.316.2.8.2.12.2.26 zend_compile.h --- Zend/zend_compile.h 14 Jul 2008 09:49:00 -0000 1.316.2.8.2.12.2.26 +++ Zend/zend_compile.h 17 Jul 2008 14:31:00 -0000 @@ -483,7 +483,7 @@ void zend_do_begin_new_object(znode *new_token, znode *class_type TSRMLS_DC); void zend_do_end_new_object(znode *result, znode *new_token, znode *argument_list TSRMLS_DC); -void zend_do_fetch_constant(znode *result, znode *constant_container, znode *constant_name, int mode, zend_bool check_namespace TSRMLS_DC); +void zend_do_fetch_constant(znode *result, znode *constant_container, znode *constant_name, int mode, zend_bool from_namespace TSRMLS_DC); void zend_do_shell_exec(znode *result, znode *cmd TSRMLS_DC); @@ -532,7 +532,7 @@ void zend_do_abstract_method(znode *function_name, znode *modifiers, znode *body TSRMLS_DC); -void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC); +void zend_do_declare_constant(znode *name, znode *value, int is_basic_const TSRMLS_DC); void zend_do_build_namespace_name(znode *result, znode *prefix, znode *name TSRMLS_DC); void zend_do_namespace(znode *name TSRMLS_DC); void zend_do_use(znode *name, znode *new_name, int is_global TSRMLS_DC); Index: Zend/zend_constants.c =================================================================== RCS file: /repository/ZendEngine2/zend_constants.c,v retrieving revision 1.71.2.5.2.7.2.10 diff -u -r1.71.2.5.2.7.2.10 zend_constants.c --- Zend/zend_constants.c 21 Jul 2008 09:41:00 -0000 1.71.2.5.2.7.2.10 +++ Zend/zend_constants.c 23 Jul 2008 13:47:20 -0000 @@ -117,7 +117,7 @@ { zend_constant c; - c.flags = CONST_PERSISTENT | CONST_CT_SUBST; + c.flags = CONST_PERSISTENT; c.module_number = 0; c.name = zend_strndup(ZEND_STRL("TRUE")); @@ -137,8 +137,6 @@ c.value.type = IS_NULL; zend_register_constant(&c TSRMLS_CC); - c.flags = CONST_PERSISTENT; - c.name = zend_strndup(ZEND_STRL("ZEND_THREAD_SAFE")); c.name_len = sizeof("ZEND_THREAD_SAFE"); c.value.value.lval = ZTS_V; @@ -231,7 +229,7 @@ lookup_name = zend_str_tolower_dup(name, name_len); if (zend_hash_find(EG(zend_constants), lookup_name, name_len+1, (void **) &c)==SUCCESS) { - if ((c->flags & CONST_CS) && memcmp(c->name, name, name_len) != 0) { + if (c->flags & CONST_CS) { retval=0; } } else { Index: Zend/zend_constants.h =================================================================== RCS file: /repository/ZendEngine2/zend_constants.h,v retrieving revision 1.31.2.2.2.3.2.3 diff -u -r1.31.2.2.2.3.2.3 zend_constants.h --- Zend/zend_constants.h 12 May 2008 07:11:55 -0000 1.31.2.2.2.3.2.3 +++ Zend/zend_constants.h 17 Jul 2008 14:31:00 -0000 @@ -26,7 +26,6 @@ #define CONST_CS (1<<0) /* Case Sensitive */ #define CONST_PERSISTENT (1<<1) /* Persistent */ -#define CONST_CT_SUBST (1<<2) /* Allow compile-time substitution */ #define PHP_USER_CONSTANT INT_MAX /* a constant defined in user space */ Index: Zend/zend_globals.h =================================================================== RCS file: /repository/ZendEngine2/zend_globals.h,v retrieving revision 1.141.2.3.2.7.2.16 diff -u -r1.141.2.3.2.7.2.16 zend_globals.h --- Zend/zend_globals.h 29 Jun 2008 08:21:34 -0000 1.141.2.3.2.7.2.16 +++ Zend/zend_globals.h 17 Jul 2008 14:34:00 -0000 @@ -138,6 +138,9 @@ HashTable *labels; zend_stack labels_stack; + zend_bool is_basic_const; + zval basic_const_value; + #ifdef ZEND_MULTIBYTE zend_encoding **script_encoding_list; int script_encoding_list_size; Index: Zend/zend_language_parser.y =================================================================== RCS file: /repository/ZendEngine2/zend_language_parser.y,v retrieving revision 1.160.2.4.2.8.2.22 diff -u -r1.160.2.4.2.8.2.22 zend_language_parser.y --- Zend/zend_language_parser.y 14 Jul 2008 09:49:00 -0000 1.160.2.4.2.8.2.22 +++ Zend/zend_language_parser.y 17 Jul 2008 14:31:00 -0000 @@ -188,8 +188,8 @@ constant_declaration: - constant_declaration ',' T_STRING '=' static_scalar { zend_do_declare_constant(&$3, &$5 TSRMLS_CC); } - | T_CONST T_STRING '=' static_scalar { zend_do_declare_constant(&$2, &$4 TSRMLS_CC); } + constant_declaration ',' T_STRING { Z_LVAL($2.u.constant) = CG(is_basic_const); } '=' static_scalar { zend_do_declare_constant(&$3, &$6, (int) Z_LVAL($2.u.constant) TSRMLS_CC); } + | T_CONST T_STRING { Z_LVAL($1.u.constant) = CG(is_basic_const); } '=' static_scalar { zend_do_declare_constant(&$2, &$5, (int) Z_LVAL($1.u.constant) TSRMLS_CC); } ; inner_statement_list: Index: Zend/zend_language_scanner.l =================================================================== RCS file: /repository/ZendEngine2/zend_language_scanner.l,v retrieving revision 1.131.2.11.2.13.2.22 diff -u -r1.131.2.11.2.13.2.22 zend_language_scanner.l --- Zend/zend_language_scanner.l 8 Jul 2008 15:16:35 -0000 1.131.2.11.2.13.2.22 +++ Zend/zend_language_scanner.l 17 Jul 2008 14:31:00 -0000 @@ -1711,7 +1711,33 @@ return T_ENCAPSED_AND_WHITESPACE; } -{LABEL} { +{LABEL} { + zend_copy_value(zendlval, yytext, yyleng); + zendlval->type = IS_STRING; + return T_STRING; +} + +"TRUE" { + CG(is_basic_const) = 1; + ZVAL_BOOL(&CG(basic_const_value), 1); + goto return_string; +} + +"FALSE" { + CG(is_basic_const) = 1; + ZVAL_BOOL(&CG(basic_const_value), 0); + goto return_string; +} + +"NULL" { + CG(is_basic_const) = 1; + ZVAL_NULL(&CG(basic_const_value)); + goto return_string; +} + +{LABEL} { + CG(is_basic_const) = 0; +return_string: zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING;