#include "zend_API.h"
#include "zend_operators.h"
-ZEND_API zend_ast *zend_ast_create_constant(zval *zv)
-{
- zend_ast_zval *ast = emalloc(sizeof(zend_ast_zval));
- ast->kind = ZEND_CONST;
- ast->attr = 0;
- ZVAL_COPY_VALUE(&ast->val, zv);
- return (zend_ast *) ast;
-}
-
ZEND_API zend_ast *zend_ast_create_znode(znode *node)
{
zend_ast_znode *ast = emalloc(sizeof(zend_ast_znode));
ZEND_API zend_ast *zend_ast_create_zval_ex(zval *zv, zend_ast_attr attr)
{
zend_ast_zval *ast = emalloc(sizeof(zend_ast_zval));
- ast->kind = ZEND_CONST;
+ ast->kind = ZEND_AST_ZVAL;
ast->attr = attr;
ZVAL_COPY_VALUE(&ast->val, zv);
return (zend_ast *) ast;
{
int i;
- if (ast->kind == ZEND_CONST) {
+ if (ast->kind == ZEND_AST_ZVAL) {
return !Z_CONSTANT_P(zend_ast_get_zval(ast));
} else {
for (i = 0; i < ast->children; i++) {
boolean_not_function(result, &op1 TSRMLS_CC);
zval_dtor(&op1);
break;
- case ZEND_CONST:
+ case ZEND_AST_ZVAL:
ZVAL_DUP(result, zend_ast_get_zval(ast));
if (Z_OPT_CONSTANT_P(result)) {
zval_update_constant_ex(result, 1, scope TSRMLS_CC);
{
if (ast == NULL) {
return NULL;
- } else if (ast->kind == ZEND_CONST) {
- zend_ast *copy = zend_ast_create_constant(zend_ast_get_zval(ast));
+ } else if (ast->kind == ZEND_AST_ZVAL) {
+ zend_ast *copy = zend_ast_create_zval_ex(zend_ast_get_zval(ast), ast->attr);
zval_copy_ctor(zend_ast_get_zval(copy));
return copy;
} else if (ast->children) {
zend_ast *new = emalloc(sizeof(zend_ast) + sizeof(zend_ast *) * (ast->children - 1));
int i;
new->kind = ast->kind;
+ new->attr = ast->attr;
new->children = ast->children;
for (i = 0; i < ast->children; i++) {
new->child[i] = zend_ast_copy(ast->child[i]);
{
int i;
- if (ast->kind == ZEND_CONST) {
+ if (ast->kind == ZEND_AST_ZVAL) {
zval_ptr_dtor(zend_ast_get_zval(ast));
} else if (ast->kind != ZEND_AST_ZNODE) {
for (i = 0; i < ast->children; i++) {
{
zend_eval_const_expr(&ast TSRMLS_CC);
zend_compile_const_expr(&ast TSRMLS_CC);
- if (ast->kind == ZEND_CONST) {
+ if (ast->kind == ZEND_AST_ZVAL) {
ZVAL_COPY_VALUE(&result->u.constant, zend_ast_get_zval(ast));
if (Z_TYPE(result->u.constant) == IS_ARRAY) {
zend_make_immutable_array_r(&result->u.constant TSRMLS_CC);
static zend_bool zend_is_const_default_class_ref(zend_ast *name_ast) {
zval *name;
int fetch_type;
- if (name_ast->kind != ZEND_CONST) {
+ if (name_ast->kind != ZEND_AST_ZVAL) {
return 0;
}
static int zend_try_compile_cv(znode *result, zend_ast *ast TSRMLS_DC) {
zend_ast *name_ast = ast->child[0];
- if (name_ast->kind == ZEND_CONST) {
+ if (name_ast->kind == ZEND_AST_ZVAL) {
zend_string *name = zval_get_string(zend_ast_get_zval(name_ast));
if (zend_is_auto_global(name TSRMLS_CC)) {
zend_op *opline;
/* there is a chance someone is accessing $this */
- if (ast->kind != ZEND_CONST
+ if (ast->kind != ZEND_AST_ZVAL
&& CG(active_op_array)->scope && CG(active_op_array)->this_var == -1
) {
zend_string *key = STR_INIT("this", sizeof("this") - 1, 0);
}
static zend_bool is_this_fetch(zend_ast *ast) {
- if (ast->kind != ZEND_AST_VAR || ast->child[0]->kind != ZEND_CONST) {
+ if (ast->kind != ZEND_AST_VAR || ast->child[0]->kind != ZEND_AST_ZVAL) {
return 0;
}
/* Detects $a... = $a pattern */
zend_bool zend_is_assign_to_self(zend_ast *var_ast, zend_ast *expr_ast TSRMLS_DC) {
- if (expr_ast->kind != ZEND_AST_VAR || expr_ast->child[0]->kind != ZEND_CONST) {
+ if (expr_ast->kind != ZEND_AST_VAR || expr_ast->child[0]->kind != ZEND_AST_ZVAL) {
return 0;
}
var_ast = var_ast->child[0];
}
- if (var_ast->kind != ZEND_AST_VAR || var_ast->child[0]->kind != ZEND_CONST) {
+ if (var_ast->kind != ZEND_AST_VAR || var_ast->child[0]->kind != ZEND_AST_ZVAL) {
return 0;
}
znode name_node;
- if (name_ast->kind != ZEND_CONST) {
+ if (name_ast->kind != ZEND_AST_ZVAL) {
zend_compile_expr(&name_node, name_ast TSRMLS_CC);
zend_compile_dynamic_call(result, &name_node, params_ast TSRMLS_CC);
return;
zend_compile_expr(&elem_node, elem_ast TSRMLS_CC);
- if (elem_ast->kind == ZEND_CONST) {
+ if (elem_ast->kind == ZEND_AST_ZVAL) {
zval *zv = &elem_node.u.constant;
ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING);
}
zend_bool zend_is_allowed_in_const_expr(zend_ast_kind kind) {
- return kind == ZEND_CONST || kind == ZEND_AST_BINARY_OP
+ return kind == ZEND_AST_ZVAL || kind == ZEND_AST_BINARY_OP
|| kind == ZEND_AST_GREATER || kind == ZEND_AST_GREATER_EQUAL
|| kind == ZEND_AST_AND || kind == ZEND_AST_OR
|| kind == ZEND_BW_NOT || kind == ZEND_BOOL_NOT
zval result;
int fetch_type;
- if (class_ast->kind != ZEND_CONST) {
+ if (class_ast->kind != ZEND_AST_ZVAL) {
zend_error_noreturn(E_COMPILE_ERROR,
"Dynamic class names are not allowed in compile-time class constant references");
}
Z_CONST_FLAGS(result) = fetch_type;
zend_ast_destroy(ast);
- *ast_ptr = zend_ast_create_constant(&result);
+ *ast_ptr = zend_ast_create_zval(&result);
}
void zend_compile_const_expr_const(zend_ast **ast_ptr TSRMLS_DC) {
if (zend_constant_ct_subst(&result, &const_name.u.constant, 0 TSRMLS_CC)) {
zend_ast_destroy(ast);
- *ast_ptr = zend_ast_create_constant(&result.u.constant);
+ *ast_ptr = zend_ast_create_zval(&result.u.constant);
return;
}
}
zend_ast_destroy(ast);
- *ast_ptr = zend_ast_create_constant(&result.u.constant);
+ *ast_ptr = zend_ast_create_zval(&result.u.constant);
}
void zend_compile_const_expr_resolve_class_name(zend_ast **ast_ptr TSRMLS_DC) {
}
zend_ast_destroy(ast);
- *ast_ptr = zend_ast_create_constant(&result.u.constant);
+ *ast_ptr = zend_ast_create_zval(&result.u.constant);
}
void zend_compile_const_expr(zend_ast **ast_ptr TSRMLS_DC) {
zend_ast *ast = *ast_ptr;
- if (ast == NULL || ast->kind == ZEND_CONST) {
+ if (ast == NULL || ast->kind == ZEND_AST_ZVAL) {
return;
}
void zend_compile_expr(znode *result, zend_ast *ast TSRMLS_DC) {
switch (ast->kind) {
- case ZEND_CONST:
+ case ZEND_AST_ZVAL:
ZVAL_COPY(&result->u.constant, zend_ast_get_zval(ast));
result->op_type = IS_CONST;
return;
zend_ast *right_ast = ast->child[1];
zend_uchar opcode = ast->attr;
- if (left_ast->kind == ZEND_CONST && right_ast->kind == ZEND_CONST) {
+ if (left_ast->kind == ZEND_AST_ZVAL && right_ast->kind == ZEND_AST_ZVAL) {
binary_op_type op = get_binary_op(opcode);
zval result;
op(&result, zend_ast_get_zval(left_ast), zend_ast_get_zval(right_ast) TSRMLS_CC);
zend_ast_destroy(ast);
- *ast_ptr = zend_ast_create_constant(&result);
+ *ast_ptr = zend_ast_create_zval(&result);
}
}
ZEND_ASSERT(ast->kind == ZEND_AST_UNARY_PLUS || ast->kind == ZEND_AST_UNARY_MINUS);
- if (expr_ast->kind == ZEND_CONST) {
+ if (expr_ast->kind == ZEND_AST_ZVAL) {
binary_op_type op = ast->kind == ZEND_AST_UNARY_PLUS
? add_function : sub_function;
ZVAL_LONG(&left, 0);
op(&result, &left, zend_ast_get_zval(expr_ast) TSRMLS_CC);
zend_ast_destroy(ast);
- *ast_ptr = zend_ast_create_constant(&result);
+ *ast_ptr = zend_ast_create_zval(&result);
}
}
ZEND_ASSERT(ast->kind == ZEND_AST_GREATER || ast->kind == ZEND_AST_GREATER_EQUAL);
- if (left_ast->kind == ZEND_CONST && right_ast->kind == ZEND_CONST) {
+ if (left_ast->kind == ZEND_AST_ZVAL && right_ast->kind == ZEND_AST_ZVAL) {
binary_op_type op = ast->kind == ZEND_AST_GREATER
? is_smaller_function : is_smaller_or_equal_function;
zval result;
op(&result, zend_ast_get_zval(right_ast), zend_ast_get_zval(left_ast) TSRMLS_CC);
zend_ast_destroy(ast);
- *ast_ptr = zend_ast_create_constant(&result);
+ *ast_ptr = zend_ast_create_zval(&result);
}
}
zend_ast *key_ast = elem_ast->child[1];
zend_bool by_ref = elem_ast->attr;
- if (by_ref || (key_ast && key_ast->kind != ZEND_CONST) || value_ast->kind != ZEND_CONST) {
+ if (by_ref || (key_ast && key_ast->kind != ZEND_AST_ZVAL) || value_ast->kind != ZEND_AST_ZVAL) {
return;
}
}
zend_ast_destroy(ast);
zend_make_immutable_array(&array TSRMLS_CC);
- *ast_ptr = zend_ast_create_constant(&array);
+ *ast_ptr = zend_ast_create_zval(&array);
}
void zend_eval_const_expr(zend_ast **ast_ptr TSRMLS_DC) {
zend_ast *ast = *ast_ptr;
- if (!ast || ast->kind == ZEND_CONST || ast->kind == ZEND_AST_ZNODE) {
+ if (!ast || ast->kind == ZEND_AST_ZVAL || ast->kind == ZEND_AST_ZNODE) {
return;
}