com php-src: ZEND_SEPARATE reuses temporaries: Zend/t ests/temporary_cleaning_006.phpt Zend/zend_opco de.c
| From: | Anatol Belski | Date: | Thu, 09 Jul 2015 15:25:26 +0000 |
| Subject: | com php-src: ZEND_SEPARATE reuses temporaries: Zend/t ests/temporary_cleaning_006.phpt Zend/zend_opco de.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-87867@lists.php.net to get a copy of this message | ||
Commit: dfe6fdaa727bd9ac4a9b68c5fe521e0f1991ca46
Author: Nikita Popov <nikic@php.net> Wed, 8 Jul 2015 00:12:47 +0200
Committer: Anatol Belski <ab@php.net> Thu, 9 Jul 2015 17:25:26 +0200
Parents: 8d09c84bd3a3d51a8cb089bc01aa115416849d02
Branches: PHP-7.0.0
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=dfe6fdaa727bd9ac4a9b68c5fe521e0f1991ca46
Log:
ZEND_SEPARATE reuses temporaries
Changed paths:
A Zend/tests/temporary_cleaning_006.phpt
M Zend/zend_opcode.c
Diff:
diff --git a/Zend/tests/temporary_cleaning_006.phpt b/Zend/tests/temporary_cleaning_006.phpt
new file mode 100644
index 0000000..758260d
--- /dev/null
+++ b/Zend/tests/temporary_cleaning_006..phpt
@@ -0,0 +1,18 @@
+--TEST--
+Exception after separation during indirect write to fcall result
+--FILE--
+<?php
+
+function throwing() { throw new Exception; }
+
+function getArray() { return [0]; }
+
+try {
+ getArray()[throwing()] = 1;
+} catch (Exception $e) {
+ echo "Exception\n";
+}
+
+?>
+--EXPECT--
+Exception
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index 8f3ecdd..f8d0404 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -950,6 +950,7 @@ static zend_always_inline uint32_t *generate_var_liveliness_info_ex(zend_op_arra
/* the following opcodes reuse TMP created before */
&& opline->opcode != ZEND_ROPE_ADD
&& opline->opcode != ZEND_ADD_ARRAY_ELEMENT
+ && opline->opcode != ZEND_SEPARATE
/* passes fast_call */
&& opline->opcode != ZEND_FAST_CALL
/* the following opcodes pass class_entry */
@@ -980,6 +981,7 @@ static zend_always_inline uint32_t *generate_var_liveliness_info_ex(zend_op_arra
if (Tstart[var] != (uint32_t)-1
/* the following opcodes don't free TMP */
&& opline->opcode != ZEND_ROPE_ADD
+ && opline->opcode != ZEND_SEPARATE
&& opline->opcode != ZEND_FETCH_LIST
&& opline->opcode != ZEND_CASE
&& opline->opcode != ZEND_FE_FETCH_R