Skip to content

Observers reinitialized for closures defined in methods when OPcache is enabled #18546

Closed as duplicate of#10782
@TimWolla

Description

@TimWolla

Description

The following test:

--TEST--
XXX
--EXTENSIONS--
zend_test
--INI--
zend_test.observer.enabled=1
zend_test.observer.show_output=1
zend_test.observer.observe_all=1
--FILE--
<?php

class Foo {
  function foo() {
    (function () {
      echo "x", PHP_EOL;
    })();
  }
}

$f = new Foo();
$f->foo();
$f->foo();

?>
--EXPECTF--
<!-- init '%s' -->
<file '%s'>
  <!-- init Foo::foo() -->
  <Foo::foo>
    <!-- init Foo::{closure:Foo::foo():5}() -->
    <Foo::{closure:Foo::foo():5}>
x
    </Foo::{closure:Foo::foo():5}>
  </Foo::foo>
  <Foo::foo>
    <Foo::{closure:Foo::foo():5}>
x
    </Foo::{closure:Foo::foo():5}>
  </Foo::foo>
</file '%s'>

passes for:

sapi/cli/php run-tests.php --asan -d zend_extension=$(pwd)/modules/opcache.so -d opcache.enable_cli=0 -d opcache.protect_memory=1 --show-diff ext/zend_test/tests/observer_closure_04.phpt

but fails when opcache.enable_cli=1:

sapi/cli/php run-tests.php --asan -d zend_extension=$(pwd)/modules/opcache.so -d opcache.enable_cli=1 -d opcache.protect_memory=1 --show-diff ext/zend_test/tests/observer_closure_04.phpt                           

with the following output:

TEST 1/1 [ext/zend_test/tests/observer_closure_04.phpt]
========DIFF========
--
         </Foo::{closure:Foo::foo():5}>
       </Foo::foo>
       <Foo::foo>
011+     <!-- init Foo::{closure:Foo::foo():5}() -->
         <Foo::{closure:Foo::foo():5}>
     x
         </Foo::{closure:Foo::foo():5}>
--
========DONE========

PHP Version

git master

Operating System

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions