summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2010-07-15 14:21:25 +0000
committerFelipe Pena <felipe@php.net>2010-07-15 14:21:25 +0000
commit14477dbb4db921adcd4997730daeb73f9cd8c47b (patch)
treeafde47bc277a3343837f9dd4382098f8f50271f0
parentdfe0c17e68c7d482a427f2ef85352a628d1fe70e (diff)
downloadphp-git-14477dbb4db921adcd4997730daeb73f9cd8c47b.tar.gz
- Minor compiler optimizations
-rw-r--r--Zend/zend_compile.c14
-rw-r--r--Zend/zend_language_parser.y23
2 files changed, 22 insertions, 15 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index f7578ad92a..1f5fae8cc5 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -661,12 +661,14 @@ void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar
zend_op opline;
zend_op *opline_ptr;
zend_llist *fetch_list_ptr;
+ zend_bool is_auto_global = 0;
if (varname->op_type == IS_CONST) {
if (Z_TYPE(varname->u.constant) != IS_STRING) {
convert_to_string(&varname->u.constant);
}
- if (!zend_is_auto_global(varname->u.constant.value.str.val, varname->u.constant.value.str.len TSRMLS_CC) &&
+ is_auto_global = zend_is_auto_global(varname->u.constant.value.str.val, varname->u.constant.value.str.len TSRMLS_CC);
+ if (!is_auto_global &&
!(varname->u.constant.value.str.len == (sizeof("this")-1) &&
!memcmp(varname->u.constant.value.str.val, "this", sizeof("this"))) &&
(CG(active_op_array)->last == 0 ||
@@ -696,7 +698,7 @@ void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar
if (varname->op_type == IS_CONST) {
CALCULATE_LITERAL_HASH(opline_ptr->op1.constant);
- if (zend_is_auto_global(varname->u.constant.value.str.val, varname->u.constant.value.str.len TSRMLS_CC)) {
+ if (is_auto_global) {
opline_ptr->extended_value = ZEND_FETCH_GLOBAL;
}
}
@@ -798,7 +800,7 @@ void zend_do_fetch_static_member(znode *result, znode *class_name TSRMLS_DC) /*
void fetch_array_begin(znode *result, znode *varname, znode *first_dim TSRMLS_DC) /* {{{ */
{
- fetch_simple_variable(result, varname, 1 TSRMLS_CC);
+ fetch_simple_variable_ex(result, varname, 1, ZEND_FETCH_W TSRMLS_CC);
fetch_array_dim(result, result, first_dim TSRMLS_CC);
}
@@ -5418,7 +5420,7 @@ void zend_do_fetch_static_variable(znode *varname, const znode *static_assignmen
if (varname->op_type == IS_CONST) {
zval_copy_ctor(&varname->u.constant);
}
- fetch_simple_variable(&lval, varname, 0 TSRMLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */
+ fetch_simple_variable_ex(&lval, varname, 0, ZEND_FETCH_W TSRMLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */
if (fetch_type == ZEND_FETCH_LEXICAL) {
znode dummy;
@@ -5480,7 +5482,7 @@ void zend_do_fetch_global_variable(znode *varname, const znode *static_assignmen
if (varname->op_type == IS_CONST) {
zval_copy_ctor(&varname->u.constant);
}
- fetch_simple_variable(&lval, varname, 0 TSRMLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */
+ fetch_simple_variable_ex(&lval, varname, 0, ZEND_FETCH_W TSRMLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */
zend_do_assign_ref(NULL, &lval, &result TSRMLS_CC);
CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result_type |= EXT_TYPE_UNUSED;
@@ -5529,7 +5531,7 @@ void zend_do_indirect_references(znode *result, const znode *num_references, zno
*variable = *result;
}
zend_do_begin_variable_parse(TSRMLS_C);
- fetch_simple_variable(result, variable, 1 TSRMLS_CC);
+ fetch_simple_variable_ex(result, variable, 1, ZEND_FETCH_W TSRMLS_CC);
}
/* }}} */
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index cf87380aac..5e97867ac4 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -32,6 +32,11 @@
#define YYNOERRORRECOVERY
#define NDEBUG
+
+#define ZEND_DO_TICKS() \
+ if (Z_LVAL(CG(declarables).ticks)) { \
+ void zend_do_ticks(TSRMLS_D); \
+ }
}
%name zend_lang_parse
@@ -141,7 +146,7 @@ namespace_start ::= NAMESPACE. { zend_do_begin_namespace(NULL, 1 TSRMLS_CC); }
namespace_start2 ::= NAMESPACE namespace_name(B). { zend_do_begin_namespace(&B, 1 TSRMLS_CC); }
-top_statement ::= SEMICOLON. { zend_do_ticks(TSRMLS_C); }
+top_statement ::= SEMICOLON. { ZEND_DO_TICKS(); }
top_statement ::= statement. { zend_verify_namespace(TSRMLS_C); }
top_statement ::= function_declaration_statement. { zend_verify_namespace(TSRMLS_C); zend_do_early_binding(TSRMLS_C); }
top_statement ::= class_declaration_statement. { zend_verify_namespace(TSRMLS_C); zend_do_early_binding(TSRMLS_C); }
@@ -176,7 +181,7 @@ inner_statement ::= function_declaration_statement.
inner_statement ::= class_declaration_statement.
inner_statement ::= HALT_COMPILER LPAREN RPAREN SEMICOLON. { zend_error(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope"); }
-statement ::= unticked_statement. { zend_do_ticks(TSRMLS_C); }
+statement ::= unticked_statement. { ZEND_DO_TICKS(); }
statement ::= STRING(B) COLON. { zend_do_label(&B TSRMLS_CC); }
@@ -331,9 +336,9 @@ unset_variables ::= unset_variables COMMA unset_variable.
unset_variable(A) ::= variable(B). { zend_do_end_variable_parse(&B, BP_VAR_UNSET, 0 TSRMLS_CC); zend_do_unset(&B TSRMLS_CC); A = B; }
-function_declaration_statement ::= unticked_function_declaration_statement. { zend_do_ticks(TSRMLS_C); }
+function_declaration_statement ::= unticked_function_declaration_statement. { ZEND_DO_TICKS(); }
-class_declaration_statement ::= unticked_class_declaration_statement. { zend_do_ticks(TSRMLS_C); }
+class_declaration_statement ::= unticked_class_declaration_statement. { ZEND_DO_TICKS(); }
is_reference(A) ::= . { A.op_type = ZEND_RETURN_VAL; }
is_reference(A) ::= BW_AND. { A.op_type = ZEND_RETURN_REF; }
@@ -891,7 +896,7 @@ base_variable(A) ::= static_member(B). { A = B
reference_variable(A) ::= reference_variable(B) LBRACKET dim_offset(C) RBRACKET. { fetch_array_dim(&A, &B, &C TSRMLS_CC); }
reference_variable(A) ::= reference_variable(B) LBRACE expr(C) RBRACE. { fetch_string_offset(&A, &B, &C TSRMLS_CC); }
-reference_variable(A) ::= compound_variable(B). { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&A, &B, 1 TSRMLS_CC); }
+reference_variable(A) ::= compound_variable(B). { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable_ex(&A, &B, 1, ZEND_FETCH_W TSRMLS_CC); }
compound_variable(A) ::= VARIABLE(B). { A = B; }
compound_variable(A) ::= DOLLAR LBRACE expr(B) RBRACE. { A = B; }
@@ -947,16 +952,16 @@ encaps_list(A) ::= ENCAPSED_AND_WHITESPACE(B) encaps_var(C). { zend_do_add_stri
encaps_var_i(A) ::= VARIABLE(B) LBRACKET. { zend_do_begin_variable_parse(TSRMLS_C); A = B; }
-encaps_var(A) ::= VARIABLE(B). { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&A, &B, 1 TSRMLS_CC); }
+encaps_var(A) ::= VARIABLE(B). { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable_ex(&A, &B, 1, ZEND_FETCH_W TSRMLS_CC); }
encaps_var(A) ::= encaps_var_i(B) encaps_var_offset(C) RBRACKET. { fetch_array_begin(&A, &B, &C TSRMLS_CC); }
-encaps_var(A) ::= VARIABLE(B) OBJECT_OPERATOR(C) STRING(D). { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&C, &B, 1 TSRMLS_CC); zend_do_fetch_property(&A, &C, &D TSRMLS_CC); }
-encaps_var(A) ::= DOLLAR_OPEN_CURLY_BRACES expr(B) RBRACE. { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&A, &B, 1 TSRMLS_CC); }
+encaps_var(A) ::= VARIABLE(B) OBJECT_OPERATOR(C) STRING(D). { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable_ex(&C, &B, 1, ZEND_FETCH_W TSRMLS_CC); zend_do_fetch_property(&A, &C, &D TSRMLS_CC); }
+encaps_var(A) ::= DOLLAR_OPEN_CURLY_BRACES expr(B) RBRACE. { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable_ex(&A, &B, 1, ZEND_FETCH_W TSRMLS_CC); }
encaps_var(A) ::= DOLLAR_OPEN_CURLY_BRACES STRING_VARNAME(B) LBRACKET expr(C) RBRACKET RBRACE. { zend_do_begin_variable_parse(TSRMLS_C); fetch_array_begin(&A, &B, &C TSRMLS_CC); }
encaps_var(A) ::= CURLY_OPEN variable(B) RBRACE. { A = B; }
encaps_var_offset(A) ::= STRING(B). { A = B; }
encaps_var_offset(A) ::= NUM_STRING(B). { A = B; }
-encaps_var_offset(A) ::= VARIABLE(B). { fetch_simple_variable(&A, &B, 1 TSRMLS_CC); }
+encaps_var_offset(A) ::= VARIABLE(B). { fetch_simple_variable_ex(&A, &B, 1, ZEND_FETCH_W TSRMLS_CC); }
internal_functions_in_yacc(A) ::= ISSET LPAREN isset_variables(B) RPAREN. { A = B; }
internal_functions_in_yacc(A) ::= EMPTY LPAREN variable(B) RPAREN. { zend_do_isset_or_isempty(ZEND_ISEMPTY, &A, &B TSRMLS_CC); }