On 15.03.2016, at 21:18, Anatol Belski <anatol....@belski.net> wrote: > > Hi, > >> -----Original Message----- >> From: David Zuelke [mailto:d...@heroku.com] >> Sent: Sunday, March 13, 2016 6:09 AM >> To: Anatol Belski <anatol....@belski.net> >> Cc: Christoph Becker <cmbecke...@gmx.de>; Pierre Joye >> <pierre....@gmail.com>; PHP internals <internals@lists.php.net> >> Subject: Re: [PHP-DEV] PCRE JIT stack size limit >> >> Just wanted to resurrect this thread... I just got a JIT stack size limit > error (which >> Composer reports as "unknown error" because it has no logic for the new >> constant) while running "composer require somepackage" with PHP 7 and JIT >> enabled. > Could you please give a worky reproduce scenario? Itself the description > sounds like that some part in composer is not yet PHP7 ported or it's a > special case causing JIT impacts, but it were good to have a reproducer to > evaluate and make a conclusion. Till today, there was no bug reports about > PCRE JIT issues in common PHP frameworks. Except this special case > https://bugs.exim.org/show_bug.cgi?id=1189 which is fixed in PCRE 8.39 that > should be bundled as soon as possible (an eye is being kept on that).
Sure. So composer creates patterns to parse a file dynamically; I have not figured out why it only happens for some composer.json files (or maybe it happens for all of them and I just have not noticed), but this example here I extracted from a reproducibly failing "composer require" run; it runs into the JIT stack size limit on PHP 7 while it works fine on 5.x: https://gist.github.com/dzuelke/cc64a630c14416eda3e9 >> IMO, a pattern modifier would be good so that applications can disable JIT > on >> demand. >> >> I'd also like to re-start a discussion on changing the default for > pcre.jit to 0. > A pattern modifier could be thinkable and would be doable (sure for master, > or even for later 7.0 versions), but would cause some increased complexity > in logic for pattern cache. From the above - let's have a reproducer and > evaluate the status. Then we'll have a point for further consideration. > > Thanks > > Anatol > >> >>> On 04.08.2015, at 23:20, Anatol Belski <anatol....@belski.net> wrote: >>> >>> Hi Christoph, >>> >>>> -----Original Message----- >>>> From: Christoph Becker [mailto:cmbecke...@gmx.de] >>>> Sent: Tuesday, August 4, 2015 7:40 PM >>>> To: Anatol Belski <anatol....@belski.net>; 'Christoph Becker' >>>> <cmbecke...@gmx.de>; 'Pierre Joye' <pierre....@gmail.com> >>>> Cc: 'PHP internals' <internals@lists.php.net> >>>> Subject: Re: [PHP-DEV] PCRE JIT stack size limit >>>> >>>> On 04.08.2015 at 16:33, Anatol Belski wrote: >>>> >>>>>> -----Original Message----- >>>>>> From: Christoph Becker [mailto:cmbecke...@gmx.de] >>>>>> Sent: Tuesday, August 4, 2015 1:16 PM >>>>>> To: Anatol Belski <anatol....@belski.net>; 'Christoph Becker' >>>>>> <cmbecke...@gmx.de>; 'Pierre Joye' <pierre....@gmail.com> >>>>>> Cc: 'PHP internals' <internals@lists.php.net> >>>>>> Subject: Re: [PHP-DEV] PCRE JIT stack size limit >>>>>> >>>>>> I didn't mean to store all patterns in both variants, but rather as >>>>>> requested. Say, the PHP script starts with pcre.jit=0, so all >>>>>> patterns will be stored studied without JIT. Then the script >>>>>> changes to pcre.jit=1. Following cache lookups check whether an >>>>>> already cached pattern was studied with JIT. If not, a new cache >>>>>> entry is made with the pattern studied with JIT (that new entry may >>>>>> replace the old one or not; not sure what's best). Changing back >>>>>> to >>>>>> pcre.jit=0 will again keep the old patterns, but ensures that only >>>>>> those which >>>> have been studied without JIT are retrieved from the cache. >>>>> It needs to replace the old entry, the regex string is used as key. >>>>> At least per >>>> current mechanism. When user changes the JIT config, I'd see it like >>>> as an obvious hint. Like pcre.jit=0 - no more JIT study from now on. >>>> >>>> Probably you're right that replacement is best. However, the key is >>>> the full regex string (including modifiers), AFAIK, and Adam already >>>> came up with the idea that choosing between JIT and non-JIT might be > done >> via a new modifier[1]. >>>> Something to consider, if it turns out that there is some real >>>> optimization potential for userland to choose between both variants on > a >> case-by-case basis. >>> Yeah, that were a nice approach. Should be checked probably, whether > there's >> a corresponding perl pattern modifier (probably there is none, but > shouldn't be >> that bad). And also to evaluate what behavior were produced when say jit > is >> disabled but a modifier is passed. >>> >>>>> Probably it would be needed to save the study flags with the cache >>>>> entry, looks >>>> like the pcre_cache_entry struct should have a gap for that. >>>> >>>> If I'm not mistaken, an additional flag wouldn't be necessary, >>>> because the pcre_extra struct has the executable_jit field, which could > be >> queried. >>> Ok, that would be even better, given it's reliable. >>> >>> Regards >>> >>> Anatol >>> >>> >>> -- >>> PHP Internals - PHP Runtime Development Mailing List To unsubscribe, >>> visit: http://www.php.net/unsub.php > >