TSRMLS_FETCH();
param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
- arg_count = EG(current_execute_data)->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (param_count>arg_count) {
return FAILURE;
TSRMLS_FETCH();
param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
- arg_count = EG(current_execute_data)->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (param_count>arg_count) {
return FAILURE;
int arg_count;
param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
- arg_count = EG(current_execute_data)->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (param_count>arg_count) {
return FAILURE;
int arg_count;
param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
- arg_count = EG(current_execute_data)->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (param_count>arg_count) {
return FAILURE;
return FAILURE;
}
- arg_count = EG(current_execute_data)->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (num_args > arg_count) {
zend_error(E_WARNING, "%s(): could not obtain parameters for parsing",
#define WRONG_PARAM_COUNT ZEND_WRONG_PARAM_COUNT()
#define WRONG_PARAM_COUNT_WITH_RETVAL(ret) ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret)
-#define ARG_COUNT(dummy) EX(num_args)
-#define ZEND_NUM_ARGS() EX(num_args)
+#define ARG_COUNT(dummy) EX_NUM_ARGS()
+#define ZEND_NUM_ARGS() EX_NUM_ARGS()
#define ZEND_WRONG_PARAM_COUNT() { zend_wrong_param_count(TSRMLS_C); return; }
#define ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret) { zend_wrong_param_count(TSRMLS_C); return ret; }
const int _flags = (flags); \
int _min_num_args = (min_num_args); \
int _max_num_args = (max_num_args); \
- int _num_args = EX(num_args); \
+ int _num_args = EX_NUM_ARGS(); \
int _i; \
zval *_real_arg, *_arg = NULL; \
zend_expected_type _expected_type = IS_UNDEF; \
zend_execute_data *ex = EX(prev_execute_data);
if (VM_FRAME_KIND(ex->frame_info) == VM_FRAME_NESTED_FUNCTION || VM_FRAME_KIND(ex->frame_info) == VM_FRAME_TOP_FUNCTION) {
- RETURN_LONG(ex->num_args);
+ RETURN_LONG(ZEND_CALL_NUM_ARGS(ex));
} else {
zend_error(E_WARNING, "func_num_args(): Called from the global scope - no function context");
RETURN_LONG(-1);
RETURN_FALSE;
}
- arg_count = ex->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(ex);
if (requested_offset >= arg_count) {
zend_error(E_WARNING, "func_get_arg(): Argument " ZEND_LONG_FMT " not passed to function", requested_offset);
if (ex->func->op_array.fn_flags & ZEND_ACC_VARIADIC) {
first_extra_arg--;
}
- if (requested_offset >= first_extra_arg && (ex->num_args > first_extra_arg)) {
+ if (requested_offset >= first_extra_arg && (ZEND_CALL_NUM_ARGS(ex) > first_extra_arg)) {
arg = EX_VAR_NUM_2(ex, ex->func->op_array.last_var + ex->func->op_array.T) + (requested_offset - first_extra_arg);
} else {
arg = ZEND_CALL_ARG(ex, requested_offset + 1);
RETURN_FALSE;
}
- arg_count = ex->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(ex);
array_init_size(return_value, arg_count);
if (arg_count) {
i = 0;
q = Z_ARRVAL_P(return_value)->arData;
p = ZEND_CALL_ARG(ex, 1);
- if (ex->num_args > first_extra_arg) {
+ if (ZEND_CALL_NUM_ARGS(ex) > first_extra_arg) {
while (i < first_extra_arg) {
q->h = i;
q->key = NULL;
static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array TSRMLS_DC) /* {{{ */
{
- uint32_t num_args = call->num_args;
+ uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
array_init_size(arg_array, num_args);
if (num_args) {
if (call->func->op_array.fn_flags & ZEND_ACC_VARIADIC) {
first_extra_arg--;
}
- if (call->num_args > first_extra_arg) {
+ if (ZEND_CALL_NUM_ARGS(call) > first_extra_arg) {
while (i < first_extra_arg) {
if (Z_REFCOUNTED_P(p)) Z_ADDREF_P(p);
zend_hash_next_index_insert_new(Z_ARRVAL_P(arg_array), p);
zend_class_entry *called_scope;
zend_execute_data *prev_execute_data;
uint32_t frame_info;
- uint32_t num_args;
zval *return_value;
zend_array *symbol_table;
};
#define ZEND_CALL_ARG(call, n) \
(((zval*)(call)) + ((n) + (ZEND_CALL_FRAME_SLOT - 1)))
+#define ZEND_CALL_NUM_ARGS(call) \
+ (call)->This.u2.num_args
+
#define EX(element) ((execute_data)->element)
#define EX_VAR_2(ex, n) ((zval*)(((char*)(ex)) + ((int)(n))))
#define EX_VAR_TO_NUM(n) (EX_VAR_2(NULL, n) - EX_VAR_NUM_2(NULL, 0))
+#define EX_NUM_ARGS() ZEND_CALL_NUM_ARGS(execute_data)
+
#define IS_CONST (1<<0)
#define IS_TMP_VAR (1<<1)
#define IS_VAR (1<<2)
if (UNEXPECTED((op_array->fn_flags & ZEND_ACC_VARIADIC) != 0)) {
first_extra_arg--;
}
- num_args = EX(num_args);
+ num_args = EX_NUM_ARGS();
if (UNEXPECTED(num_args > first_extra_arg)) {
zval *end, *src, *dst;
if (UNEXPECTED((op_array->fn_flags & ZEND_ACC_VARIADIC) != 0)) {
first_extra_arg--;
}
- num_args = EX(num_args);
+ num_args = EX_NUM_ARGS();
if (UNEXPECTED(num_args > first_extra_arg)) {
zval *end, *src, *dst;
* restore it simply by replacing a pointer.
*/
zend_execute_data *execute_data;
- uint32_t num_args = call->num_args;
+ uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
size_t stack_size = (ZEND_CALL_FRAME_SLOT + MAX(op_array->last_var + op_array->T, num_args)) * sizeof(zval);
EG(vm_stack) = zend_vm_stack_new_page(
call->called_scope,
Z_OBJ(call->This),
NULL TSRMLS_CC);
- EX(num_args) = num_args;
+ EX_NUM_ARGS() = num_args;
/* copy arguments */
if (num_args > 0) {
call->called_scope = called_scope;
call->prev_execute_data = prev;
call->frame_info = frame_info;
- call->num_args = 0;
+ ZEND_CALL_NUM_ARGS(call) = 0;
return call;
}
{
uint32_t first_extra_arg = call->func->op_array.num_args - ((call->func->common.fn_flags & ZEND_ACC_VARIADIC) != 0);
- if (UNEXPECTED(call->num_args > first_extra_arg)) {
+ if (UNEXPECTED(ZEND_CALL_NUM_ARGS(call) > first_extra_arg)) {
zval *end = EX_VAR_NUM_2(call, call->func->op_array.last_var + call->func->op_array.T);
- zval *p = end + (call->num_args - first_extra_arg);
+ zval *p = end + (ZEND_CALL_NUM_ARGS(call) - first_extra_arg);
do {
p--;
zval_ptr_dtor_nogc(p);
static zend_always_inline void zend_vm_stack_free_args(zend_execute_data *call TSRMLS_DC)
{
- uint32_t num_args = call->num_args;
+ uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
if (num_args > 0) {
zval *end = ZEND_CALL_ARG(call, 1);
!ARG_MAY_BE_SENT_BY_REF(func, i + 1)) {
if (i) {
/* hack to clean up the stack */
- call->num_args = i;
+ ZEND_CALL_NUM_ARGS(call) = i;
zend_vm_stack_free_args(call TSRMLS_CC);
}
zend_vm_stack_free_call_frame(call TSRMLS_CC);
ZVAL_COPY(param, &fci->params[i]);
}
}
- call->num_args = fci->param_count;
+ ZEND_CALL_NUM_ARGS(call) = fci->param_count;
EG(scope) = calling_scope;
if (func->common.fn_flags & ZEND_ACC_STATIC) {
uint32_t next; /* hash collision chain */
uint32_t cache_slot; /* literal cache slot */
uint32_t lineno; /* line number (for ast nodes) */
+ uint32_t num_args; /* arguments number for EX(This) */
} u2;
};
uint32_t i;
zval *p = ZEND_CALL_ARG(call, 1);
- for (i = 0; i < call->num_args; ++i) {
+ for (i = 0; i < ZEND_CALL_NUM_ARGS(call); ++i) {
zend_verify_arg_type(fbc, i + 1, p, NULL TSRMLS_CC);
p++;
}
SAVE_OPLINE();
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (OP1_TYPE == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
}
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (OP1_TYPE == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
FREE_OP1();
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, varptr);
CHECK_EXCEPTION();
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if (OP1_TYPE == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) {
ZVAL_NEW_REF(arg, &EG(uninitialized_zval));
ZEND_VM_NEXT_OPCODE();
}
varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
FREE_OP1();
SAVE_OPLINE();
args = GET_OP1_ZVAL_PTR(BP_VAR_R);
- arg_num = EX(call)->num_args + 1;
+ arg_num = ZEND_CALL_NUM_ARGS(EX(call)) + 1;
ZEND_VM_C_LABEL(send_again):
switch (Z_TYPE_P(args)) {
ZVAL_COPY(top, arg);
}
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
arg_num++;
} ZEND_HASH_FOREACH_END();
zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1 TSRMLS_CC);
top = ZEND_CALL_ARG(EX(call), arg_num);
ZVAL_COPY_VALUE(top, arg);
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
iter->funcs->move_forward(iter TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
} else {
ZVAL_COPY(param, arg);
}
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
arg_num++;
param++;
} ZEND_HASH_FOREACH_END();
ZVAL_COPY(param, arg);
}
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
FREE_OP1();
CHECK_EXCEPTION();
uint32_t arg_num = opline->op1.num;
SAVE_OPLINE();
- if (UNEXPECTED(arg_num > EX(num_args))) {
+ if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
zend_verify_missing_arg(execute_data, arg_num TSRMLS_CC);
CHECK_EXCEPTION();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
SAVE_OPLINE();
param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
- if (arg_num > EX(num_args)) {
+ if (arg_num > EX_NUM_ARGS()) {
ZVAL_COPY_VALUE(param, opline->op2.zv);
if (Z_OPT_CONSTANT_P(param)) {
zval_update_constant(param, 0 TSRMLS_CC);
{
USE_OPLINE
uint32_t arg_num = opline->op1.num;
- uint32_t arg_count = EX(num_args);
+ uint32_t arg_count = EX_NUM_ARGS();
zval *params;
SAVE_OPLINE();
uint32_t i;
zval *p = ZEND_CALL_ARG(call, 1);
- for (i = 0; i < call->num_args; ++i) {
+ for (i = 0; i < ZEND_CALL_NUM_ARGS(call); ++i) {
zend_verify_arg_type(fbc, i + 1, p, NULL TSRMLS_CC);
p++;
}
SAVE_OPLINE();
args = get_zval_ptr(opline->op1_type, &opline->op1, execute_data, &free_op1, BP_VAR_R);
- arg_num = EX(call)->num_args + 1;
+ arg_num = ZEND_CALL_NUM_ARGS(EX(call)) + 1;
send_again:
switch (Z_TYPE_P(args)) {
ZVAL_COPY(top, arg);
}
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
arg_num++;
} ZEND_HASH_FOREACH_END();
zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1 TSRMLS_CC);
top = ZEND_CALL_ARG(EX(call), arg_num);
ZVAL_COPY_VALUE(top, arg);
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
iter->funcs->move_forward(iter TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
} else {
ZVAL_COPY(param, arg);
}
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
arg_num++;
param++;
} ZEND_HASH_FOREACH_END();
uint32_t arg_num = opline->op1.num;
SAVE_OPLINE();
- if (UNEXPECTED(arg_num > EX(num_args))) {
+ if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
zend_verify_missing_arg(execute_data, arg_num TSRMLS_CC);
CHECK_EXCEPTION();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
{
USE_OPLINE
uint32_t arg_num = opline->op1.num;
- uint32_t arg_count = EX(num_args);
+ uint32_t arg_count = EX_NUM_ARGS();
zval *params;
SAVE_OPLINE();
SAVE_OPLINE();
param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
- if (arg_num > EX(num_args)) {
+ if (arg_num > EX_NUM_ARGS()) {
ZVAL_COPY_VALUE(param, opline->op2.zv);
if (Z_OPT_CONSTANT_P(param)) {
zval_update_constant(param, 0 TSRMLS_CC);
SAVE_OPLINE();
value = opline->op1.zv;
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
}
value = opline->op1.zv;
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
SAVE_OPLINE();
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
}
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
zval_ptr_dtor_nogc(free_op1);
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, varptr);
CHECK_EXCEPTION();
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if (IS_VAR == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) {
ZVAL_NEW_REF(arg, &EG(uninitialized_zval));
ZEND_VM_NEXT_OPCODE();
}
varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
zval_ptr_dtor_nogc(free_op1);
ZVAL_COPY(param, arg);
}
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
zval_ptr_dtor_nogc(free_op1);
CHECK_EXCEPTION();
varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((IS_CV == IS_CV || IS_CV == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, varptr);
CHECK_EXCEPTION();
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if (IS_CV == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) {
ZVAL_NEW_REF(arg, &EG(uninitialized_zval));
ZEND_VM_NEXT_OPCODE();
}
varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((IS_CV == IS_CV || IS_CV == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
ZVAL_COPY(param, arg);
}
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();