]> granicus.if.org Git - php/commitdiff
Add ability to specify additional attr in AST
authorNikita Popov <nikic@php.net>
Thu, 19 Jun 2014 11:44:17 +0000 (13:44 +0200)
committerNikita Popov <nikic@php.net>
Thu, 19 Jun 2014 11:48:50 +0000 (13:48 +0200)
Zend/zend_ast.c
Zend/zend_ast.h
Zend/zend_compile.h

index 9a795599fe5ce4a6eaca422a61200ee098cf4d62..98aca3c6af8144367da5ada52d58547f92390693 100644 (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;
 }
index cceb3b0f8f0cee3b78c20374c42ee6e5fd251944..83e1f64bd90fe1c13d6e22ae9356f771c6dc4ccd 100644 (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));
 }
index 6dfa74f023022b022ca5d2e6d0dd000130d0f47d..d375cf7adde671e8e65cf9e63ba93915c907bd9b 100644 (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);