mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Add ability to specify additional attr in AST
This commit is contained in:
parent
89ecd73a04
commit
55ab55c417
@ -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;
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user