Skip to content

Commit 8ab9396

Browse files
committed
Get rid of few more duplicate handlers
1 parent e0a0bea commit 8ab9396

File tree

2 files changed

+290
-509
lines changed

2 files changed

+290
-509
lines changed

Zend/zend_vm_def.h

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2113,7 +2113,7 @@ ZEND_VM_HANDLER(56, ZEND_ADD_VAR, TMP|UNUSED, TMPVAR|CV)
21132113
ZEND_VM_NEXT_OPCODE();
21142114
}
21152115

2116-
ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMP|VAR|UNUSED|CV)
2116+
ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMPVAR|UNUSED|CV)
21172117
{
21182118
USE_OPLINE
21192119

@@ -2127,8 +2127,9 @@ ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMP|VAR|UNUSED|CV)
21272127
ZEND_VM_NEXT_OPCODE();
21282128
} else {
21292129
zend_free_op free_op2;
2130-
zval *class_name = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
2130+
zval *class_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
21312131

2132+
ZEND_VM_C_LABEL(try_class_name):
21322133
if (OP2_TYPE == IS_CONST) {
21332134
if (CACHED_PTR(Z_CACHE_SLOT_P(class_name))) {
21342135
Z_CE_P(EX_VAR(opline->result.var)) = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
@@ -2140,6 +2141,9 @@ ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMP|VAR|UNUSED|CV)
21402141
Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
21412142
} else if (Z_TYPE_P(class_name) == IS_STRING) {
21422143
Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->extended_value TSRMLS_CC);
2144+
} else if ((OP2_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
2145+
class_name = Z_REFVAL_P(class_name);
2146+
ZEND_VM_C_GOTO(try_class_name);
21432147
} else {
21442148
if (UNEXPECTED(EG(exception) != NULL)) {
21452149
HANDLE_EXCEPTION();
@@ -2386,7 +2390,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE
23862390
ZEND_VM_NEXT_OPCODE();
23872391
}
23882392

2389-
ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
2393+
ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMPVAR|CV)
23902394
{
23912395
USE_OPLINE
23922396
zend_function *fbc;
@@ -2416,9 +2420,10 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
24162420
zend_object *object;
24172421

24182422
SAVE_OPLINE();
2419-
function_name = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
2423+
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
24202424

2421-
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
2425+
ZEND_VM_C_LABEL(try_function_name):
2426+
if (OP2_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
24222427
if (Z_STRVAL_P(function_name)[0] == '\\') {
24232428
lcname = zend_string_alloc(Z_STRLEN_P(function_name) - 1, 0);
24242429
zend_str_tolower_copy(lcname->val, Z_STRVAL_P(function_name) + 1, Z_STRLEN_P(function_name) - 1);
@@ -2514,6 +2519,9 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
25142519
}
25152520
}
25162521
FREE_OP2();
2522+
} else if ((OP2_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(function_name) == IS_REFERENCE) {
2523+
function_name = Z_REFVAL_P(function_name);
2524+
ZEND_VM_C_GOTO(try_function_name);
25172525
} else {
25182526
if (UNEXPECTED(EG(exception) != NULL)) {
25192527
HANDLE_EXCEPTION();
@@ -4482,7 +4490,9 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
44824490
}
44834491
} else {
44844492
array_ptr = array_ref = GET_OP1_ZVAL_PTR(BP_VAR_R);
4485-
ZVAL_DEREF(array_ptr);
4493+
if (OP1_TYPE & (IS_VAR|IS_CV)) {
4494+
ZVAL_DEREF(array_ptr);
4495+
}
44864496
if (OP1_TYPE == IS_TMP_VAR) {
44874497
ZVAL_COPY_VALUE(&tmp, array_ptr);
44884498
if (Z_OPT_IMMUTABLE_P(&tmp)) {
@@ -5358,16 +5368,17 @@ ZEND_VM_HANDLER(105, ZEND_TICKS, ANY, ANY)
53585368
ZEND_VM_NEXT_OPCODE();
53595369
}
53605370

5361-
ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMP|VAR|CV, CONST|VAR)
5371+
ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMPVAR|CV, CONST|VAR)
53625372
{
53635373
USE_OPLINE
53645374
zend_free_op free_op1;
53655375
zval *expr;
53665376
zend_bool result;
53675377

53685378
SAVE_OPLINE();
5369-
expr = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
5379+
expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
53705380

5381+
ZEND_VM_C_LABEL(try_instanceof):
53715382
if (Z_TYPE_P(expr) == IS_OBJECT) {
53725383
zend_class_entry *ce;
53735384

@@ -5388,6 +5399,9 @@ ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMP|VAR|CV, CONST|VAR)
53885399
ce = Z_CE_P(EX_VAR(opline->op2.var));
53895400
}
53905401
result = instanceof_function(Z_OBJCE_P(expr), ce TSRMLS_CC);
5402+
} else if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(expr) == IS_REFERENCE) {
5403+
expr = Z_REFVAL_P(expr);
5404+
ZEND_VM_C_GOTO(try_instanceof);
53915405
} else {
53925406
result = 0;
53935407
}
@@ -5974,18 +5988,22 @@ ZEND_VM_C_LABEL(check_indirect):
59745988
ZEND_VM_NEXT_OPCODE();
59755989
}
59765990

5977-
ZEND_VM_HANDLER(121, ZEND_STRLEN, CONST|TMP|VAR|CV, ANY)
5991+
ZEND_VM_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
59785992
{
59795993
USE_OPLINE
59805994
zval *value;
59815995
zend_free_op free_op1;
59825996

59835997
SAVE_OPLINE();
5984-
value = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
5998+
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
5999+
ZEND_VM_C_LABEL(try_strlen):
59856000
if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
59866001
ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
59876002
} else {
5988-
if (Z_TYPE_P(value) < IS_TRUE) {
6003+
if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(value) == IS_REFERENCE) {
6004+
value = Z_REFVAL_P(value);
6005+
ZEND_VM_C_GOTO(try_strlen);
6006+
} else if (Z_TYPE_P(value) < IS_TRUE) {
59896007
ZVAL_LONG(EX_VAR(opline->result.var), 0);
59906008
} else if (Z_TYPE_P(value) == IS_TRUE) {
59916009
ZVAL_LONG(EX_VAR(opline->result.var), 1);

0 commit comments

Comments
 (0)