diff options
author | Dmitry Stogov <dmitry@php.net> | 2005-02-07 16:09:54 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2005-02-07 16:09:54 +0000 |
commit | fc96c7f7fa18b0fc9216bcc9f94e72a753da7689 (patch) | |
tree | 02642d4fbca015ea351e2356866248ed17b90da9 /Zend/zend_vm_execute.h | |
parent | 2d13dd0ef0cb0a7c0e85da3b3fbbb0fc15e5f9d8 (diff) | |
download | php-git-fc96c7f7fa18b0fc9216bcc9f94e72a753da7689.tar.gz |
foreash($a as $key => $val) optimization
Removed temorary array creation on each iteration.
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r-- | Zend/zend_vm_execute.h | 68 |
1 files changed, 22 insertions, 46 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 08e0611cc8..29d5101c0a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -7550,7 +7550,7 @@ static int ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zend_op *opline = EX(opline); zend_free_op free_op1; zval *array = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC); - zval **value, *key; + zval **value; char *str_key; uint str_key_len; ulong int_key; @@ -7638,29 +7638,17 @@ static int ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (opline->extended_value & ZEND_FE_FETCH_BYREF) { SEPARATE_ZVAL_IF_NOT_REF(value); (*value)->is_ref = 1; - } - - if (!use_key) { - if (opline->extended_value & ZEND_FE_FETCH_BYREF) { - EX_T(opline->result.u.var).var.ptr_ptr = value; - (*value)->refcount++; - } else { - zval *result = &EX_T(opline->result.u.var).tmp_var; - - *result = **value; - zval_copy_ctor(result); - } - } else { - zval *result = &EX_T(opline->result.u.var).tmp_var; - + EX_T(opline->result.u.var).var.ptr_ptr = value; (*value)->refcount++; + } else { + EX_T(opline->result.u.var).var.ptr_ptr = value; + PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr); + AI_USE_PTR(EX_T(opline->result.u.var).var); + } - array_init(result); - - zend_hash_index_update(result->value.ht, 0, value, sizeof(zval *), NULL); - - ALLOC_ZVAL(key); - INIT_PZVAL(key); + if (use_key) { + zend_op *op_data = opline+1; + zval *key = &EX_T(op_data->result.u.var).tmp_var; switch (key_type) { case HASH_KEY_IS_STRING: @@ -7674,9 +7662,9 @@ static int ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) break; EMPTY_SWITCH_DEFAULT_CASE() } - zend_hash_index_update(result->value.ht, 1, &key, sizeof(zval *), NULL); } + ZEND_VM_INC_OPCODE(); ZEND_VM_NEXT_OPCODE(); } @@ -30655,7 +30643,7 @@ static int ZEND_FE_FETCH_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zend_op *opline = EX(opline); zend_free_op free_op1; zval *array = get_zval_ptr(&opline->op1, EX(Ts), &free_op1, BP_VAR_R); - zval **value, *key; + zval **value; char *str_key; uint str_key_len; ulong int_key; @@ -30743,29 +30731,17 @@ static int ZEND_FE_FETCH_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (opline->extended_value & ZEND_FE_FETCH_BYREF) { SEPARATE_ZVAL_IF_NOT_REF(value); (*value)->is_ref = 1; - } - - if (!use_key) { - if (opline->extended_value & ZEND_FE_FETCH_BYREF) { - EX_T(opline->result.u.var).var.ptr_ptr = value; - (*value)->refcount++; - } else { - zval *result = &EX_T(opline->result.u.var).tmp_var; - - *result = **value; - zval_copy_ctor(result); - } - } else { - zval *result = &EX_T(opline->result.u.var).tmp_var; - + EX_T(opline->result.u.var).var.ptr_ptr = value; (*value)->refcount++; + } else { + EX_T(opline->result.u.var).var.ptr_ptr = value; + PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr); + AI_USE_PTR(EX_T(opline->result.u.var).var); + } - array_init(result); - - zend_hash_index_update(result->value.ht, 0, value, sizeof(zval *), NULL); - - ALLOC_ZVAL(key); - INIT_PZVAL(key); + if (use_key) { + zend_op *op_data = opline+1; + zval *key = &EX_T(op_data->result.u.var).tmp_var; switch (key_type) { case HASH_KEY_IS_STRING: @@ -30779,9 +30755,9 @@ static int ZEND_FE_FETCH_HANDLER(ZEND_OPCODE_HANDLER_ARGS) break; EMPTY_SWITCH_DEFAULT_CASE() } - zend_hash_index_update(result->value.ht, 1, &key, sizeof(zval *), NULL); } + ZEND_VM_INC_OPCODE(); ZEND_VM_NEXT_OPCODE(); } |