@@ -396,47 +396,6 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_list_add(zend_ast *ast, zend_ast *op)
396396 return (zend_ast * ) list ;
397397}
398398
399- ZEND_API zend_ast * ZEND_FASTCALL zend_ast_add_constructor (zend_ast * ast , uint32_t start_lineno , zend_ast * params ) {
400- zend_ast_list * par_list = (zend_ast_list * ) params ;
401- int i ;
402- zend_ast * body_ast = zend_ast_create_list (0 , ZEND_AST_STMT_LIST );
403-
404- for (i = 0 ; i < par_list -> children ; i ++ ){
405- zval * param = zend_ast_get_zval (par_list -> child [i ]-> child [1 ]);
406- char * param_name = Z_STRVAL_P (param );
407-
408- zend_ast * class_prop = zend_ast_create (
409- ZEND_AST_PROP ,
410- zend_ast_create (
411- ZEND_AST_VAR ,
412- zend_ast_create_zval_from_str (zend_string_init ("this" , strlen ("this" ), 0 ))
413- ),
414- zend_ast_create_zval_from_str (zend_string_init (param_name , strlen (param_name ), 0 ))
415- );
416-
417- zend_ast * constructor_param = zend_ast_create (
418- ZEND_AST_VAR ,
419- zend_ast_create_zval_from_str (zend_string_init (param_name , strlen (param_name ), 0 ))
420- );
421-
422- zend_ast * assignment = zend_ast_create (ZEND_AST_ASSIGN , class_prop , constructor_param );
423- zend_ast_list_add (body_ast , assignment );
424- }
425-
426- zend_ast * constructor = zend_ast_create_decl (
427- ZEND_AST_METHOD ,
428- ZEND_ACC_PUBLIC ,
429- start_lineno ,
430- NULL ,
431- zend_string_init ("__construct" , strlen ("__construct" ), 0 ),
432- params ,
433- NULL ,
434- body_ast ,
435- NULL
436- );
437- return zend_ast_list_add (ast , constructor );
438- }
439-
440399static int zend_ast_add_array_element (zval * result , zval * offset , zval * expr )
441400{
442401 switch (Z_TYPE_P (offset )) {
@@ -2038,6 +1997,95 @@ ZEND_API ZEND_COLD zend_string *zend_ast_export(const char *prefix, zend_ast *as
20381997 return str .s ;
20391998}
20401999
2000+ /*
2001+ * ast_inject
2002+ */
2003+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_inj_create_method (char * name , uint32_t start_lineno , zend_ast_attr attr , zend_ast * params , zend_ast * body ) {
2004+ return zend_ast_create_decl (
2005+ ZEND_AST_METHOD ,
2006+ attr ,
2007+ start_lineno ,
2008+ NULL ,
2009+ CHAR_TO_ZEND_STR (name ),
2010+ params ,
2011+ NULL ,
2012+ body ,
2013+ NULL
2014+ );
2015+ }
2016+
2017+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_inj_this_var (char * name ) {
2018+ return zend_ast_create (
2019+ ZEND_AST_PROP ,
2020+ zend_ast_create (
2021+ ZEND_AST_VAR ,
2022+ zend_ast_create_zval_from_str (CHAR_TO_ZEND_STR ("this" ))
2023+ ),
2024+ zend_ast_create_zval_from_str (CHAR_TO_ZEND_STR (name ))
2025+ );
2026+ }
2027+
2028+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_inj_create_property_decl (char * name , zval * value ) {
2029+ return zend_ast_create (
2030+ ZEND_AST_PROP_ELEM ,
2031+ zend_ast_create_zval_from_str (CHAR_TO_ZEND_STR (name )),
2032+ value ? zend_ast_create_zval (value ) : NULL ,
2033+ NULL
2034+ );
2035+ }
2036+
2037+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_inj_var (char * name ) {
2038+ return zend_ast_create (
2039+ ZEND_AST_VAR ,
2040+ zend_ast_create_zval_from_str (CHAR_TO_ZEND_STR (name ))
2041+ );
2042+ }
2043+
2044+ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_inj_add_cf_construct (zend_ast * ast , uint32_t start_lineno , zend_ast * params , zend_ast * parent_arguments ) {
2045+ int i ;
2046+ zend_ast * body_ast = zend_ast_create_list (0 , ZEND_AST_STMT_LIST );
2047+ zend_ast * properties_ast = zend_ast_create_list (0 , ZEND_AST_PROP_DECL );
2048+
2049+ if (parent_arguments ){
2050+ zend_ast * parent = zend_ast_create_zval_from_str (CHAR_TO_ZEND_STR ("parent" ));
2051+ parent -> attr = ZEND_NAME_NOT_FQ ;
2052+ zend_ast * call = zend_ast_create (
2053+ ZEND_AST_STATIC_CALL ,
2054+ parent ,
2055+ zend_ast_create_zval_from_str (CHAR_TO_ZEND_STR (ZEND_CONSTRUCTOR_FUNC_NAME )),
2056+ parent_arguments
2057+ );
2058+
2059+ zend_ast_list_add (body_ast , call );
2060+ }
2061+
2062+ for (i = 0 ; i < ZEND_AST_CHILD_COUNT (params ); i ++ ){
2063+ zend_ast * class_prop = zend_ast_inj_this_var (ZEND_AST_PARAM_NAME (params , i ));
2064+ zend_ast * constructor_param = ZEND_AST_PARAM_AS_VAR (params , i );
2065+ zend_ast * prop_declaration = zend_ast_inj_create_property_decl (ZEND_AST_PARAM_NAME (params , i ), NULL );
2066+
2067+ zend_ast_list_add (properties_ast , prop_declaration );
2068+ zend_ast_list_add (body_ast , zend_ast_create (ZEND_AST_ASSIGN , class_prop , constructor_param ));
2069+ }
2070+
2071+ if (ZEND_AST_CHILD_COUNT (properties_ast )){
2072+ properties_ast -> attr = ZEND_ACC_PUBLIC ;
2073+ zend_ast_list_add (ast , properties_ast );
2074+ }
2075+
2076+ zend_ast * constructor = zend_ast_inj_create_method (
2077+ ZEND_CONSTRUCTOR_FUNC_NAME ,
2078+ start_lineno ,
2079+ ZEND_ACC_PUBLIC ,
2080+ params ,
2081+ body_ast
2082+ );
2083+ return zend_ast_list_add (ast , constructor );
2084+ }
2085+ /*
2086+ * ast_inject end
2087+ */
2088+
20412089/*
20422090 * Local variables:
20432091 * tab-width: 4
0 commit comments