summaryrefslogtreecommitdiff
path: root/Zend/zend_execute_API.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-04-27 18:30:33 +0300
committerDmitry Stogov <dmitry@zend.com>2015-04-27 18:30:33 +0300
commit1800bed1045a43d2478c0265a26fe0675fb5a6c1 (patch)
treeadb28a3f30d8ba3ab2274a0458928c276df4dc2e /Zend/zend_execute_API.c
parentecaf49eb290e0d665b86c8ece1d86dec70cb252f (diff)
downloadphp-git-1800bed1045a43d2478c0265a26fe0675fb5a6c1.tar.gz
Micro optimizations
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r--Zend/zend_execute_API.c119
1 files changed, 74 insertions, 45 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 61ee1e103e..ab86dc6068 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1471,7 +1471,6 @@ ZEND_API int zend_delete_global_variable(zend_string *name) /* {{{ */
ZEND_API zend_array *zend_rebuild_symbol_table(void) /* {{{ */
{
- int i;
zend_execute_data *ex;
zend_array *symbol_table;
@@ -1503,9 +1502,16 @@ ZEND_API zend_array *zend_rebuild_symbol_table(void) /* {{{ */
zend_hash_real_init(symbol_table, 0);
/*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/
}
- for (i = 0; i < ex->func->op_array.last_var; i++) {
- _zend_hash_append_ind(symbol_table, ex->func->op_array.vars[i],
- ZEND_CALL_VAR_NUM(ex, i));
+ if (EXPECTED(ex->func->op_array.last_var)) {
+ zend_string **str = ex->func->op_array.vars;
+ zend_string **end = str + ex->func->op_array.last_var;
+ zval *var = ZEND_CALL_VAR_NUM(ex, 0);
+
+ do {
+ _zend_hash_append_ind(symbol_table, *str, var);
+ str++;
+ var++;
+ } while (str != end);
}
return symbol_table;
}
@@ -1513,46 +1519,60 @@ ZEND_API zend_array *zend_rebuild_symbol_table(void) /* {{{ */
ZEND_API void zend_attach_symbol_table(zend_execute_data *execute_data) /* {{{ */
{
- int i;
zend_op_array *op_array = &execute_data->func->op_array;
HashTable *ht = execute_data->symbol_table;
/* copy real values from symbol table into CV slots and create
INDIRECT references to CV in symbol table */
- for (i = 0; i < op_array->last_var; i++) {
- zval *zv = zend_hash_find(ht, op_array->vars[i]);
+ if (EXPECTED(op_array->last_var)) {
+ zend_string **str = op_array->vars;
+ zend_string **end = str + op_array->last_var;
+ zval *var = EX_VAR_NUM(0);
- if (zv) {
- if (Z_TYPE_P(zv) == IS_INDIRECT) {
- zval *val = Z_INDIRECT_P(zv);
+ do {
+ zval *zv = zend_hash_find(ht, *str);
- ZVAL_COPY_VALUE(EX_VAR_NUM(i), val);
+ if (zv) {
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zval *val = Z_INDIRECT_P(zv);
+
+ ZVAL_COPY_VALUE(var, val);
+ } else {
+ ZVAL_COPY_VALUE(var, zv);
+ }
} else {
- ZVAL_COPY_VALUE(EX_VAR_NUM(i), zv);
+ ZVAL_UNDEF(var);
+ zv = zend_hash_add_new(ht, *str, var);
}
- } else {
- ZVAL_UNDEF(EX_VAR_NUM(i));
- zv = zend_hash_add_new(ht, op_array->vars[i], EX_VAR_NUM(i));
- }
- ZVAL_INDIRECT(zv, EX_VAR_NUM(i));
+ ZVAL_INDIRECT(zv, var);
+ str++;
+ var++;
+ } while (str != end);
}
}
/* }}} */
ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data) /* {{{ */
{
- int i;
zend_op_array *op_array = &execute_data->func->op_array;
HashTable *ht = execute_data->symbol_table;
/* copy real values from CV slots into symbol table */
- for (i = 0; i < op_array->last_var; i++) {
- if (Z_TYPE_P(EX_VAR_NUM(i)) == IS_UNDEF) {
- zend_hash_del(ht, op_array->vars[i]);
- } else {
- zend_hash_update(ht, op_array->vars[i], EX_VAR_NUM(i));
- ZVAL_UNDEF(EX_VAR_NUM(i));
- }
+ if (EXPECTED(op_array->last_var)) {
+ zend_string **str = op_array->vars;
+ zend_string **end = str + op_array->last_var;
+ zval *var = EX_VAR_NUM(0);
+
+ do {
+ if (Z_TYPE_P(var) == IS_UNDEF) {
+ zend_hash_del(ht, *str);
+ } else {
+ zend_hash_update(ht, *str, var);
+ ZVAL_UNDEF(var);
+ }
+ str++;
+ var++;
+ } while (str != end);
}
}
/* }}} */
@@ -1569,15 +1589,21 @@ ZEND_API int zend_set_local_var(zend_string *name, zval *value, int force) /* {{
if (!execute_data->symbol_table) {
zend_ulong h = zend_string_hash_val(name);
zend_op_array *op_array = &execute_data->func->op_array;
- int i;
-
- for (i = 0; i < op_array->last_var; i++) {
- if (op_array->vars[i]->h == h &&
- op_array->vars[i]->len == name->len &&
- memcmp(op_array->vars[i]->val, name->val, name->len) == 0) {
- ZVAL_COPY_VALUE(EX_VAR_NUM(i), value);
- return SUCCESS;
- }
+
+ if (EXPECTED(op_array->last_var)) {
+ zend_string **str = op_array->vars;
+ zend_string **end = str + op_array->last_var;
+
+ do {
+ if ((*str)->h == h &&
+ (*str)->len == name->len &&
+ memcmp((*str)->val, name->val, name->len) == 0) {
+ zval *var = EX_VAR_NUM(str - op_array->vars);
+ ZVAL_COPY_VALUE(var, value);
+ return SUCCESS;
+ }
+ str++;
+ } while (str != end);
}
if (force) {
zend_array *symbol_table = zend_rebuild_symbol_table();
@@ -1605,18 +1631,21 @@ ZEND_API int zend_set_local_var_str(const char *name, size_t len, zval *value, i
if (!execute_data->symbol_table) {
zend_ulong h = zend_hash_func(name, len);
zend_op_array *op_array = &execute_data->func->op_array;
- int i;
-
- for (i = 0; i < op_array->last_var; i++) {
- if (op_array->vars[i]->h == h &&
- op_array->vars[i]->len == len &&
- memcmp(op_array->vars[i]->val, name, len) == 0) {
- zval_ptr_dtor(EX_VAR_NUM(i));
- ZVAL_COPY_VALUE(EX_VAR_NUM(i), value);
- return SUCCESS;
- }
+ if (EXPECTED(op_array->last_var)) {
+ zend_string **str = op_array->vars;
+ zend_string **end = str + op_array->last_var;
+
+ do {
+ if ((*str)->h == h &&
+ (*str)->len == len &&
+ memcmp((*str)->val, name, len) == 0) {
+ zval *var = EX_VAR_NUM(str - op_array->vars);
+ ZVAL_COPY_VALUE(var, value);
+ return SUCCESS;
+ }
+ str++;
+ } while (str != end);
}
-
if (force) {
zend_array *symbol_table = zend_rebuild_symbol_table();
if (symbol_table) {