diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 568eb491073..3f2b8048000 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2641,6 +2641,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con switch (mode) { case ZEND_CT: if (constant_container) { + zend_str_tolower(constant_container->u.constant.value.str.val, constant_container->u.constant.value.str.len); zend_do_fetch_class_name(NULL, constant_container, constant_name, 1 TSRMLS_CC); *result = *constant_container; } else { diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index de7d2a87f53..7fec474bc12 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -212,11 +212,41 @@ ZEND_API int zend_get_constant(char *name, uint name_len, zval *result TSRMLS_DC zend_constant *c; char *lookup_name; int retval = 1; + char *colon; + if((colon = memchr(name, ':', name_len)) && colon[1] == ':') { + /* class constant */ + zend_class_entry **ce; + int class_name_len = colon-name; + int const_name_len = name_len - class_name_len - 2; + char *constant_name = colon+2; + zval **ret_constant; + + lookup_name = do_alloca(class_name_len+1); + zend_str_tolower_copy(lookup_name, name, class_name_len); + lookup_name[class_name_len] = '\0'; + if(zend_lookup_class(lookup_name, class_name_len, &ce) != SUCCESS) { + retval = 0; + } else { + if (zend_hash_find(&((*ce)->constants_table), constant_name, const_name_len+1, (void **) &ret_constant) != SUCCESS) { + retval = 0; + } + + } + + if(retval) { + *result = **ret_constant; + zval_copy_ctor(result); + } + + free_alloca(lookup_name); + return retval; + } + if (zend_hash_find(EG(zend_constants), name, name_len+1, (void **) &c) == FAILURE) { lookup_name = do_alloca(name_len+1); zend_str_tolower_copy(lookup_name, 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) { retval=0; diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 42624ced6bb..0cd1e070334 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -658,7 +658,7 @@ const_scalar: | '+' const_scalar { $$ = $2; } | '-' const_scalar { zval minus_one; minus_one.type = IS_LONG; minus_one.value.lval = -1; mul_function(&$2.u.constant, &$2.u.constant, &minus_one TSRMLS_CC); $$ = $2; } | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; $$.u.constant.type = IS_CONSTANT_ARRAY; } - | class_constant { /* FIXME */ } + | static_class_constant { $$ = $1; } ; static_scalar: /* compile-time evaluated scalars */ @@ -667,7 +667,11 @@ static_scalar: /* compile-time evaluated scalars */ | '+' static_scalar { $$ = $2; } | '-' static_scalar { zval minus_one; minus_one.type = IS_LONG; minus_one.value.lval = -1; mul_function(&$2.u.constant, &$2.u.constant, &minus_one TSRMLS_CC); $$ = $2; } | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; $$.u.constant.type = IS_CONSTANT_ARRAY; } - | class_constant { /* FIXME */ } + | static_class_constant { $$ = $1; } +; + +static_class_constant: + T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_CT TSRMLS_CC); } ; scalar: