Advertisement
Guest User

anon-classes

a guest
Sep 21st, 2013
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.56 KB | None | 0 0
  1. diff --git a/Zend/zend.c b/Zend/zend.c
  2. index f9069c8..52834b1 100644
  3. --- a/Zend/zend.c
  4. +++ b/Zend/zend.c
  5. @@ -534,6 +534,8 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals TSRMLS
  6. compiler_globals->static_members_table = NULL;
  7. }
  8. compiler_globals->script_encoding_list = NULL;
  9. +
  10. + compiler_globals->anon_class_id = 0L;
  11. }
  12. /* }}} */
  13.  
  14. diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
  15. index 672f62b..f8892e1 100644
  16. --- a/Zend/zend_compile.c
  17. +++ b/Zend/zend_compile.c
  18. @@ -2225,6 +2225,23 @@ void zend_resolve_class_name(znode *class_name TSRMLS_DC) /* {{{ */
  19. }
  20. /* }}} */
  21.  
  22. +void zend_do_create_anon_class(znode *result, const znode *class_token TSRMLS_DC) {
  23. + ++CG(anon_class_id);
  24. +
  25. + Z_TYPE(result->u.constant) = IS_STRING;
  26. + Z_STRLEN(result->u.constant) = snprintf(NULL, 0, "Class$$%lu", CG(anon_class_id));
  27. + if (Z_STRLEN(result->u.constant)) {
  28. + Z_STRVAL(result->u.constant) = (char*) emalloc(Z_STRLEN(result->u.constant)+1);
  29. + if (Z_STRVAL(result->u.constant)) {
  30. + snprintf(
  31. + Z_STRVAL(result->u.constant),
  32. + Z_STRLEN(result->u.constant)+1,
  33. + "Class$$%lu", CG(anon_class_id)
  34. + );
  35. + }
  36. + }
  37. +}
  38. +
  39. void zend_do_fetch_class(znode *result, znode *class_name TSRMLS_DC) /* {{{ */
  40. {
  41. long fetch_class_op_number;
  42. diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
  43. index b9a5b39..2993844 100644
  44. --- a/Zend/zend_globals.h
  45. +++ b/Zend/zend_globals.h
  46. @@ -151,6 +151,9 @@ struct _zend_compiler_globals {
  47. zend_bool detect_unicode;
  48. zend_bool encoding_declared;
  49.  
  50. + /* anonymous classes */
  51. + zend_ulong anon_class_id;
  52. +
  53. #ifdef ZTS
  54. zval ***static_members_table;
  55. int last_static_member;
  56. diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
  57. index 403146e..377755f 100644
  58. --- a/Zend/zend_language_parser.y
  59. +++ b/Zend/zend_language_parser.y
  60. @@ -731,10 +731,37 @@ instance_call:
  61. chaining_instance_call { zend_do_pop_object(&$$ TSRMLS_CC); zend_do_end_variable_parse(&$2, BP_VAR_R, 0 TSRMLS_CC); }
  62. ;
  63.  
  64. +new_object:
  65. + 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);}
  66. +;
  67. +
  68. +new_anon_class:
  69. + class_entry_type { zend_do_create_anon_class(&$$, &$1 TSRMLS_CC); }
  70. +;
  71. +
  72. +new_anon_object:
  73. + T_NEW new_anon_class extends_from {
  74. + zend_do_begin_class_declaration(&$2, &$2, &$3 TSRMLS_CC);
  75. + } implements_list '{' class_statement_list '}' {
  76. + zend_do_end_class_declaration(&$2, &$3 TSRMLS_CC);
  77. +
  78. + zend_do_fetch_class(&$1, &$2 TSRMLS_CC);
  79. + zend_do_extended_fcall_begin(TSRMLS_C);
  80. + zend_do_begin_new_object(&$1, &$2 TSRMLS_CC);
  81. + } ctor_arguments {
  82. + zend_do_end_new_object(&$$, &$1, &$4 TSRMLS_CC);
  83. + zend_do_extended_fcall_end(TSRMLS_C);
  84. +
  85. + zend_do_free(&$2 TSRMLS_CC);
  86. + }
  87. +;
  88. +
  89. new_expr:
  90. - 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);}
  91. + new_object
  92. + | new_anon_object
  93. ;
  94.  
  95. +
  96. expr_without_variable:
  97. T_LIST '(' { zend_do_list_init(TSRMLS_C); } assignment_list ')' '=' expr { zend_do_list_end(&$$, &$7 TSRMLS_CC); }
  98. | variable '=' expr { zend_check_writable_variable(&$1); zend_do_assign(&$$, &$1, &$3 TSRMLS_CC); }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement