if (constructor == NULL) {
if (RETURN_VALUE_USED(opline)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr = object_zval;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, object_zval);
} else {
zval_ptr_dtor(&object_zval);
}
ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.u.opline_num);
} else {
- SELECTIVE_PZVAL_LOCK(object_zval, &opline->result);
- EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr = object_zval;
+ if (RETURN_VALUE_USED(opline)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, object_zval);
+ PZVAL_LOCK(object_zval);
+ }
zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), ENCODE_CTOR(EX(called_scope), RETURN_VALUE_USED(opline)));
switch (brk_opline->opcode) {
case ZEND_SWITCH_FREE:
- zend_switch_free(brk_opline, EX(Ts) TSRMLS_CC);
+ zend_switch_free(&EX_T(brk_opline->op1.u.var), brk_opline->op1.op_type, brk_opline->extended_value TSRMLS_CC);
break;
case ZEND_FREE:
zendi_zval_dtor(EX_T(brk_opline->op1.u.var).tmp_var);
static int ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval **param, *assignment_value;
+ zval **param, *assignment_value, **var_ptr;
zend_uint arg_num = Z_LVAL(opline->op1.u.constant);
zend_free_op free_res;
assignment_value = &opline->op2.u.constant;
}
zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value, opline->extended_value TSRMLS_CC);
- zend_assign_to_variable(NULL, &opline->result, NULL, assignment_value, IS_VAR, EX(Ts) TSRMLS_CC);
- } else {
- zval **var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
+ var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
+ zend_assign_to_variable(var_ptr, assignment_value, 0 TSRMLS_CC);
+ } else {
+ var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
assignment_value = *param;
zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value, opline->extended_value TSRMLS_CC);
if (PZVAL_IS_REF(assignment_value)) {
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
PZVAL_LOCK(*retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *retval);
break;
case BP_VAR_UNSET: {
zend_free_op free_res;
+ EX_T(opline->result.u.var).var.ptr_ptr = retval;
PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
FREE_OP_VAR_PTR(free_res);
break;
+ default:
+ EX_T(opline->result.u.var).var.ptr_ptr = retval;
+ break;
}
}
}
}
}
+ AI_SET_PTR(EX_T(opline->result.u.var).var, array_ptr);
PZVAL_LOCK(array_ptr);
- EX_T(opline->result.u.var).var.ptr = array_ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
if (iter) {
iter->index = 0;
if (Z_TYPE_P(container) != IS_ARRAY) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
zval *dim = &opline->op2.u.constant;
- EX_T(opline->result.u.var).var.ptr_ptr = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, BP_VAR_R TSRMLS_CC);
- SELECTIVE_PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &opline->result);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, BP_VAR_R TSRMLS_CC));
+ SELECTIVE_PZVAL_LOCK(EX_T(opline->result.u.var).var.ptr, &opline->result);
}
- AI_USE_PTR(EX_T(opline->result.u.var).var);
ZEND_VM_NEXT_OPCODE();
}
*/
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
*/
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
*/
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
*/
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
PZVAL_LOCK(*retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *retval);
break;
case BP_VAR_UNSET: {
zend_free_op free_res;
+ EX_T(opline->result.u.var).var.ptr_ptr = retval;
PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
FREE_OP_VAR_PTR(free_res);
break;
+ default:
+ EX_T(opline->result.u.var).var.ptr_ptr = retval;
+ break;
}
}
}
static int ZEND_SWITCH_FREE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- zend_switch_free(EX(opline), EX(Ts) TSRMLS_CC);
+ zend_switch_free(&EX_T(EX(opline)->op1.u.var), IS_TMP_VAR, EX(opline)->extended_value TSRMLS_CC);
ZEND_VM_NEXT_OPCODE();
}
}
}
+ AI_SET_PTR(EX_T(opline->result.u.var).var, array_ptr);
PZVAL_LOCK(array_ptr);
- EX_T(opline->result.u.var).var.ptr = array_ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
if (iter) {
iter->index = 0;
if (Z_TYPE_P(container) != IS_ARRAY) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
zval *dim = &opline->op2.u.constant;
- EX_T(opline->result.u.var).var.ptr_ptr = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, BP_VAR_R TSRMLS_CC);
- SELECTIVE_PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &opline->result);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, BP_VAR_R TSRMLS_CC));
+ SELECTIVE_PZVAL_LOCK(EX_T(opline->result.u.var).var.ptr, &opline->result);
}
- AI_USE_PTR(EX_T(opline->result.u.var).var);
ZEND_VM_NEXT_OPCODE();
}
*/
zval_dtor(free_op1.var);
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
*/
zval_dtor(free_op1.var);
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
*/
zval_dtor(free_op1.var);
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
*/
zval_dtor(free_op1.var);
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
PZVAL_LOCK(*retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *retval);
break;
case BP_VAR_UNSET: {
zend_free_op free_res;
+ EX_T(opline->result.u.var).var.ptr_ptr = retval;
PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
FREE_OP_VAR_PTR(free_res);
break;
+ default:
+ EX_T(opline->result.u.var).var.ptr_ptr = retval;
+ break;
}
}
}
static int ZEND_SWITCH_FREE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- zend_switch_free(EX(opline), EX(Ts) TSRMLS_CC);
+ zend_switch_free(&EX_T(EX(opline)->op1.u.var), IS_VAR, EX(opline)->extended_value TSRMLS_CC);
ZEND_VM_NEXT_OPCODE();
}
}
}
+ AI_SET_PTR(EX_T(opline->result.u.var).var, array_ptr);
PZVAL_LOCK(array_ptr);
- EX_T(opline->result.u.var).var.ptr = array_ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
if (iter) {
iter->index = 0;
EX_T(opline->result.u.var).var.ptr_ptr = value;
Z_ADDREF_PP(value);
} 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);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *value);
+ PZVAL_LOCK(*value);
}
if (use_key) {
zval *property = &opline->op2.u.constant;
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (increment_opline) {
EX_T(opline->op1.u.var).var.ptr_ptr) {
PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
}
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
zend_free_op free_op1;
zval *dim = &opline->op2.u.constant;
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
{
zend_op *opline = EX(opline);
zend_free_op free_op1;
- int type = ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)?BP_VAR_W:BP_VAR_R;
- zval *dim;
-
- if (IS_CONST == IS_UNUSED && type == BP_VAR_R) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
- }
- dim = &opline->op2.u.constant;
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, type TSRMLS_CC);
+ zval *dim = &opline->op2.u.constant;
- if (IS_VAR == IS_VAR && type == BP_VAR_W && (free_op1.var != NULL) &&
- READY_TO_DESTROY(free_op1.var) &&
- !RETURN_VALUE_UNUSED(&opline->result)) {
- AI_USE_PTR(EX_T(opline->result.u.var).var);
- if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
- Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
- SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
+ zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_W TSRMLS_CC);
+ if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
+ READY_TO_DESTROY(free_op1.var) &&
+ !RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
+ Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
+ SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ }
}
+ } else {
+ if (IS_CONST == IS_UNUSED) {
+ zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ }
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
}
+
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
}
static int zend_fetch_property_address_read_helper_SPEC_VAR_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
zend_free_op free_op1;
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
-
- container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zval *offset = &opline->op2.u.constant;
+ zval *retval;
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (0) {
zend_op *op_data = opline+1;
zend_free_op free_op1;
zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval *property_name = &opline->op2.u.constant;
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ }
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
}
if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+
+ zval *property_name = &opline->op2.u.constant;
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+
+ }
} else {
- zend_free_op free_op_data1;
+ zend_free_op free_op_data1, free_op_data2;
zval *value;
zval *dim = &opline->op2.u.constant;
+ zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- zend_assign_to_variable(&opline->result, &op_data->op2, &op_data->op1, value, (IS_TMP_FREE(free_op_data1)?IS_TMP_VAR:op_data->op1.op_type), EX(Ts) TSRMLS_CC);
+ variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
+ }
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+ FREE_OP_VAR_PTR(free_op_data2);
FREE_OP_IF_VAR(free_op_data1);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
static int ZEND_ASSIGN_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
-
+ zend_free_op free_op1;
zval *value = &opline->op2.u.constant;
+ zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CONST TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
+ }
+
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (0?IS_TMP_VAR:IS_CONST), EX(Ts) TSRMLS_CC);
/* zend_assign_to_variable() always takes care of op2, never free it! */
ZEND_VM_NEXT_OPCODE();
*/
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 1, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
zval_dtor(free_op2.var);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
zval_dtor(free_op2.var);
EX_T(opline->op1.u.var).var.ptr_ptr) {
PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
}
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 1, BP_VAR_R TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 1, BP_VAR_R TSRMLS_CC);
zval_dtor(free_op2.var);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
zend_free_op free_op1, free_op2;
zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 1, BP_VAR_IS TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 1, BP_VAR_IS TSRMLS_CC);
zval_dtor(free_op2.var);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
{
zend_op *opline = EX(opline);
zend_free_op free_op1, free_op2;
- int type = ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)?BP_VAR_W:BP_VAR_R;
- zval *dim;
+ zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (IS_TMP_VAR == IS_UNUSED && type == BP_VAR_R) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
- }
- dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 1, type TSRMLS_CC);
- zval_dtor(free_op2.var);
- if (IS_VAR == IS_VAR && type == BP_VAR_W && (free_op1.var != NULL) &&
- READY_TO_DESTROY(free_op1.var) &&
- !RETURN_VALUE_UNUSED(&opline->result)) {
- AI_USE_PTR(EX_T(opline->result.u.var).var);
- if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
- Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
- SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
+ zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 1, BP_VAR_W TSRMLS_CC);
+ if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
+ READY_TO_DESTROY(free_op1.var) &&
+ !RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
+ Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
+ SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ }
+ }
+ } else {
+ if (IS_TMP_VAR == IS_UNUSED) {
+ zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 1, BP_VAR_R TSRMLS_CC);
}
+ zval_dtor(free_op2.var);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
}
static int zend_fetch_property_address_read_helper_SPEC_VAR_TMP(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
zend_free_op free_op1;
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
-
- container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval *retval;
if (1) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (1) {
{
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
- zend_free_op free_op1;
+ zend_free_op free_op1, free_op2;
zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (1) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (1) {
+ zval_ptr_dtor(&property_name);
+ } else {
+ zval_dtor(free_op2.var);
+ }
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
}
if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ zend_free_op free_op2;
+ zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+
+ if (1) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ if (1) {
+ zval_ptr_dtor(&property_name);
+ } else {
+ zval_dtor(free_op2.var);
+ }
} else {
- zend_free_op free_op2, free_op_data1;
+ zend_free_op free_op2, free_op_data1, free_op_data2;
zval *value;
zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 1, BP_VAR_W TSRMLS_CC);
zval_dtor(free_op2.var);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- zend_assign_to_variable(&opline->result, &op_data->op2, &op_data->op1, value, (IS_TMP_FREE(free_op_data1)?IS_TMP_VAR:op_data->op1.op_type), EX(Ts) TSRMLS_CC);
+ variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
+ }
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+ FREE_OP_VAR_PTR(free_op_data2);
FREE_OP_IF_VAR(free_op_data1);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
static int ZEND_ASSIGN_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zend_free_op free_op2;
+ zend_free_op free_op1, free_op2;
zval *value = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_TMP_VAR TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, 1 TSRMLS_CC);
+ }
+
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (1?IS_TMP_VAR:IS_TMP_VAR), EX(Ts) TSRMLS_CC);
/* zend_assign_to_variable() always takes care of op2, never free it! */
ZEND_VM_NEXT_OPCODE();
*/
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
EX_T(opline->op1.u.var).var.ptr_ptr) {
PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
}
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
zend_free_op free_op1, free_op2;
zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
{
zend_op *opline = EX(opline);
zend_free_op free_op1, free_op2;
- int type = ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)?BP_VAR_W:BP_VAR_R;
- zval *dim;
+ zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (IS_VAR == IS_UNUSED && type == BP_VAR_R) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
- }
- dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, type TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (IS_VAR == IS_VAR && type == BP_VAR_W && (free_op1.var != NULL) &&
- READY_TO_DESTROY(free_op1.var) &&
- !RETURN_VALUE_UNUSED(&opline->result)) {
- AI_USE_PTR(EX_T(opline->result.u.var).var);
- if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
- Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
- SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
+ zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_W TSRMLS_CC);
+ if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
+ READY_TO_DESTROY(free_op1.var) &&
+ !RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
+ Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
+ SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ }
}
+ } else {
+ if (IS_VAR == IS_UNUSED) {
+ zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ }
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
}
+ if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
}
static int zend_fetch_property_address_read_helper_SPEC_VAR_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
zend_free_op free_op1;
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
-
- container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval *retval;
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (0) {
{
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
- zend_free_op free_op1;
+ zend_free_op free_op1, free_op2;
zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+ if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ }
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
}
if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ zend_free_op free_op2;
+ zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+ if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ }
} else {
- zend_free_op free_op2, free_op_data1;
+ zend_free_op free_op2, free_op_data1, free_op_data2;
zval *value;
zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- zend_assign_to_variable(&opline->result, &op_data->op2, &op_data->op1, value, (IS_TMP_FREE(free_op_data1)?IS_TMP_VAR:op_data->op1.op_type), EX(Ts) TSRMLS_CC);
+ variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
+ }
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+ FREE_OP_VAR_PTR(free_op_data2);
FREE_OP_IF_VAR(free_op_data1);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
static int ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zend_free_op free_op2;
+ zend_free_op free_op1, free_op2;
zval *value = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_VAR TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
+ }
+
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (0?IS_TMP_VAR:IS_VAR), EX(Ts) TSRMLS_CC);
/* zend_assign_to_variable() always takes care of op2, never free it! */
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = variable_ptr_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
PZVAL_LOCK(*variable_ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
*/
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
zval *property = NULL;
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (increment_opline) {
{
zend_op *opline = EX(opline);
zend_free_op free_op1;
- int type = ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)?BP_VAR_W:BP_VAR_R;
- zval *dim;
-
- if (IS_UNUSED == IS_UNUSED && type == BP_VAR_R) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
- }
- dim = NULL;
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, type TSRMLS_CC);
+ zval *dim = NULL;
- if (IS_VAR == IS_VAR && type == BP_VAR_W && (free_op1.var != NULL) &&
- READY_TO_DESTROY(free_op1.var) &&
- !RETURN_VALUE_UNUSED(&opline->result)) {
- AI_USE_PTR(EX_T(opline->result.u.var).var);
- if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
- Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
- SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
+ zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_W TSRMLS_CC);
+ if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
+ READY_TO_DESTROY(free_op1.var) &&
+ !RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
+ Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
+ SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ }
}
+ } else {
+ if (IS_UNUSED == IS_UNUSED) {
+ zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ }
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
}
+
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
}
}
if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+
+ zval *property_name = NULL;
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+
+ }
} else {
- zend_free_op free_op_data1;
+ zend_free_op free_op_data1, free_op_data2;
zval *value;
zval *dim = NULL;
+ zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- zend_assign_to_variable(&opline->result, &op_data->op2, &op_data->op1, value, (IS_TMP_FREE(free_op_data1)?IS_TMP_VAR:op_data->op1.op_type), EX(Ts) TSRMLS_CC);
- FREE_OP_IF_VAR(free_op_data1);
+ variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
+ }
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+ FREE_OP_VAR_PTR(free_op_data2);
+ FREE_OP_IF_VAR(free_op_data1);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
/* assign_dim has two opcodes! */
zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (increment_opline) {
EX_T(opline->op1.u.var).var.ptr_ptr) {
PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
}
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
zend_free_op free_op1;
zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
{
zend_op *opline = EX(opline);
zend_free_op free_op1;
- int type = ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)?BP_VAR_W:BP_VAR_R;
- zval *dim;
-
- if (IS_CV == IS_UNUSED && type == BP_VAR_R) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
- }
- dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, type TSRMLS_CC);
+ zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- if (IS_VAR == IS_VAR && type == BP_VAR_W && (free_op1.var != NULL) &&
- READY_TO_DESTROY(free_op1.var) &&
- !RETURN_VALUE_UNUSED(&opline->result)) {
- AI_USE_PTR(EX_T(opline->result.u.var).var);
- if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
- Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
- SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
+ zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_W TSRMLS_CC);
+ if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
+ READY_TO_DESTROY(free_op1.var) &&
+ !RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
+ Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
+ SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ }
+ }
+ } else {
+ if (IS_CV == IS_UNUSED) {
+ zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
}
+
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
}
static int zend_fetch_property_address_read_helper_SPEC_VAR_CV(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
zend_free_op free_op1;
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
-
- container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+ zval *retval;
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (0) {
zend_op *op_data = opline+1;
zend_free_op free_op1;
zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+
+ }
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
}
if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+
+ zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+
+ }
} else {
- zend_free_op free_op_data1;
+ zend_free_op free_op_data1, free_op_data2;
zval *value;
zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+ zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- zend_assign_to_variable(&opline->result, &op_data->op2, &op_data->op1, value, (IS_TMP_FREE(free_op_data1)?IS_TMP_VAR:op_data->op1.op_type), EX(Ts) TSRMLS_CC);
+ variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
+ }
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+ FREE_OP_VAR_PTR(free_op_data2);
FREE_OP_IF_VAR(free_op_data1);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
static int ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
-
+ zend_free_op free_op1;
zval *value = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+ zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CV TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
+ }
+
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (0?IS_TMP_VAR:IS_CV), EX(Ts) TSRMLS_CC);
/* zend_assign_to_variable() always takes care of op2, never free it! */
ZEND_VM_NEXT_OPCODE();
zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = variable_ptr_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
PZVAL_LOCK(*variable_ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
*/
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
zval *property = &opline->op2.u.constant;
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), NULL, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (increment_opline) {
static int zend_fetch_property_address_read_helper_SPEC_UNUSED_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
-
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zval *offset = &opline->op2.u.constant;
+ zval *retval;
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (0) {
zend_op *op_data = opline+1;
zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
+ zval *property_name = &opline->op2.u.constant;
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+
+ }
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), NULL, dim, 1, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
zval_dtor(free_op2.var);
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
zval_dtor(free_op2.var);
static int zend_fetch_property_address_read_helper_SPEC_UNUSED_TMP(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
-
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval *retval;
if (1) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (1) {
{
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
-
+ zend_free_op free_op2;
zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
+ zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (1) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (1) {
+ zval_ptr_dtor(&property_name);
+ } else {
+ zval_dtor(free_op2.var);
+ }
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), NULL, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
static int zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
-
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval *retval;
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (0) {
{
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
-
+ zend_free_op free_op2;
zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
+ zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+ if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ }
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
zval *property = NULL;
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), NULL, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (increment_opline) {
zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), NULL, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (increment_opline) {
static int zend_fetch_property_address_read_helper_SPEC_UNUSED_CV(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
-
- container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+ zval *retval;
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (0) {
zend_op *op_data = opline+1;
zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
+ zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+
+ }
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
ZEND_VM_NEXT_OPCODE();
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
ZEND_VM_NEXT_OPCODE();
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
ZEND_VM_NEXT_OPCODE();
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
ZEND_VM_NEXT_OPCODE();
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
PZVAL_LOCK(*retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *retval);
break;
case BP_VAR_UNSET: {
zend_free_op free_res;
+ EX_T(opline->result.u.var).var.ptr_ptr = retval;
PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
FREE_OP_VAR_PTR(free_res);
break;
+ default:
+ EX_T(opline->result.u.var).var.ptr_ptr = retval;
+ break;
}
}
}
}
}
+ AI_SET_PTR(EX_T(opline->result.u.var).var, array_ptr);
PZVAL_LOCK(array_ptr);
- EX_T(opline->result.u.var).var.ptr = array_ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
if (iter) {
iter->index = 0;
zval *property = &opline->op2.u.constant;
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC), dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (increment_opline) {
EX_T(opline->op1.u.var).var.ptr_ptr) {
PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
}
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
ZEND_VM_NEXT_OPCODE();
zval *dim = &opline->op2.u.constant;
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
ZEND_VM_NEXT_OPCODE();
{
zend_op *opline = EX(opline);
zend_free_op free_op1;
- int type = ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)?BP_VAR_W:BP_VAR_R;
- zval *dim;
-
- if (IS_CONST == IS_UNUSED && type == BP_VAR_R) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
- }
- dim = &opline->op2.u.constant;
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC), dim, 0, type TSRMLS_CC);
+ zval *dim = &opline->op2.u.constant;
- if (IS_CV == IS_VAR && type == BP_VAR_W && 0 &&
- READY_TO_DESTROY(free_op1.var) &&
- !RETURN_VALUE_UNUSED(&opline->result)) {
- AI_USE_PTR(EX_T(opline->result.u.var).var);
- if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
- Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
- SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
+ zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC), dim, 0, BP_VAR_W TSRMLS_CC);
+ if (IS_CV == IS_VAR && 0 &&
+ READY_TO_DESTROY(free_op1.var) &&
+ !RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
+ Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
+ SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ }
+ }
+ } else {
+ if (IS_CONST == IS_UNUSED) {
+ zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
}
+
ZEND_VM_NEXT_OPCODE();
}
static int zend_fetch_property_address_read_helper_SPEC_CV_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
-
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
- container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
+ zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zval *offset = &opline->op2.u.constant;
+ zval *retval;
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (0) {
zend_op *op_data = opline+1;
zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+ zval *property_name = &opline->op2.u.constant;
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ }
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
}
if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+
+ zval *property_name = &opline->op2.u.constant;
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+
+ }
} else {
- zend_free_op free_op_data1;
+ zend_free_op free_op_data1, free_op_data2;
zval *value;
zval *dim = &opline->op2.u.constant;
+ zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- zend_assign_to_variable(&opline->result, &op_data->op2, &op_data->op1, value, (IS_TMP_FREE(free_op_data1)?IS_TMP_VAR:op_data->op1.op_type), EX(Ts) TSRMLS_CC);
+ variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
+ }
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+ FREE_OP_VAR_PTR(free_op_data2);
FREE_OP_IF_VAR(free_op_data1);
}
zend_op *opline = EX(opline);
zval *value = &opline->op2.u.constant;
+ zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CONST TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
+ }
+
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
- zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (0?IS_TMP_VAR:IS_CONST), EX(Ts) TSRMLS_CC);
/* zend_assign_to_variable() always takes care of op2, never free it! */
ZEND_VM_NEXT_OPCODE();
*/
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC), dim, 1, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
zval_dtor(free_op2.var);
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
zval_dtor(free_op2.var);
EX_T(opline->op1.u.var).var.ptr_ptr) {
PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
}
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 1, BP_VAR_R TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 1, BP_VAR_R TSRMLS_CC);
zval_dtor(free_op2.var);
ZEND_VM_NEXT_OPCODE();
zend_free_op free_op2;
zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC), dim, 1, BP_VAR_IS TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC), dim, 1, BP_VAR_IS TSRMLS_CC);
zval_dtor(free_op2.var);
ZEND_VM_NEXT_OPCODE();
{
zend_op *opline = EX(opline);
zend_free_op free_op1, free_op2;
- int type = ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)?BP_VAR_W:BP_VAR_R;
- zval *dim;
+ zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (IS_TMP_VAR == IS_UNUSED && type == BP_VAR_R) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
- }
- dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC), dim, 1, type TSRMLS_CC);
- zval_dtor(free_op2.var);
- if (IS_CV == IS_VAR && type == BP_VAR_W && 0 &&
- READY_TO_DESTROY(free_op1.var) &&
- !RETURN_VALUE_UNUSED(&opline->result)) {
- AI_USE_PTR(EX_T(opline->result.u.var).var);
- if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
- Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
- SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
+ zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC), dim, 1, BP_VAR_W TSRMLS_CC);
+ if (IS_CV == IS_VAR && 0 &&
+ READY_TO_DESTROY(free_op1.var) &&
+ !RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
+ Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
+ SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ }
+ }
+ } else {
+ if (IS_TMP_VAR == IS_UNUSED) {
+ zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 1, BP_VAR_R TSRMLS_CC);
}
+ zval_dtor(free_op2.var);
ZEND_VM_NEXT_OPCODE();
}
static int zend_fetch_property_address_read_helper_SPEC_CV_TMP(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
-
- container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
+ zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval *retval;
if (1) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (1) {
{
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
-
+ zend_free_op free_op2;
zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+ zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (1) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (1) {
+ zval_ptr_dtor(&property_name);
+ } else {
+ zval_dtor(free_op2.var);
+ }
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
}
if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ zend_free_op free_op2;
+ zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+
+ if (1) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ if (1) {
+ zval_ptr_dtor(&property_name);
+ } else {
+ zval_dtor(free_op2.var);
+ }
} else {
- zend_free_op free_op2, free_op_data1;
+ zend_free_op free_op2, free_op_data1, free_op_data2;
zval *value;
zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 1, BP_VAR_W TSRMLS_CC);
zval_dtor(free_op2.var);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- zend_assign_to_variable(&opline->result, &op_data->op2, &op_data->op1, value, (IS_TMP_FREE(free_op_data1)?IS_TMP_VAR:op_data->op1.op_type), EX(Ts) TSRMLS_CC);
+ variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
+ }
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+ FREE_OP_VAR_PTR(free_op_data2);
FREE_OP_IF_VAR(free_op_data1);
}
zend_op *opline = EX(opline);
zend_free_op free_op2;
zval *value = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_TMP_VAR TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, 1 TSRMLS_CC);
+ }
+
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
- zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (1?IS_TMP_VAR:IS_TMP_VAR), EX(Ts) TSRMLS_CC);
/* zend_assign_to_variable() always takes care of op2, never free it! */
ZEND_VM_NEXT_OPCODE();
*/
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC), dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
EX_T(opline->op1.u.var).var.ptr_ptr) {
PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
}
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
ZEND_VM_NEXT_OPCODE();
zend_free_op free_op2;
zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
ZEND_VM_NEXT_OPCODE();
{
zend_op *opline = EX(opline);
zend_free_op free_op1, free_op2;
- int type = ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)?BP_VAR_W:BP_VAR_R;
- zval *dim;
+ zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (IS_VAR == IS_UNUSED && type == BP_VAR_R) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
- }
- dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC), dim, 0, type TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (IS_CV == IS_VAR && type == BP_VAR_W && 0 &&
- READY_TO_DESTROY(free_op1.var) &&
- !RETURN_VALUE_UNUSED(&opline->result)) {
- AI_USE_PTR(EX_T(opline->result.u.var).var);
- if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
- Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
- SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
+ zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC), dim, 0, BP_VAR_W TSRMLS_CC);
+ if (IS_CV == IS_VAR && 0 &&
+ READY_TO_DESTROY(free_op1.var) &&
+ !RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
+ Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
+ SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ }
}
+ } else {
+ if (IS_VAR == IS_UNUSED) {
+ zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ }
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
}
+ if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
ZEND_VM_NEXT_OPCODE();
}
static int zend_fetch_property_address_read_helper_SPEC_CV_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
-
- container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
+ zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval *retval;
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (0) {
{
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
-
+ zend_free_op free_op2;
zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+ zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+ if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ }
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
}
if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ zend_free_op free_op2;
+ zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+ if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ }
} else {
- zend_free_op free_op2, free_op_data1;
+ zend_free_op free_op2, free_op_data1, free_op_data2;
zval *value;
zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- zend_assign_to_variable(&opline->result, &op_data->op2, &op_data->op1, value, (IS_TMP_FREE(free_op_data1)?IS_TMP_VAR:op_data->op1.op_type), EX(Ts) TSRMLS_CC);
+ variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
+ }
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+ FREE_OP_VAR_PTR(free_op_data2);
FREE_OP_IF_VAR(free_op_data1);
}
zend_op *opline = EX(opline);
zend_free_op free_op2;
zval *value = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
+ zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_VAR TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
+ }
+
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
- zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (0?IS_TMP_VAR:IS_VAR), EX(Ts) TSRMLS_CC);
/* zend_assign_to_variable() always takes care of op2, never free it! */
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = variable_ptr_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
PZVAL_LOCK(*variable_ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
*/
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}
zval *property = NULL;
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC), dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (increment_opline) {
{
zend_op *opline = EX(opline);
zend_free_op free_op1;
- int type = ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)?BP_VAR_W:BP_VAR_R;
- zval *dim;
-
- if (IS_UNUSED == IS_UNUSED && type == BP_VAR_R) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
- }
- dim = NULL;
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC), dim, 0, type TSRMLS_CC);
+ zval *dim = NULL;
- if (IS_CV == IS_VAR && type == BP_VAR_W && 0 &&
- READY_TO_DESTROY(free_op1.var) &&
- !RETURN_VALUE_UNUSED(&opline->result)) {
- AI_USE_PTR(EX_T(opline->result.u.var).var);
- if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
- Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
- SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
+ zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC), dim, 0, BP_VAR_W TSRMLS_CC);
+ if (IS_CV == IS_VAR && 0 &&
+ READY_TO_DESTROY(free_op1.var) &&
+ !RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
+ Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
+ SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ }
}
+ } else {
+ if (IS_UNUSED == IS_UNUSED) {
+ zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ }
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
}
+
ZEND_VM_NEXT_OPCODE();
}
}
if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+
+ zval *property_name = NULL;
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+
+ }
} else {
- zend_free_op free_op_data1;
+ zend_free_op free_op_data1, free_op_data2;
zval *value;
zval *dim = NULL;
+ zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- zend_assign_to_variable(&opline->result, &op_data->op2, &op_data->op1, value, (IS_TMP_FREE(free_op_data1)?IS_TMP_VAR:op_data->op1.op_type), EX(Ts) TSRMLS_CC);
+ variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
+ }
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+ FREE_OP_VAR_PTR(free_op_data2);
FREE_OP_IF_VAR(free_op_data1);
}
zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
- zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
EX_T(result->u.var).var.ptr_ptr = NULL;
FREE_OP(free_op_data1);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
} else {
/* here we are sure we are dealing with an object */
have_get_ptr = 1;
binary_op(*zptr, *zptr, value TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = *zptr;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = *zptr;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(*zptr);
}
}
}
break;
}
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = z;
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = z;
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(z);
}
zval_ptr_dtor(&z);
} else {
zend_error(E_WARNING, "Attempt to assign property of non-object");
if (!RETURN_VALUE_UNUSED(result)) {
- *retval = EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*retval);
+ EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
+ EX_T(result->u.var).var.ptr_ptr = NULL;
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
}
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC), dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- var_ptr = get_zval_ptr_ptr(&op_data->op2, EX(Ts), &free_op_data2, BP_VAR_RW);
+ var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
increment_opline = 1;
}
}
if (*var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr);
- PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
}
}
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = var_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
PZVAL_LOCK(*var_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
if (increment_opline) {
EX_T(opline->op1.u.var).var.ptr_ptr) {
PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
}
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
ZEND_VM_NEXT_OPCODE();
zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC), dim, 0, BP_VAR_IS TSRMLS_CC);
ZEND_VM_NEXT_OPCODE();
{
zend_op *opline = EX(opline);
zend_free_op free_op1;
- int type = ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)?BP_VAR_W:BP_VAR_R;
- zval *dim;
-
- if (IS_CV == IS_UNUSED && type == BP_VAR_R) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
- }
- dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC), dim, 0, type TSRMLS_CC);
+ zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- if (IS_CV == IS_VAR && type == BP_VAR_W && 0 &&
- READY_TO_DESTROY(free_op1.var) &&
- !RETURN_VALUE_UNUSED(&opline->result)) {
- AI_USE_PTR(EX_T(opline->result.u.var).var);
- if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
- Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
- SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
+ zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC), dim, 0, BP_VAR_W TSRMLS_CC);
+ if (IS_CV == IS_VAR && 0 &&
+ READY_TO_DESTROY(free_op1.var) &&
+ !RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
+ Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
+ SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
+ }
+ }
+ } else {
+ if (IS_CV == IS_UNUSED) {
+ zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
+ zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC), dim, 0, BP_VAR_R TSRMLS_CC);
}
+
ZEND_VM_NEXT_OPCODE();
}
static int zend_fetch_property_address_read_helper_SPEC_CV_CV(int type, ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zval *container;
- zval **retval;
-
- retval = &EX_T(opline->result.u.var).var.ptr;
- EX_T(opline->result.u.var).var.ptr_ptr = retval;
-
- container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
+ zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
if (container == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- *retval = EG(error_zval_ptr);
- PZVAL_LOCK(*retval);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
+ PZVAL_LOCK(EG(error_zval_ptr));
}
ZEND_VM_NEXT_OPCODE();
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
}
- *retval = EG(uninitialized_zval_ptr);
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+ PZVAL_LOCK(EG(uninitialized_zval_ptr));
+ }
} else {
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+ zval *retval;
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
}
/* here we are sure we are dealing with an object */
- *retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
+ retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
- if (RETURN_VALUE_UNUSED(&opline->result) && (Z_REFCOUNT_PP(retval) == 0)) {
- zval_dtor(*retval);
- FREE_ZVAL(*retval);
+ if (RETURN_VALUE_UNUSED(&opline->result)) {
+ if (Z_REFCOUNT_P(retval) == 0) {
+ zval_dtor(retval);
+ FREE_ZVAL(retval);
+ }
} else {
- SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
+ AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
+ PZVAL_LOCK(retval);
}
if (0) {
zend_op *op_data = opline+1;
zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+ zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
+ }
/* assign_obj has two opcodes! */
ZEND_VM_INC_OPCODE();
}
if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
- zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+
+ zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+
+ if (0) {
+ MAKE_REAL_ZVAL_PTR(property_name);
+ }
+ zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
+ if (0) {
+ zval_ptr_dtor(&property_name);
+ } else {
+
+ }
} else {
- zend_free_op free_op_data1;
+ zend_free_op free_op_data1, free_op_data2;
zval *value;
zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+ zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
- zend_assign_to_variable(&opline->result, &op_data->op2, &op_data->op1, value, (IS_TMP_FREE(free_op_data1)?IS_TMP_VAR:op_data->op1.op_type), EX(Ts) TSRMLS_CC);
+ variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
+ }
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
+ FREE_OP_VAR_PTR(free_op_data2);
FREE_OP_IF_VAR(free_op_data1);
}
zend_op *opline = EX(opline);
zval *value = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
+ zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+
+ if (!variable_ptr_ptr) {
+ zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CV TSRMLS_CC);
+ } else {
+ value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
+ }
+
+ if (!RETURN_VALUE_UNUSED(&opline->result)) {
+ AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+ PZVAL_LOCK(value);
+ }
- zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (0?IS_TMP_VAR:IS_CV), EX(Ts) TSRMLS_CC);
/* zend_assign_to_variable() always takes care of op2, never free it! */
ZEND_VM_NEXT_OPCODE();
zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
if (!RETURN_VALUE_UNUSED(&opline->result)) {
- EX_T(opline->result.u.var).var.ptr_ptr = variable_ptr_ptr;
+ AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
PZVAL_LOCK(*variable_ptr_ptr);
- AI_USE_PTR(EX_T(opline->result.u.var).var);
}
*/
EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
- AI_USE_PTR(EX_T(opline->op1.u.var).var);
+ EX_T(opline->op1.u.var).var.ptr = NULL;
}
ZEND_VM_NEXT_OPCODE();
}