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.h102
1 files changed, 57 insertions, 45 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index e87f5c7251..89b9b2621f 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -1325,7 +1325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_ARRAY_SPEC_HANDLER(ZEND_O
{
USE_OPLINE
zend_free_op free_op1;
- zval *args, *op2;
+ zval *args;
SAVE_OPLINE();
args = get_zval_ptr(opline->op1_type, opline->op1, &free_op1, BP_VAR_R);
@@ -8151,32 +8151,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSE
{
USE_OPLINE
zend_array *ht;
- uint32_t arg_count, first_extra_arg, i, n;
- zval *p, *q;
+ uint32_t arg_count, result_size, skip;
arg_count = EX_NUM_ARGS();
- ht = (zend_array *) emalloc(sizeof(zend_array));
if (IS_CONST == IS_CONST) {
- i = Z_LVAL_P(EX_CONSTANT(opline->op1));
- if (arg_count < i) {
- i = 0;
+ skip = Z_LVAL_P(EX_CONSTANT(opline->op1));
+ if (arg_count < skip) {
+ result_size = 0;
} else {
- i = arg_count - i;
+ result_size = arg_count - skip;
}
- zend_hash_init(ht, i, NULL, ZVAL_PTR_DTOR, 0);
} else {
- zend_hash_init(ht, arg_count, NULL, ZVAL_PTR_DTOR, 0);
+ skip = 0;
+ result_size = arg_count;
}
+
+ ht = (zend_array *) emalloc(sizeof(zend_array));
+ zend_hash_init(ht, result_size, NULL, ZVAL_PTR_DTOR, 0);
ZVAL_ARR(EX_VAR(opline->result.var), ht);
- if (arg_count) {
- first_extra_arg = EX(func)->op_array.num_args;
+
+ if (result_size) {
+ uint32_t first_extra_arg = EX(func)->op_array.num_args;
zend_hash_real_init(ht, 1);
ZEND_HASH_FILL_PACKED(ht) {
- i = 0;
- n = 0;
- if (IS_CONST == IS_CONST) {
- i = Z_LVAL_P(EX_CONSTANT(opline->op1));
- }
+ zval *p, *q;
+ uint32_t i = skip;
p = EX_VAR_NUM(i);
if (arg_count > first_extra_arg) {
while (i < first_extra_arg) {
@@ -8186,13 +8185,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSE
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
- n++;
+ } else {
+ q = &EG(uninitialized_zval);
}
ZEND_HASH_FILL_ADD(q);
p++;
i++;
}
- p = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
+ if (skip < first_extra_arg) {
+ skip = 0;
+ } else {
+ skip -= first_extra_arg;
+ }
+ p = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T + skip);
}
while (i < arg_count) {
q = p;
@@ -8201,14 +8206,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSE
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
- n++;
+ } else {
+ q = &EG(uninitialized_zval);
}
ZEND_HASH_FILL_ADD(q);
p++;
i++;
}
} ZEND_HASH_FILL_END();
- ht->nNumOfElements = n;
+ ht->nNumOfElements = result_size;
}
ZEND_VM_NEXT_OPCODE();
}
@@ -16866,7 +16872,7 @@ fe_fetch_r_exit:
GC_REFCOUNT(gc)++;
}
}
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -17040,7 +17046,7 @@ fe_fetch_w_exit:
Z_ADDREF_P(value);
ZVAL_REF(EX_VAR(opline->op2.var), Z_REF_P(value));
}
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -24255,7 +24261,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
zend_assign_to_variable(variable_ptr, value, IS_CV);
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -24307,7 +24313,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
zend_assign_to_variable(variable_ptr, value, IS_CV);
- ZEND_VM_NEXT_OPCODE();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -29233,32 +29239,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS
{
USE_OPLINE
zend_array *ht;
- uint32_t arg_count, first_extra_arg, i, n;
- zval *p, *q;
+ uint32_t arg_count, result_size, skip;
arg_count = EX_NUM_ARGS();
- ht = (zend_array *) emalloc(sizeof(zend_array));
if (IS_UNUSED == IS_CONST) {
- i = Z_LVAL_P(EX_CONSTANT(opline->op1));
- if (arg_count < i) {
- i = 0;
+ skip = Z_LVAL_P(EX_CONSTANT(opline->op1));
+ if (arg_count < skip) {
+ result_size = 0;
} else {
- i = arg_count - i;
+ result_size = arg_count - skip;
}
- zend_hash_init(ht, i, NULL, ZVAL_PTR_DTOR, 0);
} else {
- zend_hash_init(ht, arg_count, NULL, ZVAL_PTR_DTOR, 0);
+ skip = 0;
+ result_size = arg_count;
}
+
+ ht = (zend_array *) emalloc(sizeof(zend_array));
+ zend_hash_init(ht, result_size, NULL, ZVAL_PTR_DTOR, 0);
ZVAL_ARR(EX_VAR(opline->result.var), ht);
- if (arg_count) {
- first_extra_arg = EX(func)->op_array.num_args;
+
+ if (result_size) {
+ uint32_t first_extra_arg = EX(func)->op_array.num_args;
zend_hash_real_init(ht, 1);
ZEND_HASH_FILL_PACKED(ht) {
- i = 0;
- n = 0;
- if (IS_UNUSED == IS_CONST) {
- i = Z_LVAL_P(EX_CONSTANT(opline->op1));
- }
+ zval *p, *q;
+ uint32_t i = skip;
p = EX_VAR_NUM(i);
if (arg_count > first_extra_arg) {
while (i < first_extra_arg) {
@@ -29268,13 +29273,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
- n++;
+ } else {
+ q = &EG(uninitialized_zval);
}
ZEND_HASH_FILL_ADD(q);
p++;
i++;
}
- p = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
+ if (skip < first_extra_arg) {
+ skip = 0;
+ } else {
+ skip -= first_extra_arg;
+ }
+ p = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T + skip);
}
while (i < arg_count) {
q = p;
@@ -29283,14 +29294,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
- n++;
+ } else {
+ q = &EG(uninitialized_zval);
}
ZEND_HASH_FILL_ADD(q);
p++;
i++;
}
} ZEND_HASH_FILL_END();
- ht->nNumOfElements = n;
+ ht->nNumOfElements = result_size;
}
ZEND_VM_NEXT_OPCODE();
}