Skip to content

Commit 169e0de

Browse files
author
felipe
committed
- Minor optimization (avoid to re-hash already computed var name hash)
git-svn-id: http://svn.php.net/repository/php/php-src/trunk@312306 c90b9560-bf6c-de11-be94-00142212c4b1
1 parent 0dcdae2 commit 169e0de

File tree

2 files changed

+12
-9
lines changed

2 files changed

+12
-9
lines changed

Zend/zend_compile.c

+11-9
Original file line numberDiff line numberDiff line change
@@ -291,10 +291,10 @@ static zend_uint get_temporary_variable(zend_op_array *op_array) /* {{{ */
291291
}
292292
/* }}} */
293293

294-
static int lookup_cv(zend_op_array *op_array, char* name, int name_len TSRMLS_DC) /* {{{ */
294+
static int lookup_cv(zend_op_array *op_array, char* name, int name_len, ulong hash TSRMLS_DC) /* {{{ */
295295
{
296296
int i = 0;
297-
ulong hash_value = zend_inline_hash_func(name, name_len+1);
297+
ulong hash_value = hash ? hash : zend_inline_hash_func(name, name_len+1);
298298

299299
while (i < op_array->last_var) {
300300
if (op_array->vars[i].name == name ||
@@ -642,7 +642,7 @@ void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar
642642
(CG(active_op_array)->last == 0 ||
643643
CG(active_op_array)->opcodes[CG(active_op_array)->last-1].opcode != ZEND_BEGIN_SILENCE)) {
644644
result->op_type = IS_CV;
645-
result->u.op.var = lookup_cv(CG(active_op_array), varname->u.constant.value.str.val, varname->u.constant.value.str.len TSRMLS_CC);
645+
result->u.op.var = lookup_cv(CG(active_op_array), varname->u.constant.value.str.val, varname->u.constant.value.str.len, 0 TSRMLS_CC);
646646
varname->u.constant.value.str.val = CG(active_op_array)->vars[result->u.op.var].name;
647647
result->EA = 0;
648648
return;
@@ -882,6 +882,7 @@ static zend_bool opline_is_fetch_this(const zend_op *opline TSRMLS_DC) /* {{{ */
882882
{
883883
if ((opline->opcode == ZEND_FETCH_W) && (opline->op1_type == IS_CONST)
884884
&& (Z_TYPE(CONSTANT(opline->op1.constant)) == IS_STRING)
885+
&& (Z_HASH_P(&CONSTANT(opline->op1.constant)) == THIS_HASHVAL)
885886
&& (Z_STRLEN(CONSTANT(opline->op1.constant)) == (sizeof("this")-1))
886887
&& !memcmp(Z_STRVAL(CONSTANT(opline->op1.constant)), "this", sizeof("this"))) {
887888
return 1;
@@ -1290,7 +1291,7 @@ void zend_do_end_variable_parse(znode *variable, int type, int arg_offset TSRMLS
12901291

12911292
this_var = opline_ptr->result.var;
12921293
if (CG(active_op_array)->this_var == -1) {
1293-
CG(active_op_array)->this_var = lookup_cv(CG(active_op_array), Z_STRVAL(CONSTANT(opline_ptr->op1.constant)), Z_STRLEN(CONSTANT(opline_ptr->op1.constant)) TSRMLS_CC);
1294+
CG(active_op_array)->this_var = lookup_cv(CG(active_op_array), Z_STRVAL(CONSTANT(opline_ptr->op1.constant)), Z_STRLEN(CONSTANT(opline_ptr->op1.constant)), Z_HASH_P(&CONSTANT(opline_ptr->op1.constant)) TSRMLS_CC);
12941295
Z_TYPE(CONSTANT(opline_ptr->op1.constant)) = IS_NULL;
12951296
} else {
12961297
zend_del_literal(CG(active_op_array), opline_ptr->op1.constant);
@@ -1302,7 +1303,7 @@ void zend_do_end_variable_parse(znode *variable, int type, int arg_offset TSRMLS
13021303
variable->u.op.var = CG(active_op_array)->this_var;
13031304
}
13041305
} else if (CG(active_op_array)->this_var == -1) {
1305-
CG(active_op_array)->this_var = lookup_cv(CG(active_op_array), estrndup("this", sizeof("this")-1), sizeof("this")-1 TSRMLS_CC);
1306+
CG(active_op_array)->this_var = lookup_cv(CG(active_op_array), estrndup("this", sizeof("this")-1), sizeof("this")-1, THIS_HASHVAL TSRMLS_CC);
13061307
}
13071308
}
13081309

@@ -1810,10 +1811,11 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con
18101811
zend_error(E_COMPILE_ERROR, "Cannot re-assign auto-global variable %s", Z_STRVAL(varname->u.constant));
18111812
} else {
18121813
var.op_type = IS_CV;
1813-
var.u.op.var = lookup_cv(CG(active_op_array), varname->u.constant.value.str.val, varname->u.constant.value.str.len TSRMLS_CC);
1814+
var.u.op.var = lookup_cv(CG(active_op_array), varname->u.constant.value.str.val, varname->u.constant.value.str.len, 0 TSRMLS_CC);
18141815
varname->u.constant.value.str.val = CG(active_op_array)->vars[var.u.op.var].name;
18151816
var.EA = 0;
1816-
if (Z_STRLEN(varname->u.constant) == sizeof("this")-1 &&
1817+
if (CG(active_op_array)->vars[var.u.op.var].hash_value == THIS_HASHVAL &&
1818+
Z_STRLEN(varname->u.constant) == sizeof("this")-1 &&
18171819
!memcmp(Z_STRVAL(varname->u.constant), "this", sizeof("this")-1)) {
18181820
if (CG(active_op_array)->scope &&
18191821
(CG(active_op_array)->fn_flags & ZEND_ACC_STATIC) == 0) {
@@ -2699,7 +2701,7 @@ void zend_do_begin_catch(znode *try_token, znode *class_name, znode *catch_var,
26992701
opline->op1_type = IS_CONST;
27002702
opline->op1.constant = zend_add_class_name_literal(CG(active_op_array), &catch_class.u.constant TSRMLS_CC);
27012703
opline->op2_type = IS_CV;
2702-
opline->op2.var = lookup_cv(CG(active_op_array), catch_var->u.constant.value.str.val, catch_var->u.constant.value.str.len TSRMLS_CC);
2704+
opline->op2.var = lookup_cv(CG(active_op_array), catch_var->u.constant.value.str.val, catch_var->u.constant.value.str.len, 0 TSRMLS_CC);
27032705
catch_var->u.constant.value.str.val = CG(active_op_array)->vars[opline->op2.var].name;
27042706
opline->result.num = 0; /* 1 means it's the last catch in the block */
27052707

@@ -5642,7 +5644,7 @@ void zend_do_indirect_references(znode *result, const znode *num_references, zno
56425644
fetch_simple_variable(result, variable, 1 TSRMLS_CC);
56435645
/* there is a chance someone is accessing $this */
56445646
if (CG(active_op_array)->scope && CG(active_op_array)->this_var == -1) {
5645-
CG(active_op_array)->this_var = lookup_cv(CG(active_op_array), estrndup("this", sizeof("this")-1), sizeof("this")-1 TSRMLS_CC);
5647+
CG(active_op_array)->this_var = lookup_cv(CG(active_op_array), estrndup("this", sizeof("this")-1), sizeof("this")-1, THIS_HASHVAL TSRMLS_CC);
56465648
}
56475649
}
56485650
/* }}} */

Zend/zend_compile.h

+1
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ typedef struct _zend_try_catch_element {
134134
zend_uint catch_op; /* ketchup! */
135135
} zend_try_catch_element;
136136

137+
#define THIS_HASHVAL 275574653UL
137138

138139
/* method flags (types) */
139140
#define ZEND_ACC_STATIC 0x01

0 commit comments

Comments
 (0)