mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
Compile const refs to CONST
This commit is contained in:
parent
b83c70416b
commit
080e8bffa5
@ -7795,7 +7795,7 @@ zend_bool zend_is_allowed_in_const_expr(zend_ast_kind kind) {
|
||||
|| kind == ZEND_AST_UNARY_PLUS || kind == ZEND_AST_UNARY_MINUS
|
||||
|| kind == ZEND_AST_CONDITIONAL
|
||||
|| kind == ZEND_AST_ARRAY || kind == ZEND_AST_ARRAY_ELEM
|
||||
|| kind == ZEND_AST_CLASS_CONST;
|
||||
|| kind == ZEND_AST_CONST || kind == ZEND_AST_CLASS_CONST;
|
||||
}
|
||||
|
||||
void zend_compile_const_expr_class_const(zend_ast **ast_ptr TSRMLS_DC) {
|
||||
@ -7836,6 +7836,38 @@ void zend_compile_const_expr_class_const(zend_ast **ast_ptr TSRMLS_DC) {
|
||||
*ast_ptr = zend_ast_create_constant(&result);
|
||||
}
|
||||
|
||||
void zend_compile_const_expr_const(zend_ast **ast_ptr TSRMLS_DC) {
|
||||
zend_ast *ast = *ast_ptr;
|
||||
zend_ast *const_name_ast = ast->child[0];
|
||||
zend_bool check_namespace = const_name_ast->attr;
|
||||
zend_bool is_compound;
|
||||
|
||||
znode const_name, result;
|
||||
zend_compile_expr(&const_name, const_name_ast TSRMLS_CC);
|
||||
|
||||
is_compound = zend_is_compound_name(&const_name.u.constant);
|
||||
|
||||
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);
|
||||
return;
|
||||
}
|
||||
|
||||
zend_resolve_const_name(&const_name, &check_namespace TSRMLS_CC);
|
||||
result = const_name;
|
||||
|
||||
Z_TYPE_INFO(result.u.constant) = IS_CONSTANT_EX;
|
||||
if (IS_INTERNED(Z_STR(result.u.constant))) {
|
||||
Z_TYPE_FLAGS(result.u.constant) &= ~ (IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE);
|
||||
}
|
||||
if (!is_compound) {
|
||||
Z_CONST_FLAGS(result.u.constant) = IS_CONSTANT_UNQUALIFIED;
|
||||
}
|
||||
|
||||
zend_ast_destroy(ast);
|
||||
*ast_ptr = zend_ast_create_constant(&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) {
|
||||
@ -7857,6 +7889,9 @@ void zend_compile_const_expr(zend_ast **ast_ptr TSRMLS_DC) {
|
||||
case ZEND_AST_CLASS_CONST:
|
||||
zend_compile_const_expr_class_const(ast_ptr TSRMLS_CC);
|
||||
break;
|
||||
case ZEND_AST_CONST:
|
||||
zend_compile_const_expr_const(ast_ptr TSRMLS_CC);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -982,9 +982,18 @@ static_scalar_value:
|
||||
| class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING
|
||||
{ $$.u.ast = zend_ast_create_binary(
|
||||
ZEND_AST_CLASS_CONST, AST_ZVAL(&$1), AST_ZVAL(&$3)); }
|
||||
| namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_CT, 1 TSRMLS_CC); $$.u.ast = AST_ZVAL(&$$); }
|
||||
| T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_CT, 0 TSRMLS_CC); $$.u.ast = AST_ZVAL(&$$); }
|
||||
| T_NS_SEPARATOR namespace_name { zval tmp; ZVAL_NEW_STR(&tmp, STR_ALLOC(Z_STRLEN($2.u.constant)+1, 0)); Z_STRVAL(tmp)[0] = '\\'; memcpy(Z_STRVAL(tmp) + 1, Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); if (Z_DELREF($2.u.constant) == 0) {efree(Z_STR($2.u.constant));} Z_STR($2.u.constant) = Z_STR(tmp); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); $$.u.ast = AST_ZVAL(&$$); }
|
||||
| namespace_name
|
||||
{ $$.u.ast = zend_ast_create_unary(
|
||||
ZEND_AST_CONST, zend_ast_create_zval_ex(&$1.u.constant, 1)); }
|
||||
| T_NAMESPACE T_NS_SEPARATOR namespace_name
|
||||
{ ZVAL_EMPTY_STRING(&$1.u.constant);
|
||||
zend_do_build_namespace_name(&$1, &$1, &$3 TSRMLS_CC);
|
||||
$$.u.ast = zend_ast_create_unary(ZEND_AST_CONST, AST_ZVAL(&$1)); }
|
||||
| T_NS_SEPARATOR namespace_name
|
||||
{ zval tmp; ZVAL_NEW_STR(&tmp, STR_ALLOC(Z_STRLEN($2.u.constant)+1, 0)); Z_STRVAL(tmp)[0] = '\\'; memcpy(Z_STRVAL(tmp) + 1, Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1);
|
||||
if (Z_DELREF($2.u.constant) == 0) { efree(Z_STR($2.u.constant)); }
|
||||
Z_STR($2.u.constant) = Z_STR(tmp);
|
||||
$$.u.ast = zend_ast_create_unary(ZEND_AST_CONST, AST_ZVAL(&$2)); }
|
||||
| common_scalar { $$.u.ast = $1.u.ast; }
|
||||
| T_ARRAY '(' static_array_pair_list ')' { $$.u.ast = $3.u.ast; }
|
||||
| '[' static_array_pair_list ']' { $$.u.ast = $2.u.ast; }
|
||||
|
Loading…
Reference in New Issue
Block a user