summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2016-06-05 22:16:15 +0200
committerNikita Popov <nikic@php.net>2016-06-05 22:16:15 +0200
commit3be92120ba676afdcbd40bafa9d474b7f10e286c (patch)
tree8b44e0d1f38e8ebd412a413a37b9a8cf23c3ff06
parent70f05468855ec52cab4223d2e3cfd64e84b9abbd (diff)
downloadphp-git-3be92120ba676afdcbd40bafa9d474b7f10e286c.tar.gz
Fix handling of parse_str() with unpack in optimizer
-rw-r--r--Zend/tests/parse_str_with_unpack.phpt15
-rw-r--r--ext/opcache/Optimizer/zend_optimizer.c4
2 files changed, 17 insertions, 2 deletions
diff --git a/Zend/tests/parse_str_with_unpack.phpt b/Zend/tests/parse_str_with_unpack.phpt
new file mode 100644
index 0000000000..50b296d710
--- /dev/null
+++ b/Zend/tests/parse_str_with_unpack.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Calling parse_str through argument unpacking
+--FILE--
+<?php
+
+function test() {
+ $i = 0;
+ parse_str(...["i=41"]);
+ var_dump($i + 1);
+}
+test();
+
+?>
+--EXPECT--
+int(42)
diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c
index ea0deb53c8..35dff98362 100644
--- a/ext/opcache/Optimizer/zend_optimizer.c
+++ b/ext/opcache/Optimizer/zend_optimizer.c
@@ -596,9 +596,9 @@ uint32_t zend_optimizer_classify_function(zend_string *name, uint32_t num_args)
return ZEND_FUNC_INDIRECT_VAR_ACCESS;
} else if (zend_string_equals_literal(name, "compact")) {
return ZEND_FUNC_INDIRECT_VAR_ACCESS;
- } else if (zend_string_equals_literal(name, "parse_str") && num_args == 1) {
+ } else if (zend_string_equals_literal(name, "parse_str") && num_args <= 1) {
return ZEND_FUNC_INDIRECT_VAR_ACCESS;
- } else if (zend_string_equals_literal(name, "mb_parse_str") && num_args == 1) {
+ } else if (zend_string_equals_literal(name, "mb_parse_str") && num_args <= 1) {
return ZEND_FUNC_INDIRECT_VAR_ACCESS;
} else if (zend_string_equals_literal(name, "get_defined_vars")) {
return ZEND_FUNC_INDIRECT_VAR_ACCESS;