summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-04-15 12:35:09 +0200
committerNikita Popov <nikita.ppv@gmail.com>2017-04-15 12:35:09 +0200
commit0beccc51f1bf44fb3efeb1131f8c86eb7dc5014f (patch)
tree6bce82bba642554fe04e17e17a98652beefb1232
parent35a28fac51e4b210f8f3f51b754786908a977462 (diff)
downloadphp-git-0beccc51f1bf44fb3efeb1131f8c86eb7dc5014f.tar.gz
Fix compact_literals of INIT_METHOD_CALL with CONST op1
-rw-r--r--ext/opcache/Optimizer/compact_literals.c3
-rw-r--r--ext/opcache/tests/method_call_on_literal.phpt14
2 files changed, 17 insertions, 0 deletions
diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c
index 0637d77f21..f417bef5fb 100644
--- a/ext/opcache/Optimizer/compact_literals.c
+++ b/ext/opcache/Optimizer/compact_literals.c
@@ -146,6 +146,9 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
LITERAL_INFO(opline->op2.constant, LITERAL_FUNC, 1, 1, 3);
break;
case ZEND_INIT_METHOD_CALL:
+ if (ZEND_OP1_TYPE(opline) == IS_CONST) {
+ LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 1, 0, 1);
+ }
if (ZEND_OP2_TYPE(opline) == IS_CONST) {
optimizer_literal_obj_info(
info,
diff --git a/ext/opcache/tests/method_call_on_literal.phpt b/ext/opcache/tests/method_call_on_literal.phpt
new file mode 100644
index 0000000000..bf89caa418
--- /dev/null
+++ b/ext/opcache/tests/method_call_on_literal.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Literal compaction should take method calls on literals into account
+--FILE--
+<?php
+
+try {
+ (42)->foo();
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Call to a member function foo() on integer