mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
Fix bug #23384 - static class::constant constants should now
work in static & array expressions.
This commit is contained in:
parent
68ae83f339
commit
8cd9792375
@ -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 {
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user