]> granicus.if.org Git - php/commitdiff
Fix bug #23384 - static class::constant constants should now
authorStanislav Malyshev <stas@php.net>
Sun, 15 Jun 2003 13:58:50 +0000 (13:58 +0000)
committerStanislav Malyshev <stas@php.net>
Sun, 15 Jun 2003 13:58:50 +0000 (13:58 +0000)
work in static & array expressions.

Zend/zend_compile.c
Zend/zend_constants.c
Zend/zend_language_parser.y

index 568eb491073f16cc5328fc78f649b77713aabe88..3f2b8048000e27745d63cb3bd35e998b4ea6eccf 100644 (file)
@@ -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 {
index de7d2a87f535207629830053af07fac146e05420..7fec474bc1224d7deb13ea876dbf04e6de123f49 100644 (file)
@@ -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;
index 42624ced6bb12001b7ceeabede2269edb539846c..0cd1e0703341e802df3488b1343707be95f510a6 100644 (file)
@@ -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: