Port ZEND_BIND_GLOBAL optimization

This commit is contained in:
Nikita Popov 2014-07-22 20:24:47 +02:00
parent d4d4b69e72
commit 1859674061
2 changed files with 16 additions and 12 deletions

View File

@ -4453,24 +4453,27 @@ void zend_compile_clone(znode *result, zend_ast *ast TSRMLS_DC) {
void zend_compile_global_var(zend_ast *ast TSRMLS_DC) {
zend_ast *var_ast = ast->child[0];
zend_ast *name_ast = var_ast->child[0];
znode var_node, result;
znode name_node, result;
zend_compile_expr(&var_node, var_ast TSRMLS_CC);
if (var_node.op_type == IS_CONST) {
if (Z_TYPE(var_node.u.constant) != IS_STRING) {
convert_to_string(&var_node.u.constant);
zend_compile_expr(&name_node, name_ast TSRMLS_CC);
if (name_node.op_type == IS_CONST) {
if (Z_TYPE(name_node.u.constant) != IS_STRING) {
convert_to_string(&name_node.u.constant);
}
}
emit_op(&result, ZEND_FETCH_W, &var_node, NULL TSRMLS_CC);
if (zend_try_compile_cv(&result, var_ast TSRMLS_CC) == SUCCESS) {
emit_op(NULL, ZEND_BIND_GLOBAL, &result, &name_node TSRMLS_CC);
} else {
emit_op(&result, ZEND_FETCH_W, &name_node, NULL TSRMLS_CC);
// TODO.AST Avoid double fetch
//opline->extended_value = ZEND_FETCH_GLOBAL_LOCK;
// TODO.AST Avoid double fetch
//opline->extended_value = ZEND_FETCH_GLOBAL_LOCK;
zend_ast *fetch_ast = zend_ast_create_unary(ZEND_AST_VAR, var_ast);
zend_compile_assign_ref_common(NULL, fetch_ast, &result TSRMLS_CC);
efree(fetch_ast);
zend_compile_assign_ref_common(NULL, var_ast, &result TSRMLS_CC);
}
}
static void zend_compile_static_var_common(

View File

@ -579,7 +579,8 @@ global_var_list:
global_var:
simple_variable
{ $$.u.ast = zend_ast_create_unary(ZEND_AST_GLOBAL, $1.u.ast); }
{ $$.u.ast = zend_ast_create_unary(ZEND_AST_GLOBAL,
zend_ast_create_unary(ZEND_AST_VAR, $1.u.ast)); }
;