summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2019-09-30 11:40:25 +0300
committerDmitry Stogov <dmitry@zend.com>2019-09-30 11:40:25 +0300
commit9372b6876d72d22ea293bca5f35e5d5820423ce9 (patch)
tree763584a5b40a82e3c4ba94b2f0a74913513a7522
parent1cde9e852879afe123945fe42e831a6715abb866 (diff)
downloadphp-git-9372b6876d72d22ea293bca5f35e5d5820423ce9.tar.gz
Restore "avoid exception check" optimization and add EG(exception) check only on slow path.
-rw-r--r--Zend/zend_vm_def.h12
-rw-r--r--Zend/zend_vm_execute.h108
2 files changed, 120 insertions, 0 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 7d9eab21f3..3a031f6aa9 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -6881,12 +6881,24 @@ ZEND_VM_C_LABEL(num_index_prop):
ZEND_VM_C_GOTO(isset_again);
} else {
value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ if (UNEXPECTED(EG(exception))) {
+ result = 0;
+ ZEND_VM_C_GOTO(isset_dim_obj_exit);
+ }
}
if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+
+ if (OP1_TYPE & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+ FREE_OP2();
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index bf4eb31bfb..249c054723 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -6199,12 +6199,24 @@ num_index_prop:
goto isset_again;
} else {
value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ if (UNEXPECTED(EG(exception))) {
+ result = 0;
+ goto isset_dim_obj_exit;
+ }
}
if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+
+ if (IS_CONST & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -8367,12 +8379,24 @@ num_index_prop:
goto isset_again;
} else {
value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ if (UNEXPECTED(EG(exception))) {
+ result = 0;
+ goto isset_dim_obj_exit;
+ }
}
if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+
+ if (IS_CONST & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -10790,12 +10814,24 @@ num_index_prop:
goto isset_again;
} else {
value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ if (UNEXPECTED(EG(exception))) {
+ result = 0;
+ goto isset_dim_obj_exit;
+ }
}
if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+
+ if (IS_CONST & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -14792,12 +14828,24 @@ num_index_prop:
goto isset_again;
} else {
value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ if (UNEXPECTED(EG(exception))) {
+ result = 0;
+ goto isset_dim_obj_exit;
+ }
}
if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+
+ if ((IS_TMP_VAR|IS_VAR) & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -16217,12 +16265,24 @@ num_index_prop:
goto isset_again;
} else {
value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ if (UNEXPECTED(EG(exception))) {
+ result = 0;
+ goto isset_dim_obj_exit;
+ }
}
if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+
+ if ((IS_TMP_VAR|IS_VAR) & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -17516,12 +17576,24 @@ num_index_prop:
goto isset_again;
} else {
value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ if (UNEXPECTED(EG(exception))) {
+ result = 0;
+ goto isset_dim_obj_exit;
+ }
}
if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+
+ if ((IS_TMP_VAR|IS_VAR) & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -41663,12 +41735,24 @@ num_index_prop:
goto isset_again;
} else {
value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ if (UNEXPECTED(EG(exception))) {
+ result = 0;
+ goto isset_dim_obj_exit;
+ }
}
if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+
+ if (IS_CV & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -45182,12 +45266,24 @@ num_index_prop:
goto isset_again;
} else {
value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ if (UNEXPECTED(EG(exception))) {
+ result = 0;
+ goto isset_dim_obj_exit;
+ }
}
if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+
+ if (IS_CV & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -50401,12 +50497,24 @@ num_index_prop:
goto isset_again;
} else {
value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
+ if (UNEXPECTED(EG(exception))) {
+ result = 0;
+ goto isset_dim_obj_exit;
+ }
}
if (!(opline->extended_value & ZEND_ISEMPTY)) {
/* > IS_NULL means not IS_UNDEF and not IS_NULL */
result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+
+ if (IS_CV & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}