Re: Wired constant expression syntax and bug

From: Date: Mon, 30 Jun 2014 19:32:14 +0000
Subject: Re: Wired constant expression syntax and bug
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-75151@lists.php.net to get a copy of this message
OK. I'll commit the patch. According to the wired syntax, note that your example code will make PHP at first construct an array and then destroy it. why not to write $var = DO ? "value1" : "value2"; it must be more clear and efficient. In case you like to keep this new syntax in PHP-5.6 at least please cover it with tests. I'm not a big fun of it, but won't object if it can't make real harm. Thanks. Dmitry. On Mon, Jun 30, 2014 at 11:21 PM, Bob Weinand <bobwei9@hotmail.com> wrote: > That syntax wasn't part of the RFC because it wasn't yet possible > (existence of IS_CONSTANT_ARRAY at that time). > Also the use case for that one is mainly: > > class Foo { > public $var = ["value1", "value2"][DO]; > } > > And then just write > const DO = 0; (or 1) > > I don't exactly know at which point that conflicts with opcache. Or if > that really fixes the bug. > The copying itself in your patch looks fine, but please take the > responsibility for it and apply it yourself. > > Thanks, > Bob > > Am 30.6.2014 um 21:06 schrieb Dmitry Stogov <dmitry@zend.com>: > > Hi Bob, > > > > I'm wondered why you introduced this wired syntax in PHP-5.6. > > > > class FooBar { > > const bar = ["bar" => 3]["bar"]; > > } > > > > It wasn't a part of RFC, it wasn't covered by tests, and it actually > > doesn't make a lot of sense. May be it's better to remove it? > > > > Also I found a constant expression related bug, that leads to > unpredictable > > crashes from time to time. Previously we had IS_CONSTANT_ARRAY that was > > handled in a special way. When you replaced it with IS_ARRAY, you missed > > this handling, and I missed it as well when reviewed your patch. Now > > IS_ARRAY constants might be incompletely copied from OPCache shared > memory > > and modified (incremented/decremented reference counter) directly in SHM. > > Such modifications occur in simultaneously running processes and this > > finally leads to crash on some race condition. > > > > It's possible to emulate the problem running the following script with > > opcache.protect_memory=1 > > > > <?php > > function foo($query = NULL, array $exclude = array('q')) {} > > foo(); > > ?> > > > > I propose a simple fix: > https://gist.github.com/dstogov/b73884e252b376957ebc > > Please review and apply if agree. > > > > Thanks. Dmitry. >

« previous php.internals (#75151) next »