Skip to content

Commit fc5fdf7

Browse files
author
rjhdby
committed
initial commit
1 parent 3b5cdcc commit fc5fdf7

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

Zend/zend_ast.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,47 @@ 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+
399440
static int zend_ast_add_array_element(zval *result, zval *offset, zval *expr)
400441
{
401442
switch (Z_TYPE_P(offset)) {

Zend/zend_ast.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ ZEND_API zend_ast *zend_ast_create_list(uint32_t init_children, zend_ast_kind ki
261261
#endif
262262

263263
ZEND_API zend_ast * ZEND_FASTCALL zend_ast_list_add(zend_ast *list, zend_ast *op);
264+
ZEND_API zend_ast * ZEND_FASTCALL zend_ast_add_constructor(zend_ast *ast, uint32_t start_lineno, zend_ast *params);
264265

265266
ZEND_API zend_ast *zend_ast_create_decl(
266267
zend_ast_kind kind, uint32_t flags, uint32_t start_lineno, zend_string *doc_comment,

Zend/zend_language_parser.y

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,9 +503,14 @@ class_declaration_statement:
503503
class_modifiers T_CLASS { $<num>$ = CG(zend_lineno); }
504504
T_STRING extends_from implements_list backup_doc_comment '{' class_statement_list '}'
505505
{ $$ = zend_ast_create_decl(ZEND_AST_CLASS, $1, $<num>3, $7, zend_ast_get_str($4), $5, $6, $9, NULL); }
506-
| T_CLASS { $<num>$ = CG(zend_lineno); }
506+
| T_CLASS
507507
T_STRING extends_from implements_list backup_doc_comment '{' class_statement_list '}'
508-
{ $$ = zend_ast_create_decl(ZEND_AST_CLASS, 0, $<num>2, $6, zend_ast_get_str($3), $4, $5, $8, NULL); }
508+
{ $$ = zend_ast_create_decl(ZEND_AST_CLASS, 0, CG(zend_lineno), $5, zend_ast_get_str($2), $3, $4, $7, NULL); }
509+
| T_CLASS
510+
T_STRING '(' parameter_list ')' extends_from implements_list backup_doc_comment '{' class_statement_list '}'
511+
{ $$ = zend_ast_create_decl(ZEND_AST_CLASS, 0, CG(zend_lineno), $8, zend_ast_get_str($2), $6,
512+
$7, zend_ast_add_constructor($10, CG(zend_lineno), $4), NULL);
513+
}
509514
;
510515

511516
class_modifiers:
@@ -714,7 +719,6 @@ class_statement_list:
714719
{ $$ = zend_ast_create_list(0, ZEND_AST_STMT_LIST); }
715720
;
716721

717-
718722
class_statement:
719723
variable_modifiers property_list ';'
720724
{ $$ = $2; $$->attr = $1; }

0 commit comments

Comments
 (0)