summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h68
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();
}