Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/Zend/zend.c b/Zend/zend.c
- index f9069c8..52834b1 100644
- --- a/Zend/zend.c
- +++ b/Zend/zend.c
- @@ -534,6 +534,8 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals TSRMLS
- compiler_globals->static_members_table = NULL;
- }
- compiler_globals->script_encoding_list = NULL;
- +
- + compiler_globals->anon_class_id = 0L;
- }
- /* }}} */
- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
- index 672f62b..f8892e1 100644
- --- a/Zend/zend_compile.c
- +++ b/Zend/zend_compile.c
- @@ -2225,6 +2225,23 @@ void zend_resolve_class_name(znode *class_name TSRMLS_DC) /* {{{ */
- }
- /* }}} */
- +void zend_do_create_anon_class(znode *result, const znode *class_token TSRMLS_DC) {
- + ++CG(anon_class_id);
- +
- + Z_TYPE(result->u.constant) = IS_STRING;
- + Z_STRLEN(result->u.constant) = snprintf(NULL, 0, "Class$$%lu", CG(anon_class_id));
- + if (Z_STRLEN(result->u.constant)) {
- + Z_STRVAL(result->u.constant) = (char*) emalloc(Z_STRLEN(result->u.constant)+1);
- + if (Z_STRVAL(result->u.constant)) {
- + snprintf(
- + Z_STRVAL(result->u.constant),
- + Z_STRLEN(result->u.constant)+1,
- + "Class$$%lu", CG(anon_class_id)
- + );
- + }
- + }
- +}
- +
- void zend_do_fetch_class(znode *result, znode *class_name TSRMLS_DC) /* {{{ */
- {
- long fetch_class_op_number;
- diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
- index b9a5b39..2993844 100644
- --- a/Zend/zend_globals.h
- +++ b/Zend/zend_globals.h
- @@ -151,6 +151,9 @@ struct _zend_compiler_globals {
- zend_bool detect_unicode;
- zend_bool encoding_declared;
- + /* anonymous classes */
- + zend_ulong anon_class_id;
- +
- #ifdef ZTS
- zval ***static_members_table;
- int last_static_member;
- diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
- index 403146e..377755f 100644
- --- a/Zend/zend_language_parser.y
- +++ b/Zend/zend_language_parser.y
- @@ -731,10 +731,37 @@ instance_call:
- chaining_instance_call { zend_do_pop_object(&$$ TSRMLS_CC); zend_do_end_variable_parse(&$2, BP_VAR_R, 0 TSRMLS_CC); }
- ;
- +new_object:
- + T_NEW class_name_reference { zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_new_object(&$1, &$2 TSRMLS_CC); } ctor_arguments { zend_do_end_new_object(&$$, &$1, &$4 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
- +;
- +
- +new_anon_class:
- + class_entry_type { zend_do_create_anon_class(&$$, &$1 TSRMLS_CC); }
- +;
- +
- +new_anon_object:
- + T_NEW new_anon_class extends_from {
- + zend_do_begin_class_declaration(&$2, &$2, &$3 TSRMLS_CC);
- + } implements_list '{' class_statement_list '}' {
- + zend_do_end_class_declaration(&$2, &$3 TSRMLS_CC);
- +
- + zend_do_fetch_class(&$1, &$2 TSRMLS_CC);
- + zend_do_extended_fcall_begin(TSRMLS_C);
- + zend_do_begin_new_object(&$1, &$2 TSRMLS_CC);
- + } ctor_arguments {
- + zend_do_end_new_object(&$$, &$1, &$4 TSRMLS_CC);
- + zend_do_extended_fcall_end(TSRMLS_C);
- +
- + zend_do_free(&$2 TSRMLS_CC);
- + }
- +;
- +
- new_expr:
- - T_NEW class_name_reference { zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_new_object(&$1, &$2 TSRMLS_CC); } ctor_arguments { zend_do_end_new_object(&$$, &$1, &$4 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
- + new_object
- + | new_anon_object
- ;
- +
- expr_without_variable:
- T_LIST '(' { zend_do_list_init(TSRMLS_C); } assignment_list ')' '=' expr { zend_do_list_end(&$$, &$7 TSRMLS_CC); }
- | variable '=' expr { zend_check_writable_variable(&$1); zend_do_assign(&$$, &$1, &$3 TSRMLS_CC); }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement