Add ability to specify additional attr in AST

This commit is contained in:
Nikita Popov 2014-06-19 13:44:17 +02:00
parent 89ecd73a04
commit 55ab55c417
3 changed files with 47 additions and 26 deletions

View File

@ -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;
}

View File

@ -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));
}

View File

@ -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);