From: Zeev Suraski Date: Sun, 9 Mar 2003 22:17:15 +0000 (+0000) Subject: Fix handling of ::foo X-Git-Tag: RELEASE_0_5~540 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0eae2312547f414563b5dcc7bed6aa7db572410b;p=php Fix handling of ::foo --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 38df0b9288..5ccec45ebe 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1205,7 +1205,7 @@ void zend_do_begin_dynamic_function_call(znode *function_name TSRMLS_DC) } -void zend_do_fetch_class(znode *result, znode *namespace_name, znode *class_name TSRMLS_DC) +void zend_do_fetch_class(znode *result, znode *namespace_name, znode *class_name, zend_bool global_namespace TSRMLS_DC) { long fetch_class_op_number; zend_op *opline; @@ -1219,7 +1219,7 @@ void zend_do_fetch_class(znode *result, znode *namespace_name, znode *class_name opline->op1 = *namespace_name; } else { SET_UNUSED(opline->op1); - if (!IN_NAMESPACE()) { + if (global_namespace) { opline->extended_value = ZEND_FETCH_CLASS_GLOBAL; } } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index c539ab49b4..20e2928151 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -316,7 +316,7 @@ void zend_do_receive_arg(zend_uchar op, znode *var, znode *offset, znode *initia int zend_do_begin_function_call(znode *function_name TSRMLS_DC); void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC); void zend_do_begin_dynamic_function_call(znode *function_name TSRMLS_DC); -void zend_do_fetch_class(znode *result, znode *namespace_name, znode *class_name TSRMLS_DC); +void zend_do_fetch_class(znode *result, znode *namespace_name, znode *class_name, zend_bool global_namespace TSRMLS_DC); void zend_do_fetch_class_name(znode *result, znode *class_entry, znode *class_name, zend_bool case_sensitive TSRMLS_DC); void zend_do_begin_class_member_function_call(TSRMLS_D); void zend_do_end_function_call(znode *function_name, znode *result, znode *argument_list, int is_method, int is_dynamic_fcall TSRMLS_DC); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 95eb185912..e0695b6494 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -454,8 +454,9 @@ non_empty_parameter_list: optional_class_type: /* empty */ { $$.op_type = IS_UNUSED; } - | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); } - | T_STRING { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); } + | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, &$1, &$3, 0 TSRMLS_CC); } + | T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, NULL, &$2, 1 TSRMLS_CC); } + | T_STRING { zend_do_fetch_class(&$$, NULL, &$1, 0 TSRMLS_CC); } ; function_call_parameter_list: @@ -649,19 +650,20 @@ function_call: ; fully_qualified_class_name: - namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); } - | T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, NULL, &$2 TSRMLS_CC); } - | T_STRING { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); } + namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, &$1, &$3, 0 TSRMLS_CC); } + | T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, NULL, &$2, 1 TSRMLS_CC); } + | T_STRING { zend_do_fetch_class(&$$, NULL, &$1, 0 TSRMLS_CC); } ; import_namespace: - T_NAMESPACE_NAME { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); } - | T_STRING { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); } + T_NAMESPACE_NAME { zend_do_fetch_class(&$$, NULL, &$1, 0 TSRMLS_CC); } + | T_STRING { zend_do_fetch_class(&$$, NULL, &$1, 0 TSRMLS_CC); } ; new_class_entry: - namespace_name T_PAAMAYIM_NEKUDOTAYIM static_or_variable_string { zend_do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); } - | static_or_variable_string { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); } + namespace_name T_PAAMAYIM_NEKUDOTAYIM static_or_variable_string { zend_do_fetch_class(&$$, &$1, &$3, 0 TSRMLS_CC); } + | T_PAAMAYIM_NEKUDOTAYIM static_or_variable_string { zend_do_fetch_class(&$$, NULL, &$2, 1 TSRMLS_CC); } + | static_or_variable_string { zend_do_fetch_class(&$$, NULL, &$1, 0 TSRMLS_CC); } ; namespace_name: @@ -675,8 +677,9 @@ static_or_variable_string: ; instanceof_expr: - namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); } - | T_STRING { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); } + namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, &$1, &$3, 0 TSRMLS_CC); } + | T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, NULL, &$2, 1 TSRMLS_CC); } + | T_STRING { zend_do_fetch_class(&$$, NULL, &$1, 0 TSRMLS_CC); } ; exit_expr: @@ -798,9 +801,9 @@ variable_without_objects: ; static_member: - T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $4; zend_do_fetch_class(&$1, NULL, &$2 TSRMLS_CC); zend_do_fetch_static_member(&$1 TSRMLS_CC); } - | namespace_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_class(&$2, NULL, &$1 TSRMLS_CC); zend_do_fetch_static_member(&$2 TSRMLS_CC); } - | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $5; zend_do_fetch_class(&$4, &$1, &$3 TSRMLS_CC); zend_do_fetch_static_member(&$4 TSRMLS_CC); } + T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $4; zend_do_fetch_class(&$1, NULL, &$2, 1 TSRMLS_CC); zend_do_fetch_static_member(&$1 TSRMLS_CC); } + | namespace_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_class(&$2, NULL, &$1, 0 TSRMLS_CC); zend_do_fetch_static_member(&$2 TSRMLS_CC); } + | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $5; zend_do_fetch_class(&$4, &$1, &$3, 0 TSRMLS_CC); zend_do_fetch_static_member(&$4 TSRMLS_CC); } ; @@ -931,9 +934,9 @@ isset_variables: class_or_namespace_constant: T_PAAMAYIM_NEKUDOTAYIM namespace_name { zend_do_fetch_constant(&$$, NULL, &$2, ZEND_RT TSRMLS_CC); } - | T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$1, NULL, &$2 TSRMLS_CC); zend_do_fetch_constant(&$$, &$1, &$4, ZEND_RT TSRMLS_CC); } - | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$2, NULL, &$1 TSRMLS_CC); zend_do_fetch_constant(&$$, &$2, &$3, ZEND_RT TSRMLS_CC); } - | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$4, &$1, &$3 TSRMLS_CC); zend_do_fetch_constant(&$$, &$4, &$5, ZEND_RT TSRMLS_CC); } + | T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$1, NULL, &$2, 1 TSRMLS_CC); zend_do_fetch_constant(&$$, &$1, &$4, ZEND_RT TSRMLS_CC); } + | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$2, NULL, &$1, 0 TSRMLS_CC); zend_do_fetch_constant(&$$, &$2, &$3, ZEND_RT TSRMLS_CC); } + | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$4, &$1, &$3, 0 TSRMLS_CC); zend_do_fetch_constant(&$$, &$4, &$5, ZEND_RT TSRMLS_CC); } ; %%