zval_ptr_dtor_nogc(EX_VAR(var)); \
}
-#define FREE_UNFETCHED_OP(type, var) \
- FREE_OP(type, var)
-
#define FREE_OP_VAR_PTR(type, var) \
FREE_OP(type, var)
if (EXPECTED((ce = CACHED_PTR(cache_slot)) == NULL)) {
ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
- FREE_UNFETCHED_OP(op1_type, opline->op1.var);
+ FREE_OP(op1_type, opline->op1.var);
return FAILURE;
}
if (UNEXPECTED(op1_type != IS_CONST)) {
if (EXPECTED(op2_type == IS_UNUSED)) {
ce = zend_fetch_class(NULL, opline->op2.num);
if (UNEXPECTED(ce == NULL)) {
- FREE_UNFETCHED_OP(op1_type, opline->op1.var);
+ FREE_OP(op1_type, opline->op1.var);
return FAILURE;
}
} else {
if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
UNDEF_RESULT();
- FREE_UNFETCHED_OP_DATA();
+ FREE_OP_DATA();
HANDLE_EXCEPTION();
}
SAVE_OPLINE();
zend_throw_error(NULL, "Cannot use temporary expression in write context");
- FREE_UNFETCHED_OP2();
- FREE_UNFETCHED_OP1();
+ FREE_OP2();
+ FREE_OP1();
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
SAVE_OPLINE();
zend_throw_error(NULL, "Cannot use [] for reading");
- FREE_UNFETCHED_OP2();
- FREE_UNFETCHED_OP1();
+ FREE_OP2();
+ FREE_OP1();
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
SAVE_OPLINE();
if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
- FREE_UNFETCHED_OP_DATA();
+ FREE_OP_DATA();
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) {
if (OP2_TYPE == IS_UNUSED) {
zend_use_new_element_for_string();
- FREE_UNFETCHED_OP_DATA();
+ FREE_OP_DATA();
UNDEF_RESULT();
} else {
dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
&& ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
&& !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
- FREE_UNFETCHED_OP_DATA();
+ FREE_OP_DATA();
UNDEF_RESULT();
} else {
ZVAL_ARR(object_ptr, zend_new_array(8));
zend_use_scalar_as_array();
dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
ZEND_VM_C_LABEL(assign_dim_error):
- FREE_UNFETCHED_OP_DATA();
+ FREE_OP_DATA();
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
SAVE_OPLINE();
if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
- FREE_UNFETCHED_OP_DATA();
+ FREE_OP_DATA();
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
- FREE_UNFETCHED_OP2();
+ FREE_OP2();
HANDLE_EXCEPTION();
}
if (OP2_TYPE != IS_CONST) {
} else if (OP1_TYPE == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num);
if (UNEXPECTED(ce == NULL)) {
- FREE_UNFETCHED_OP2();
+ FREE_OP2();
HANDLE_EXCEPTION();
}
} else {
SAVE_OPLINE();
zend_throw_error(NULL, "Cannot pass parameter %d by reference", arg_num);
- FREE_UNFETCHED_OP1();
+ FREE_OP1();
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_UNDEF(arg);
HANDLE_EXCEPTION();
}
}
zend_type_error("call_user_func_array(): Argument #2 ($args) must be of type array, %s given", zend_zval_type_name(args));
- FREE_UNFETCHED_OP2();
+ FREE_OP2();
FREE_OP1();
HANDLE_EXCEPTION();
} else {
if (UNEXPECTED(ce == NULL)) {
ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
- FREE_UNFETCHED_OP1();
+ FREE_OP1();
HANDLE_EXCEPTION();
}
/*CACHE_PTR(opline->extended_value, ce);*/
} else if (OP2_TYPE == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op2.num);
if (UNEXPECTED(ce == NULL)) {
- FREE_UNFETCHED_OP1();
+ FREE_OP1();
HANDLE_EXCEPTION();
}
} else {
SAVE_OPLINE();
zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- FREE_UNFETCHED_OP2();
- FREE_UNFETCHED_OP1();
+ FREE_OP2();
+ FREE_OP1();
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
UNDEF_RESULT();
- FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
HANDLE_EXCEPTION();
}
SAVE_OPLINE();
zend_throw_error(NULL, "Cannot use temporary expression in write context");
- FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var);
- FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ FREE_OP(opline->op2_type, opline->op2.var);
+ FREE_OP(opline->op1_type, opline->op1.var);
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
SAVE_OPLINE();
zend_throw_error(NULL, "Cannot use [] for reading");
- FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var);
- FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ FREE_OP(opline->op2_type, opline->op2.var);
+ FREE_OP(opline->op1_type, opline->op1.var);
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
}
SAVE_OPLINE();
if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
- FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
SAVE_OPLINE();
zend_throw_error(NULL, "Cannot pass parameter %d by reference", arg_num);
- FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ FREE_OP(opline->op1_type, opline->op1.var);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_UNDEF(arg);
HANDLE_EXCEPTION();
}
}
zend_type_error("call_user_func_array(): Argument #2 ($args) must be of type array, %s given", zend_zval_type_name(args));
- FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var);
+ FREE_OP(opline->op2_type, opline->op2.var);
FREE_OP(opline->op1_type, opline->op1.var);
HANDLE_EXCEPTION();
} else {
if (UNEXPECTED(ce == NULL)) {
ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
- FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ FREE_OP(opline->op1_type, opline->op1.var);
HANDLE_EXCEPTION();
}
/*CACHE_PTR(opline->extended_value, ce);*/
} else if (opline->op2_type == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op2.num);
if (UNEXPECTED(ce == NULL)) {
- FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ FREE_OP(opline->op1_type, opline->op1.var);
HANDLE_EXCEPTION();
}
} else {
SAVE_OPLINE();
zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator");
- FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var);
- FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ FREE_OP(opline->op2_type, opline->op2.var);
+ FREE_OP(opline->op1_type, opline->op1.var);
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
"TMPVARCV" => "???",
);
-$op1_free_unfetched = array(
- "ANY" => "FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var)",
- "TMP" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))",
- "VAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))",
- "TMPVARCV" => "???",
-);
-
-$op2_free_unfetched = array(
- "ANY" => "FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var)",
- "TMP" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))",
- "VAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))",
- "TMPVARCV" => "???",
-);
-
$op_data_type = array(
"ANY" => "(opline+1)->op1_type",
"TMP" => "IS_TMP_VAR",
"TMPVARCV" => "???",
);
-$op_data_free_unfetched = array(
- "ANY" => "FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var)",
- "TMP" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))",
- "VAR" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))",
- "TMPVARCV" => "???",
-);
-
$list = array(); // list of opcode handlers and helpers in original order
$opcodes = array(); // opcode handlers by code
$helpers = array(); // opcode helpers by name
"/FREE_OP2_IF_VAR\(\)/" => $op2_free_op_if_var[$op2],
"/FREE_OP1_VAR_PTR\(\)/" => $op1_free_op_var_ptr[$op1],
"/FREE_OP2_VAR_PTR\(\)/" => $op2_free_op_var_ptr[$op2],
- "/FREE_UNFETCHED_OP1\(\)/" => $op1_free_unfetched[$op1],
- "/FREE_UNFETCHED_OP2\(\)/" => $op2_free_unfetched[$op2],
"/\!ZEND_VM_SPEC/m" => ($op1!="ANY"||$op2!="ANY")?"0":"1",
"/ZEND_VM_SPEC/m" => ($op1!="ANY"||$op2!="ANY")?"1":"0",
"/ZEND_VM_C_LABEL\(\s*([A-Za-z_]*)\s*\)/m" => "\\1".(($spec && $kind != ZEND_VM_KIND_CALL)?("_SPEC".$prefix[$op1].$prefix[$op2].extra_spec_name($extra_spec)):""),
"/GET_OP_DATA_ZVAL_PTR_PTR\(([^)]*)\)/" => $op_data_get_zval_ptr_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
"/FREE_OP_DATA\(\)/" => $op_data_free_op[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
"/FREE_OP_DATA_VAR_PTR\(\)/" => $op_data_free_op_var_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
- "/FREE_UNFETCHED_OP_DATA\(\)/" => $op_data_free_unfetched[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
"/RETURN_VALUE_USED\(opline\)/" => isset($extra_spec['RETVAL']) ? $extra_spec['RETVAL'] : "RETURN_VALUE_USED(opline)",
"/arg_num <= MAX_ARG_FLAG_NUM/" => isset($extra_spec['QUICK_ARG']) ? $extra_spec['QUICK_ARG'] : "arg_num <= MAX_ARG_FLAG_NUM",
"/ZEND_VM_SMART_BRANCH\(\s*([^,)]*)\s*,\s*([^)]*)\s*\)/" => isset($extra_spec['SMART_BRANCH']) ?