From c3667a5eed098cc106351ec032306a149509dfa3 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 30 Jun 2016 21:03:08 +0300 Subject: [PATCH] Disable inlining for $this->foo(), because $this may be used not in object context --- ext/opcache/Optimizer/optimize_func_calls.c | 6 +++++ ext/opcache/tests/wrong_inlining_002.phpt | 29 +++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 ext/opcache/tests/wrong_inlining_002.phpt diff --git a/ext/opcache/Optimizer/optimize_func_calls.c b/ext/opcache/Optimizer/optimize_func_calls.c index bf84a7a383..0d5e4d7f3a 100644 --- a/ext/opcache/Optimizer/optimize_func_calls.c +++ b/ext/opcache/Optimizer/optimize_func_calls.c @@ -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 index 0000000000..e132f987e3 --- /dev/null +++ b/ext/opcache/tests/wrong_inlining_002.phpt @@ -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-- + +--FILE-- +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 -- 2.40.0