summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-08-26 16:10:29 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-08-26 16:12:03 +0200
commite2b49d6c45f0c5ed69268d32da2f4972265db663 (patch)
tree8dcf0200acb2c48d536f1666f2d28819ca4d22a7
parent8f897f1040f00210f4a5cdd82a88a1fe3e558955 (diff)
downloadphp-git-e2b49d6c45f0c5ed69268d32da2f4972265db663.tar.gz
Don't use needs_live_range hook for "special" live ranges
In particular we were disgarding SILENCE live ranges in opcache, because we decided that a MAY_BE_LONG type does not need a live range.
-rw-r--r--Zend/tests/uncaught_exception_error_supression.phpt18
-rw-r--r--Zend/zend_opcode.c11
2 files changed, 24 insertions, 5 deletions
diff --git a/Zend/tests/uncaught_exception_error_supression.phpt b/Zend/tests/uncaught_exception_error_supression.phpt
new file mode 100644
index 0000000000..1130a9d99b
--- /dev/null
+++ b/Zend/tests/uncaught_exception_error_supression.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Error suppression should have no impact on uncaught exceptions
+--FILE--
+<?php
+
+function abc() {
+ throw new Error('Example Exception');
+}
+
+@abc();
+
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Example Exception in %s:%d
+Stack trace:
+#0 %s(%d): abc()
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index ff6bcfd9c4..fe81585daf 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -655,6 +655,12 @@ static void emit_live_range(
default:
start++;
kind = ZEND_LIVE_TMPVAR;
+
+ /* Check hook to determine whether a live range is necessary,
+ * e.g. based on type info. */
+ if (needs_live_range && !needs_live_range(op_array, orig_def_opline)) {
+ return;
+ }
break;
}
case ZEND_COPY_TMP:
@@ -694,11 +700,6 @@ static void emit_live_range(
}
}
- /* Check hook to determine whether a live range is necessary, e.g. based on type info. */
- if (needs_live_range && !needs_live_range(op_array, orig_def_opline)) {
- return;
- }
-
emit_live_range_raw(op_array, var_num, kind, start, end);
}