if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- if (Z_TYPE_P(object_ptr) == IS_REFERENCE) {
+ if (Z_TYPE_P(object_ptr) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(object_ptr)) == IS_OBJECT) {
object_ptr = Z_REFVAL_P(object_ptr);
}
if (Z_TYPE_P(object_ptr) == IS_OBJECT) {
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->str) + Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of FREE_OP_VAR_PTR(free_op_data2);
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (IS_TMP_FREE(free_op_data1)) {
variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR(opline->op1.var), value, IS_CONST TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, IS_CONST TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->str) + Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (0) {
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- if (Z_TYPE_P(object_ptr) == IS_REFERENCE) {
+ if (Z_TYPE_P(object_ptr) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(object_ptr)) == IS_OBJECT) {
object_ptr = Z_REFVAL_P(object_ptr);
}
if (Z_TYPE_P(object_ptr) == IS_OBJECT) {
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->str) + Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of FREE_OP_VAR_PTR(free_op_data2);
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (IS_TMP_FREE(free_op_data1)) {
variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR(opline->op1.var), value, IS_TMP_VAR TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, IS_TMP_VAR TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->str) + Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (1) {
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- if (Z_TYPE_P(object_ptr) == IS_REFERENCE) {
+ if (Z_TYPE_P(object_ptr) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(object_ptr)) == IS_OBJECT) {
object_ptr = Z_REFVAL_P(object_ptr);
}
if (Z_TYPE_P(object_ptr) == IS_OBJECT) {
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->str) + Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of FREE_OP_VAR_PTR(free_op_data2);
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (IS_TMP_FREE(free_op_data1)) {
variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR(opline->op1.var), value, IS_VAR TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, IS_VAR TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->str) + Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (0) {
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- if (Z_TYPE_P(object_ptr) == IS_REFERENCE) {
+ if (Z_TYPE_P(object_ptr) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(object_ptr)) == IS_OBJECT) {
object_ptr = Z_REFVAL_P(object_ptr);
}
if (Z_TYPE_P(object_ptr) == IS_OBJECT) {
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->str) + Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of FREE_OP_VAR_PTR(free_op_data2);
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (IS_TMP_FREE(free_op_data1)) {
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- if (Z_TYPE_P(object_ptr) == IS_REFERENCE) {
+ if (Z_TYPE_P(object_ptr) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(object_ptr)) == IS_OBJECT) {
object_ptr = Z_REFVAL_P(object_ptr);
}
if (Z_TYPE_P(object_ptr) == IS_OBJECT) {
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->str) + Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of FREE_OP_VAR_PTR(free_op_data2);
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (IS_TMP_FREE(free_op_data1)) {
variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR(opline->op1.var), value, IS_CV TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, IS_CV TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->str) + Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (0) {
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- if (Z_TYPE_P(object_ptr) == IS_REFERENCE) {
+ if (Z_TYPE_P(object_ptr) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(object_ptr)) == IS_OBJECT) {
object_ptr = Z_REFVAL_P(object_ptr);
}
if (Z_TYPE_P(object_ptr) == IS_OBJECT) {
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->str) + Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of FREE_OP_VAR_PTR(free_op_data2);
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (IS_TMP_FREE(free_op_data1)) {
variable_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR(opline->op1.var), value, IS_CONST TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, IS_CONST TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->str) + Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (0) {
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- if (Z_TYPE_P(object_ptr) == IS_REFERENCE) {
+ if (Z_TYPE_P(object_ptr) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(object_ptr)) == IS_OBJECT) {
object_ptr = Z_REFVAL_P(object_ptr);
}
if (Z_TYPE_P(object_ptr) == IS_OBJECT) {
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->str) + Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of FREE_OP_VAR_PTR(free_op_data2);
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (IS_TMP_FREE(free_op_data1)) {
variable_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR(opline->op1.var), value, IS_TMP_VAR TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, IS_TMP_VAR TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->str) + Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (1) {
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- if (Z_TYPE_P(object_ptr) == IS_REFERENCE) {
+ if (Z_TYPE_P(object_ptr) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(object_ptr)) == IS_OBJECT) {
object_ptr = Z_REFVAL_P(object_ptr);
}
if (Z_TYPE_P(object_ptr) == IS_OBJECT) {
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->str) + Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of FREE_OP_VAR_PTR(free_op_data2);
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (IS_TMP_FREE(free_op_data1)) {
variable_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR(opline->op1.var), value, IS_VAR TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, IS_VAR TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->str) + Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (0) {
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- if (Z_TYPE_P(object_ptr) == IS_REFERENCE) {
+ if (Z_TYPE_P(object_ptr) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(object_ptr)) == IS_OBJECT) {
object_ptr = Z_REFVAL_P(object_ptr);
}
if (Z_TYPE_P(object_ptr) == IS_OBJECT) {
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->str) + Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of FREE_OP_VAR_PTR(free_op_data2);
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (IS_TMP_FREE(free_op_data1)) {
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- if (Z_TYPE_P(object_ptr) == IS_REFERENCE) {
+ if (Z_TYPE_P(object_ptr) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(object_ptr)) == IS_OBJECT) {
object_ptr = Z_REFVAL_P(object_ptr);
}
if (Z_TYPE_P(object_ptr) == IS_OBJECT) {
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
if (UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->str) + Z_STR_OFFSET_P(EX_VAR((opline+1)->op2.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of FREE_OP_VAR_PTR(free_op_data2);
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (IS_TMP_FREE(free_op_data1)) {
variable_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET)) {
- if (zend_assign_to_string_offset(EX_VAR(opline->op1.var), value, IS_CV TSRMLS_CC)) {
+ zend_string *old_str = Z_STR_P(Z_STR_OFFSET_P(variable_ptr)->str);
+ if (zend_assign_to_string_offset(variable_ptr, value, IS_CV TSRMLS_CC)) {
if (RETURN_VALUE_USED(opline)) {
ZVAL_STRINGL(EX_VAR(opline->result.var), Z_STRVAL_P(Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->str) + Z_STR_OFFSET_P(EX_VAR(opline->op1.var))->offset, 1);
}
ZVAL_NULL(EX_VAR(opline->result.var));
}
//??? instead of
-//??? zval_ptr_dtor(Z_STR_OFFSET_P(variable_ptr)->str);
+ STR_RELEASE(old_str);
efree(Z_STR_OFFSET_P(variable_ptr));
} else if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) {
if (0) {