From: Nikita Popov Date: Thu, 19 Jun 2014 11:44:17 +0000 (+0200) Subject: Add ability to specify additional attr in AST X-Git-Tag: POST_AST_MERGE^2~197 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=55ab55c417c3707bc90dc6e66cd84715ef675323;p=php Add ability to specify additional attr in AST --- diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 9a795599fe..98aca3c6af 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -27,7 +27,7 @@ ZEND_API zend_ast *zend_ast_create_constant(zval *zv) { zend_ast_zval *ast = emalloc(sizeof(zend_ast_zval)); ast->kind = ZEND_CONST; - ast->EA = 0; + ast->attr = 0; ZVAL_COPY_VALUE(&ast->val, zv); return (zend_ast *) ast; } @@ -36,37 +36,39 @@ ZEND_API zend_ast *zend_ast_create_znode(znode *node) { zend_ast_znode *ast = emalloc(sizeof(zend_ast_znode)); ast->kind = ZEND_AST_ZNODE; - ast->EA = 0; + ast->attr = 0; ast->node = *node; return (zend_ast *) ast; } -ZEND_API zend_ast* zend_ast_create_unary(uint kind, zend_ast *op0) +ZEND_API zend_ast* zend_ast_create_unary_ex(zend_ast_kind kind, zend_ast_attr attr, zend_ast *op0) { zend_ast *ast = emalloc(sizeof(zend_ast)); ast->kind = kind; - ast->EA = 0; + ast->attr = attr; ast->children = 1; ast->child[0] = op0; return ast; } -ZEND_API zend_ast* zend_ast_create_binary(uint kind, zend_ast *op0, zend_ast *op1) -{ +ZEND_API zend_ast* zend_ast_create_binary_ex( + zend_ast_kind kind, zend_ast_attr attr, zend_ast *op0, zend_ast *op1 +) { zend_ast *ast = emalloc(sizeof(zend_ast) + sizeof(zend_ast *)); ast->kind = kind; - ast->EA = 0; + ast->attr = attr; ast->children = 2; ast->child[0] = op0; ast->child[1] = op1; return ast; } -ZEND_API zend_ast* zend_ast_create_ternary(uint kind, zend_ast *op0, zend_ast *op1, zend_ast *op2) -{ +ZEND_API zend_ast* zend_ast_create_ternary_ex( + zend_ast_kind kind, zend_ast_attr attr, zend_ast *op0, zend_ast *op1, zend_ast *op2 +) { zend_ast *ast = emalloc(sizeof(zend_ast) + sizeof(zend_ast *) * 2); ast->kind = kind; - ast->EA = 0; + ast->attr = attr; ast->children = 3; ast->child[0] = op0; ast->child[1] = op1; @@ -74,12 +76,12 @@ ZEND_API zend_ast* zend_ast_create_ternary(uint kind, zend_ast *op0, zend_ast *o return ast; } -ZEND_API zend_ast *zend_ast_create_dynamic(uint kind) +ZEND_API zend_ast *zend_ast_create_dynamic(zend_ast_kind kind) { /* use 4 children as default */ zend_ast *ast = emalloc(sizeof(zend_ast) + sizeof(zend_ast *) * 3); ast->kind = kind; - ast->EA = 0; + ast->attr = 0; ast->children = 0; return ast; } diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index cceb3b0f8f..83e1f64bd9 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -24,7 +24,7 @@ #include "zend.h" -typedef enum _zend_ast_kind { +enum _zend_ast_kind { /* first 256 kinds are reserved for opcodes */ ZEND_CONST = 256, /* TODO.AST: Split in constant lookup and literal zval */ ZEND_BOOL_AND, @@ -71,18 +71,21 @@ typedef enum _zend_ast_kind { ZEND_AST_CAST_OBJECT, ZEND_AST_CONDITIONAL, -} zend_ast_kind; +}; + +typedef unsigned short zend_ast_kind; +typedef unsigned short zend_ast_attr; struct _zend_ast { - unsigned short kind; - unsigned short EA; - zend_uint children; - zend_ast *child[1]; + zend_ast_kind kind; /* Type of the node (either opcode or ZEND_AST_* constant) */ + zend_ast_attr attr; /* Additional attribute, use depending on node type */ + zend_uint children; /* Number of children */ + zend_ast *child[1]; /* Array of children (using struct hack) */ }; typedef struct _zend_ast_zval { - unsigned short kind; - unsigned short EA; + zend_ast_kind kind; + zend_ast_attr attr; zval val; } zend_ast_zval; @@ -92,10 +95,14 @@ static inline zval *zend_ast_get_zval(zend_ast *ast) { ZEND_API zend_ast *zend_ast_create_constant(zval *zv); -ZEND_API zend_ast *zend_ast_create_unary(uint kind, zend_ast *op0); -ZEND_API zend_ast *zend_ast_create_binary(uint kind, zend_ast *op0, zend_ast *op1); -ZEND_API zend_ast *zend_ast_create_ternary(uint kind, zend_ast *op0, zend_ast *op1, zend_ast *op2); -ZEND_API zend_ast* zend_ast_create_dynamic(uint kind); +ZEND_API zend_ast *zend_ast_create_unary_ex( + zend_ast_kind kind, zend_ast_attr attr, zend_ast *op0); +ZEND_API zend_ast *zend_ast_create_binary_ex( + zend_ast_kind kind, zend_ast_attr attr, zend_ast *op0, zend_ast *op1); +ZEND_API zend_ast *zend_ast_create_ternary_ex( + zend_ast_kind kind, zend_ast_attr attr, zend_ast *op0, zend_ast *op1, zend_ast *op2); + +ZEND_API zend_ast* zend_ast_create_dynamic(zend_ast_kind kind); ZEND_API void zend_ast_dynamic_add(zend_ast **ast, zend_ast *op); ZEND_API void zend_ast_dynamic_shrink(zend_ast **ast); @@ -106,6 +113,18 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s ZEND_API zend_ast *zend_ast_copy(zend_ast *ast); ZEND_API void zend_ast_destroy(zend_ast *ast); +static inline zend_ast *zend_ast_create_unary(zend_ast_kind kind, zend_ast *op0) { + return zend_ast_create_unary_ex(kind, 0, op0); +} +static inline zend_ast *zend_ast_create_binary(zend_ast_kind kind, zend_ast *op0, zend_ast *op1) { + return zend_ast_create_binary_ex(kind, 0, op0, op1); +} +static inline zend_ast *zend_ast_create_ternary( + zend_ast_kind kind, zend_ast *op0, zend_ast *op1, zend_ast *op2 +) { + return zend_ast_create_ternary_ex(kind, 0, op0, op1, op2); +} + static inline zend_ast *zend_ast_create_var(zval *name) { return zend_ast_create_unary(ZEND_AST_VAR, zend_ast_create_constant(name)); } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 6dfa74f023..d375cf7add 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -89,8 +89,8 @@ typedef struct _znode { /* used only during compilation */ /* Temporarily defined here, to avoid header ordering issues */ typedef struct _zend_ast_znode { - unsigned short kind; - unsigned short EA; + zend_ast_kind kind; + zend_ast_attr attr; znode node; } zend_ast_znode; ZEND_API zend_ast *zend_ast_create_znode(znode *node);