]> granicus.if.org Git - php/commitdiff
Disable inlining for $this->foo(), because $this may be used not in object context
authorDmitry Stogov <dmitry@zend.com>
Thu, 30 Jun 2016 18:03:08 +0000 (21:03 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 30 Jun 2016 18:03:08 +0000 (21:03 +0300)
ext/opcache/Optimizer/optimize_func_calls.c
ext/opcache/tests/wrong_inlining_002.phpt [new file with mode: 0644]

index bf84a7a383ef3851d0510a0fdb9f8189663e1da7..0d5e4d7f3a83ec906db1eefea726cd3f0e5fabec 100644 (file)
@@ -98,6 +98,12 @@ static void zend_try_inline_call(zend_op_array *op_array, zend_op *fcall, zend_o
 
                if (ret_opline->op1_type == IS_CONST) {
 
+                       if (fcall->opcode == ZEND_INIT_METHOD_CALL && fcall->op1_type == IS_UNUSED) {
+                               /* TODO: we can't inlne methods, because $this may be used
+                                *       not in class context ???
+                                */
+                               return;
+                       }
                        if (fcall->extended_value < func->op_array.num_args) {
                                /* don't inline funcions with named constants in default arguments */
                                uint32_t n = fcall->extended_value;
diff --git a/ext/opcache/tests/wrong_inlining_002.phpt b/ext/opcache/tests/wrong_inlining_002.phpt
new file mode 100644 (file)
index 0000000..e132f98
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+Pass result of inlined function by reference
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+class Foo {
+    private function getConst() {
+        return 42;
+    }
+    public function test() {
+        var_dump($this->getConst());
+    }
+}
+
+Foo::test();
+?>
+--EXPECTF--
+Deprecated: Non-static method Foo::test() should not be called statically in %swrong_inlining_002.php on line 11
+
+Fatal error: Uncaught Error: Using $this when not in object context in %swrong_inlining_002.php:7
+Stack trace:
+#0 %swrong_inlining_002.php(11): Foo::test()
+#1 {main}
+  thrown in %swrong_inlining_002.php on line 7