mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Delay checks for undefined CV variables after checks for fast paths.
This commit is contained in:
parent
aca6a1a1c9
commit
7f39ee7159
@ -57,6 +57,7 @@ typedef int (ZEND_FASTCALL *incdec_t)(zval *);
|
||||
#define get_zval_ptr_ptr(op_type, node, ex, should_free, type) _get_zval_ptr_ptr(op_type, node, ex, should_free, type)
|
||||
#define get_zval_ptr_ptr_undef(op_type, node, ex, should_free, type) _get_zval_ptr_ptr(op_type, node, ex, should_free, type)
|
||||
#define get_obj_zval_ptr(op_type, node, ex, should_free, type) _get_obj_zval_ptr(op_type, node, ex, should_free, type)
|
||||
#define get_obj_zval_ptr_undef(op_type, node, ex, should_free, type) _get_obj_zval_ptr_undef(op_type, node, ex, should_free, type)
|
||||
#define get_obj_zval_ptr_ptr(op_type, node, ex, should_free, type) _get_obj_zval_ptr_ptr(op_type, node, ex, should_free, type)
|
||||
|
||||
/* Prototypes */
|
||||
@ -516,6 +517,15 @@ static inline zval *_get_obj_zval_ptr(int op_type, znode_op op, zend_execute_dat
|
||||
return get_zval_ptr(op_type, op, execute_data, should_free, type);
|
||||
}
|
||||
|
||||
static inline zval *_get_obj_zval_ptr_undef(int op_type, znode_op op, zend_execute_data *execute_data, zend_free_op *should_free, int type)
|
||||
{
|
||||
if (op_type == IS_UNUSED) {
|
||||
*should_free = NULL;
|
||||
return &EX(This);
|
||||
}
|
||||
return get_zval_ptr_undef(op_type, op, execute_data, should_free, type);
|
||||
}
|
||||
|
||||
static inline zval *_get_obj_zval_ptr_ptr(int op_type, znode_op node, zend_execute_data *execute_data, zend_free_op *should_free, int type)
|
||||
{
|
||||
if (op_type == IS_UNUSED) {
|
||||
|
@ -251,8 +251,8 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
|
||||
zval *op1, *op2;
|
||||
|
||||
SAVE_OPLINE();
|
||||
op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
do {
|
||||
if ((OP1_TYPE == IS_CONST || EXPECTED(Z_TYPE_P(op1) == IS_STRING)) &&
|
||||
@ -290,6 +290,12 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
|
||||
ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
|
||||
}
|
||||
} else {
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
|
||||
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
|
||||
}
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
|
||||
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
|
||||
}
|
||||
concat_function(EX_VAR(opline->result.var), op1, op2);
|
||||
}
|
||||
FREE_OP1();
|
||||
@ -350,18 +356,18 @@ ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
|
||||
do {
|
||||
int result;
|
||||
|
||||
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
|
||||
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
|
||||
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
|
||||
if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
|
||||
result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
|
||||
} else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
|
||||
} else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
|
||||
result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
|
||||
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
|
||||
} else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
|
||||
if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
|
||||
result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
|
||||
} else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
|
||||
} else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
|
||||
result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
|
||||
} else {
|
||||
break;
|
||||
@ -393,10 +399,10 @@ ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
|
||||
} while (0);
|
||||
|
||||
SAVE_OPLINE();
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
|
||||
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
|
||||
}
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
|
||||
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
|
||||
}
|
||||
result = EX_VAR(opline->result.var);
|
||||
@ -419,18 +425,18 @@ ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
|
||||
do {
|
||||
int result;
|
||||
|
||||
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
|
||||
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
|
||||
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
|
||||
if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
|
||||
result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
|
||||
} else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
|
||||
} else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
|
||||
result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
|
||||
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
|
||||
} else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
|
||||
if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
|
||||
result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
|
||||
} else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
|
||||
} else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
|
||||
result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
|
||||
} else {
|
||||
break;
|
||||
@ -462,10 +468,10 @@ ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
|
||||
} while (0);
|
||||
|
||||
SAVE_OPLINE();
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
|
||||
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
|
||||
}
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
|
||||
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
|
||||
}
|
||||
result = EX_VAR(opline->result.var);
|
||||
@ -1434,7 +1440,7 @@ ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
|
||||
zval *z;
|
||||
|
||||
SAVE_OPLINE();
|
||||
z = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
z = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
if (Z_TYPE_P(z) == IS_STRING) {
|
||||
zend_string *str = Z_STR_P(z);
|
||||
@ -1447,6 +1453,8 @@ ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
|
||||
|
||||
if (str->len != 0) {
|
||||
zend_write(str->val, str->len);
|
||||
} else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(z) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(z, BP_VAR_R);
|
||||
}
|
||||
zend_string_release(str);
|
||||
}
|
||||
@ -1466,7 +1474,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED|CONST|V
|
||||
HashTable *target_symbol_table;
|
||||
|
||||
SAVE_OPLINE();
|
||||
varname = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
if (OP1_TYPE == IS_CONST) {
|
||||
name = Z_STR_P(varname);
|
||||
@ -1474,6 +1482,9 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED|CONST|V
|
||||
name = Z_STR_P(varname);
|
||||
zend_string_addref(name);
|
||||
} else {
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(varname, BP_VAR_R);
|
||||
}
|
||||
name = zval_get_string(varname);
|
||||
}
|
||||
|
||||
@ -2077,7 +2088,7 @@ ZEND_VM_HANDLER(98, ZEND_FETCH_LIST, CONST|TMPVAR|CV, CONST)
|
||||
zval *container;
|
||||
|
||||
SAVE_OPLINE();
|
||||
container = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
ZEND_VM_C_LABEL(try_fetch_list):
|
||||
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
|
||||
@ -2106,6 +2117,9 @@ ZEND_VM_C_LABEL(try_fetch_list):
|
||||
container = Z_REFVAL_P(container);
|
||||
ZEND_VM_C_GOTO(try_fetch_list);
|
||||
} else {
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(container, BP_VAR_R);
|
||||
}
|
||||
ZVAL_NULL(EX_VAR(opline->result.var));
|
||||
}
|
||||
CHECK_EXCEPTION();
|
||||
@ -2683,17 +2697,27 @@ ZEND_VM_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
|
||||
zend_string *op1_str, *op2_str, *str;
|
||||
|
||||
SAVE_OPLINE();
|
||||
op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
if (OP1_TYPE == IS_CONST) {
|
||||
op1_str = Z_STR_P(op1);
|
||||
} else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
|
||||
op1_str = zend_string_copy(Z_STR_P(op1));
|
||||
} else {
|
||||
op1_str = zval_get_string(op1);
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(op1, BP_VAR_R);
|
||||
}
|
||||
op1_str = _zval_get_string_func(op1);
|
||||
}
|
||||
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
if (OP2_TYPE == IS_CONST) {
|
||||
op2_str = Z_STR_P(op2);
|
||||
} else if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
|
||||
op2_str = zend_string_copy(Z_STR_P(op2));
|
||||
} else {
|
||||
op2_str = zval_get_string(op2);
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(op2, BP_VAR_R);
|
||||
}
|
||||
op2_str = _zval_get_string_func(op2);
|
||||
}
|
||||
do {
|
||||
if (OP1_TYPE != IS_CONST) {
|
||||
@ -2746,11 +2770,22 @@ ZEND_VM_HANDLER(54, ZEND_ROPE_INIT, UNUSED, CONST|TMPVAR|CV)
|
||||
var = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
rope[0] = zend_string_copy(Z_STR_P(var));
|
||||
} else {
|
||||
SAVE_OPLINE();
|
||||
var = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
rope[0] = zval_get_string(var);
|
||||
FREE_OP2();
|
||||
CHECK_EXCEPTION();
|
||||
var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
|
||||
if (OP2_TYPE == IS_CV) {
|
||||
rope[0] = zend_string_copy(Z_STR_P(var));
|
||||
} else {
|
||||
rope[0] = Z_STR_P(var);
|
||||
}
|
||||
} else {
|
||||
SAVE_OPLINE();
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(var, BP_VAR_R);
|
||||
}
|
||||
rope[0] = _zval_get_string_func(var);
|
||||
FREE_OP2();
|
||||
CHECK_EXCEPTION();
|
||||
}
|
||||
}
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
@ -2768,11 +2803,22 @@ ZEND_VM_HANDLER(55, ZEND_ROPE_ADD, TMP, CONST|TMPVAR|CV)
|
||||
var = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
|
||||
} else {
|
||||
SAVE_OPLINE();
|
||||
var = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
rope[opline->extended_value] = zval_get_string(var);
|
||||
FREE_OP2();
|
||||
CHECK_EXCEPTION();
|
||||
var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
|
||||
if (OP2_TYPE == IS_CV) {
|
||||
rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
|
||||
} else {
|
||||
rope[opline->extended_value] = Z_STR_P(var);
|
||||
}
|
||||
} else {
|
||||
SAVE_OPLINE();
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(var, BP_VAR_R);
|
||||
}
|
||||
rope[opline->extended_value] = _zval_get_string_func(var);
|
||||
FREE_OP2();
|
||||
CHECK_EXCEPTION();
|
||||
}
|
||||
}
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
@ -2792,11 +2838,22 @@ ZEND_VM_HANDLER(56, ZEND_ROPE_END, TMP, CONST|TMPVAR|CV)
|
||||
var = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
|
||||
} else {
|
||||
SAVE_OPLINE();
|
||||
var = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
rope[opline->extended_value] = zval_get_string(var);
|
||||
FREE_OP2();
|
||||
CHECK_EXCEPTION();
|
||||
var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
if (EXPECTED(Z_TYPE_P(var) == IS_STRING)) {
|
||||
if (OP2_TYPE == IS_CV) {
|
||||
rope[opline->extended_value] = zend_string_copy(Z_STR_P(var));
|
||||
} else {
|
||||
rope[opline->extended_value] = Z_STR_P(var);
|
||||
}
|
||||
} else {
|
||||
SAVE_OPLINE();
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(var, BP_VAR_R);
|
||||
}
|
||||
rope[opline->extended_value] = _zval_get_string_func(var);
|
||||
FREE_OP2();
|
||||
CHECK_EXCEPTION();
|
||||
}
|
||||
}
|
||||
for (i = 0; i <= opline->extended_value; i++) {
|
||||
len += rope[i]->len;
|
||||
@ -2828,7 +2885,7 @@ ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMPVAR|UNUSED|CV)
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
} else {
|
||||
zend_free_op free_op2;
|
||||
zval *class_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
zval *class_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
ZEND_VM_C_LABEL(try_class_name):
|
||||
if (OP2_TYPE == IS_CONST) {
|
||||
@ -2846,6 +2903,9 @@ ZEND_VM_C_LABEL(try_class_name):
|
||||
class_name = Z_REFVAL_P(class_name);
|
||||
ZEND_VM_C_GOTO(try_class_name);
|
||||
} else {
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
@ -2872,7 +2932,7 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR
|
||||
|
||||
SAVE_OPLINE();
|
||||
|
||||
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
if (OP2_TYPE != IS_CONST &&
|
||||
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
|
||||
@ -2883,6 +2943,9 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
@ -2893,7 +2956,7 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR
|
||||
} while (0);
|
||||
}
|
||||
|
||||
object = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_R);
|
||||
object = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
|
||||
zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context");
|
||||
@ -2910,6 +2973,9 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(object, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
@ -3015,9 +3081,12 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE
|
||||
} else if (OP2_TYPE != IS_UNUSED) {
|
||||
zend_free_op free_op2;
|
||||
|
||||
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
if (OP2_TYPE != IS_CONST) {
|
||||
if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
@ -3145,7 +3214,7 @@ ZEND_VM_HANDLER(128, ZEND_INIT_DYNAMIC_CALL, ANY, CONST|TMPVAR|CV)
|
||||
uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
|
||||
|
||||
SAVE_OPLINE();
|
||||
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
ZEND_VM_C_LABEL(try_function_name):
|
||||
if (OP2_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
|
||||
@ -3325,6 +3394,9 @@ ZEND_VM_C_LABEL(try_function_name):
|
||||
function_name = Z_REFVAL_P(function_name);
|
||||
ZEND_VM_C_GOTO(try_function_name);
|
||||
} else {
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
|
||||
GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
@ -4053,7 +4125,7 @@ ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
|
||||
zend_free_op free_op1;
|
||||
|
||||
SAVE_OPLINE();
|
||||
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
do {
|
||||
if (OP1_TYPE == IS_CONST || UNEXPECTED(Z_TYPE_P(value) != IS_OBJECT)) {
|
||||
@ -4063,6 +4135,9 @@ ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(value, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
@ -4348,7 +4423,7 @@ ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY)
|
||||
int arg_num;
|
||||
|
||||
SAVE_OPLINE();
|
||||
args = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
args = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
arg_num = ZEND_CALL_NUM_ARGS(EX(call)) + 1;
|
||||
|
||||
ZEND_VM_C_LABEL(send_again):
|
||||
@ -4491,6 +4566,9 @@ ZEND_VM_C_LABEL(unpack_iter_dtor):
|
||||
args = Z_REFVAL_P(args);
|
||||
ZEND_VM_C_GOTO(send_again);
|
||||
} else {
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(args, BP_VAR_R);
|
||||
}
|
||||
zend_error(E_WARNING, "Only arrays and Traversables can be unpacked");
|
||||
}
|
||||
|
||||
@ -4819,18 +4897,18 @@ ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
|
||||
do {
|
||||
int result;
|
||||
|
||||
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
|
||||
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
|
||||
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
|
||||
if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
|
||||
result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
|
||||
} else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
|
||||
} else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
|
||||
result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
|
||||
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
|
||||
} else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
|
||||
if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
|
||||
result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
|
||||
} else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
|
||||
} else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
|
||||
result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
|
||||
} else {
|
||||
break;
|
||||
@ -4861,10 +4939,10 @@ ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
|
||||
} while (0);
|
||||
|
||||
SAVE_OPLINE();
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
|
||||
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
|
||||
}
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
|
||||
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
|
||||
}
|
||||
result = EX_VAR(opline->result.var);
|
||||
@ -4940,7 +5018,7 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|CV, ANY)
|
||||
zend_object_clone_obj_t clone_call;
|
||||
|
||||
SAVE_OPLINE();
|
||||
obj = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_R);
|
||||
obj = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) {
|
||||
zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context");
|
||||
@ -4955,7 +5033,10 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|CV, ANY)
|
||||
if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(obj, BP_VAR_R);
|
||||
}
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
@ -5169,7 +5250,7 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSE
|
||||
|
||||
if (OP2_TYPE != IS_UNUSED) {
|
||||
zend_free_op free_op2;
|
||||
zval *offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
zval *offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
zend_string *str;
|
||||
zend_ulong hval;
|
||||
|
||||
@ -5202,6 +5283,10 @@ ZEND_VM_C_LABEL(num_index):
|
||||
} else if (Z_TYPE_P(offset) == IS_TRUE) {
|
||||
hval = 1;
|
||||
ZEND_VM_C_GOTO(num_index);
|
||||
} else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
|
||||
GET_OP2_UNDEF_CV(offset, BP_VAR_R);
|
||||
str = STR_EMPTY_ALLOC();
|
||||
ZEND_VM_C_GOTO(str_index);
|
||||
} else {
|
||||
zend_error(E_WARNING, "Illegal offset type");
|
||||
zval_ptr_dtor(expr_ptr);
|
||||
@ -5360,10 +5445,13 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY)
|
||||
zend_bool failure_retval=0;
|
||||
|
||||
SAVE_OPLINE();
|
||||
inc_filename = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
inc_filename = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
ZVAL_UNDEF(&tmp_inc_filename);
|
||||
if (Z_TYPE_P(inc_filename) != IS_STRING) {
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(inc_filename) == IS_UNDEF)) {
|
||||
inc_filename = GET_OP1_UNDEF_CV(inc_filename, BP_VAR_R);
|
||||
}
|
||||
ZVAL_STR(&tmp_inc_filename, zval_get_string(inc_filename));
|
||||
inc_filename = &tmp_inc_filename;
|
||||
}
|
||||
@ -5506,10 +5594,13 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED|CONST|VAR)
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
varname = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
ZVAL_UNDEF(&tmp);
|
||||
if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
|
||||
varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
|
||||
}
|
||||
ZVAL_STR(&tmp, zval_get_string(varname));
|
||||
varname = &tmp;
|
||||
}
|
||||
@ -5576,65 +5667,79 @@ ZEND_VM_HANDLER(75, ZEND_UNSET_DIM, VAR|UNUSED|CV, CONST|TMPVAR|CV)
|
||||
FREE_UNFETCHED_OP2();
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
ZEND_VM_C_LABEL(unset_dim_again):
|
||||
if (OP1_TYPE != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
|
||||
HashTable *ht;
|
||||
do {
|
||||
if (OP1_TYPE != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
|
||||
HashTable *ht;
|
||||
|
||||
ZEND_VM_C_LABEL(unset_dim_array):
|
||||
SEPARATE_ARRAY(container);
|
||||
ht = Z_ARRVAL_P(container);
|
||||
ZEND_VM_C_LABEL(offset_again):
|
||||
SEPARATE_ARRAY(container);
|
||||
ht = Z_ARRVAL_P(container);
|
||||
if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
|
||||
key = Z_STR_P(offset);
|
||||
if (OP2_TYPE != IS_CONST) {
|
||||
if (ZEND_HANDLE_NUMERIC(key, hval)) {
|
||||
ZEND_VM_C_GOTO(num_index_dim);
|
||||
if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
|
||||
key = Z_STR_P(offset);
|
||||
if (OP2_TYPE != IS_CONST) {
|
||||
if (ZEND_HANDLE_NUMERIC(key, hval)) {
|
||||
ZEND_VM_C_GOTO(num_index_dim);
|
||||
}
|
||||
}
|
||||
}
|
||||
ZEND_VM_C_LABEL(str_index_dim):
|
||||
if (ht == &EG(symbol_table)) {
|
||||
zend_delete_global_variable(key);
|
||||
} else {
|
||||
zend_hash_del(ht, key);
|
||||
}
|
||||
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
|
||||
hval = Z_LVAL_P(offset);
|
||||
if (ht == &EG(symbol_table)) {
|
||||
zend_delete_global_variable(key);
|
||||
} else {
|
||||
zend_hash_del(ht, key);
|
||||
}
|
||||
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
|
||||
hval = Z_LVAL_P(offset);
|
||||
ZEND_VM_C_LABEL(num_index_dim):
|
||||
zend_hash_index_del(ht, hval);
|
||||
} else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
|
||||
offset = Z_REFVAL_P(offset);
|
||||
ZEND_VM_C_GOTO(offset_again);
|
||||
} else if (Z_TYPE_P(offset) == IS_DOUBLE) {
|
||||
hval = zend_dval_to_lval(Z_DVAL_P(offset));
|
||||
ZEND_VM_C_GOTO(num_index_dim);
|
||||
} else if (Z_TYPE_P(offset) == IS_NULL) {
|
||||
key = STR_EMPTY_ALLOC();
|
||||
ZEND_VM_C_GOTO(str_index_dim);
|
||||
} else if (Z_TYPE_P(offset) == IS_FALSE) {
|
||||
hval = 0;
|
||||
ZEND_VM_C_GOTO(num_index_dim);
|
||||
} else if (Z_TYPE_P(offset) == IS_TRUE) {
|
||||
hval = 1;
|
||||
ZEND_VM_C_GOTO(num_index_dim);
|
||||
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
|
||||
hval = Z_RES_HANDLE_P(offset);
|
||||
ZEND_VM_C_GOTO(num_index_dim);
|
||||
} else {
|
||||
zend_error(E_WARNING, "Illegal offset type in unset");
|
||||
zend_hash_index_del(ht, hval);
|
||||
} else if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
|
||||
offset = Z_REFVAL_P(offset);
|
||||
ZEND_VM_C_GOTO(offset_again);
|
||||
} else if (Z_TYPE_P(offset) == IS_DOUBLE) {
|
||||
hval = zend_dval_to_lval(Z_DVAL_P(offset));
|
||||
ZEND_VM_C_GOTO(num_index_dim);
|
||||
} else if (Z_TYPE_P(offset) == IS_NULL) {
|
||||
key = STR_EMPTY_ALLOC();
|
||||
ZEND_VM_C_GOTO(str_index_dim);
|
||||
} else if (Z_TYPE_P(offset) == IS_FALSE) {
|
||||
hval = 0;
|
||||
ZEND_VM_C_GOTO(num_index_dim);
|
||||
} else if (Z_TYPE_P(offset) == IS_TRUE) {
|
||||
hval = 1;
|
||||
ZEND_VM_C_GOTO(num_index_dim);
|
||||
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
|
||||
hval = Z_RES_HANDLE_P(offset);
|
||||
ZEND_VM_C_GOTO(num_index_dim);
|
||||
} else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
|
||||
GET_OP2_UNDEF_CV(offset, BP_VAR_R);
|
||||
key = STR_EMPTY_ALLOC();
|
||||
ZEND_VM_C_GOTO(str_index_dim);
|
||||
} else {
|
||||
zend_error(E_WARNING, "Illegal offset type in unset");
|
||||
}
|
||||
break;
|
||||
} else if (OP1_TYPE != IS_UNUSED && Z_ISREF_P(container)) {
|
||||
container = Z_REFVAL_P(container);
|
||||
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
|
||||
ZEND_VM_C_GOTO(unset_dim_array);
|
||||
}
|
||||
}
|
||||
} else if (OP1_TYPE == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
|
||||
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
|
||||
zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
|
||||
} else {
|
||||
Z_OBJ_HT_P(container)->unset_dimension(container, offset);
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
|
||||
offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
|
||||
}
|
||||
} else if (OP1_TYPE != IS_UNUSED && Z_ISREF_P(container)) {
|
||||
container = Z_REFVAL_P(container);
|
||||
ZEND_VM_C_GOTO(unset_dim_again);
|
||||
} else if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
|
||||
zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
|
||||
}
|
||||
if (OP1_TYPE == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
|
||||
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
|
||||
zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
|
||||
} else {
|
||||
Z_OBJ_HT_P(container)->unset_dimension(container, offset);
|
||||
}
|
||||
} else if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
|
||||
zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
|
||||
}
|
||||
} while (0);
|
||||
|
||||
FREE_OP2();
|
||||
FREE_OP1_VAR_PTR();
|
||||
CHECK_EXCEPTION();
|
||||
@ -6461,7 +6566,7 @@ ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMPVAR|UNUSED|CV, CONST|T
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
|
||||
offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
if (OP1_TYPE != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
|
||||
HashTable *ht;
|
||||
@ -6502,6 +6607,10 @@ ZEND_VM_C_LABEL(num_index_prop):
|
||||
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
|
||||
hval = Z_RES_HANDLE_P(offset);
|
||||
ZEND_VM_C_GOTO(num_index_prop);
|
||||
} else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
|
||||
GET_OP2_UNDEF_CV(offset, BP_VAR_R);
|
||||
str = STR_EMPTY_ALLOC();
|
||||
ZEND_VM_C_GOTO(str_index_prop);
|
||||
} else {
|
||||
zend_error(E_WARNING, "Illegal offset type in isset or empty");
|
||||
ZEND_VM_C_GOTO(isset_not_found);
|
||||
@ -6521,6 +6630,11 @@ ZEND_VM_C_LABEL(num_index_prop):
|
||||
ZEND_VM_C_GOTO(isset_dim_obj_array);
|
||||
}
|
||||
}
|
||||
|
||||
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
|
||||
offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
|
||||
}
|
||||
|
||||
if (OP1_TYPE == IS_UNUSED ||
|
||||
(OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(container) == IS_OBJECT))) {
|
||||
if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
|
||||
@ -6944,7 +7058,7 @@ ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMPVAR|CV, CONST|VAR)
|
||||
zend_bool result;
|
||||
|
||||
SAVE_OPLINE();
|
||||
expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
expr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
|
||||
ZEND_VM_C_LABEL(try_instanceof):
|
||||
if (Z_TYPE_P(expr) == IS_OBJECT) {
|
||||
@ -6971,6 +7085,9 @@ ZEND_VM_C_LABEL(try_instanceof):
|
||||
expr = Z_REFVAL_P(expr);
|
||||
ZEND_VM_C_GOTO(try_instanceof);
|
||||
} else {
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
|
||||
GET_OP1_UNDEF_CV(expr, BP_VAR_R);
|
||||
}
|
||||
result = 0;
|
||||
}
|
||||
FREE_OP1();
|
||||
@ -7790,13 +7907,16 @@ ZEND_VM_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
|
||||
zend_free_op free_op1;
|
||||
|
||||
SAVE_OPLINE();
|
||||
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
|
||||
ZEND_VM_C_LABEL(try_strlen):
|
||||
if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
|
||||
ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
|
||||
} else {
|
||||
zend_bool strict;
|
||||
|
||||
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
|
||||
value = GET_OP1_UNDEF_CV(value, BP_VAR_R);
|
||||
}
|
||||
if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(value) == IS_REFERENCE) {
|
||||
value = Z_REFVAL_P(value);
|
||||
ZEND_VM_C_GOTO(try_strlen);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -259,6 +259,26 @@ $op2_get_obj_zval_ptr = array(
|
||||
"TMPVAR" => "_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2)",
|
||||
);
|
||||
|
||||
$op1_get_obj_zval_ptr_undef = array(
|
||||
"ANY" => "get_obj_zval_ptr_undef(opline->op1_type, opline->op1, execute_data, &free_op1, \\1)",
|
||||
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1)",
|
||||
"VAR" => "_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1)",
|
||||
"CONST" => "EX_CONSTANT(opline->op1)",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(execute_data)",
|
||||
"CV" => "_get_zval_ptr_cv_undef(execute_data, opline->op1.var)",
|
||||
"TMPVAR" => "_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1)",
|
||||
);
|
||||
|
||||
$op2_get_obj_zval_ptr_undef = array(
|
||||
"ANY" => "get_obj_zval_ptr_undef(opline->op2_type, opline->op2, execute_data, &free_op2, \\1)",
|
||||
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2)",
|
||||
"VAR" => "_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2)",
|
||||
"CONST" => "EX_CONSTANT(opline->op2)",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(execute_data)",
|
||||
"CV" => "_get_zval_ptr_cv_undef(execute_data, opline->op2.var)",
|
||||
"TMPVAR" => "_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2)",
|
||||
);
|
||||
|
||||
$op1_get_obj_zval_ptr_deref = array(
|
||||
"ANY" => "get_obj_zval_ptr(opline->op1_type, opline->op1, execute_data, &free_op1, \\1)",
|
||||
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1)",
|
||||
@ -449,6 +469,7 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) {
|
||||
$op1_get_zval_ptr_ptr, $op2_get_zval_ptr_ptr,
|
||||
$op1_get_zval_ptr_ptr_undef, $op2_get_zval_ptr_ptr_undef,
|
||||
$op1_get_obj_zval_ptr, $op2_get_obj_zval_ptr,
|
||||
$op1_get_obj_zval_ptr_undef, $op2_get_obj_zval_ptr_undef,
|
||||
$op1_get_obj_zval_ptr_deref, $op2_get_obj_zval_ptr_deref,
|
||||
$op1_get_obj_zval_ptr_ptr, $op2_get_obj_zval_ptr_ptr,
|
||||
$op1_get_obj_zval_ptr_ptr_undef, $op2_get_obj_zval_ptr_ptr_undef,
|
||||
@ -475,6 +496,8 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) {
|
||||
"/GET_OP2_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/",
|
||||
"/GET_OP1_OBJ_ZVAL_PTR\(([^)]*)\)/",
|
||||
"/GET_OP2_OBJ_ZVAL_PTR\(([^)]*)\)/",
|
||||
"/GET_OP1_OBJ_ZVAL_PTR_UNDEF\(([^)]*)\)/",
|
||||
"/GET_OP2_OBJ_ZVAL_PTR_UNDEF\(([^)]*)\)/",
|
||||
"/GET_OP1_OBJ_ZVAL_PTR_DEREF\(([^)]*)\)/",
|
||||
"/GET_OP2_OBJ_ZVAL_PTR_DEREF\(([^)]*)\)/",
|
||||
"/GET_OP1_OBJ_ZVAL_PTR_PTR\(([^)]*)\)/",
|
||||
@ -517,6 +540,8 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) {
|
||||
$op2_get_zval_ptr_ptr_undef[$op2],
|
||||
$op1_get_obj_zval_ptr[$op1],
|
||||
$op2_get_obj_zval_ptr[$op2],
|
||||
$op1_get_obj_zval_ptr_undef[$op1],
|
||||
$op2_get_obj_zval_ptr_undef[$op2],
|
||||
$op1_get_obj_zval_ptr_deref[$op1],
|
||||
$op2_get_obj_zval_ptr_deref[$op2],
|
||||
$op1_get_obj_zval_ptr_ptr[$op1],
|
||||
|
Loading…
Reference in New Issue
Block a user