summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_execute_API.c119
-rw-r--r--Zend/zend_objects.c29
2 files changed, 91 insertions, 57 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) {
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c
index eda8f0c956..2feff81ea4 100644
--- a/Zend/zend_objects.c
+++ b/Zend/zend_objects.c
@@ -28,40 +28,45 @@
ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce)
{
+ zval *p, *end;
+
GC_REFCOUNT(object) = 1;
GC_TYPE_INFO(object) = IS_OBJECT;
object->ce = ce;
object->properties = NULL;
zend_objects_store_put(object);
+ p = object->properties_table;
if (EXPECTED(ce->default_properties_count != 0)) {
- zval *p = object->properties_table;
- zval *end = p + ce->default_properties_count;
-
+ end = p + ce->default_properties_count;
do {
ZVAL_UNDEF(p);
p++;
} while (p != end);
}
- if (ce->ce_flags & ZEND_ACC_USE_GUARDS) {
+ if (UNEXPECTED(ce->ce_flags & ZEND_ACC_USE_GUARDS)) {
GC_FLAGS(object) |= IS_OBJ_USE_GUARDS;
- ZVAL_UNDEF(&object->properties_table[ce->default_properties_count]);
- Z_PTR(object->properties_table[ce->default_properties_count]) = NULL;
+ Z_PTR_P(p) = NULL;
+ ZVAL_UNDEF(p);
}
}
ZEND_API void zend_object_std_dtor(zend_object *object)
{
- int i, count;
+ zval *p, *end;
if (object->properties) {
zend_array_destroy(object->properties);
}
- count = object->ce->default_properties_count;
- for (i = 0; i < count; i++) {
- i_zval_ptr_dtor(&object->properties_table[i] ZEND_FILE_LINE_CC);
+ p = object->properties_table;
+ if (EXPECTED(object->ce->default_properties_count)) {
+ end = p + object->ce->default_properties_count;
+ do {
+ i_zval_ptr_dtor(p ZEND_FILE_LINE_CC);
+ p++;
+ } while (p != end);
}
- if (GC_FLAGS(object) & IS_OBJ_HAS_GUARDS) {
- HashTable *guards = Z_PTR(object->properties_table[count]);
+ if (UNEXPECTED(GC_FLAGS(object) & IS_OBJ_HAS_GUARDS)) {
+ HashTable *guards = Z_PTR_P(p);
ZEND_ASSERT(guards != NULL);
zend_hash_destroy(guards);