Hi Matt,

For now I would like to disable "-CONST" constant expression which
started to work after your patch.

Later we are able to implement the complete constant expressions support.

Thanks. Dmitry.

Matt Wilmas wrote:
> Hi Dmitry,
> 
> ----- Original Message -----
> From: "Dmitry Stogov"
> Sent: Wednesday, July 30, 2008
> 
>> Hi Matt,
>>
>> does the following code work with your patch?
>>
>> <?php
>> function foo() {
>> static $a = A + B;
>> var_dump($a);
>> }
>> const A = 1;
>> const B = 2;
>> foo();
>> ?>
>>
>> It would be hard to explain why some of constant expression work, but
>> others don't.
> 
> No, it doesn't.  That would of course require additional changes (I don't
> know how to do that, didn't even look into it), and was also mentioned with
> Nuno's patch.  I just included the part I did for something "closer" to what
> was talked about last time.  The only explanation I know of would be that it
> only works with *literals*, not named constants.  But yes, it's hard to
> understand. :-)
> 
> But anyway, it doesn't really matter to me about that, the main point (like
> Nuno's) was the the folding of constant expressions in the other areas
> (especially negative numbers).  And like I said, it's more useful after
> constant substitution with function flags being ORed and things like that...
> But that could always be applied at a later date/version since it doesn't
> break compatibility, right?
> 
>> Anyway, it's too late for this patches.
>> 5.3 is going to be frozen.
> 
> Well, what about the behavior change I mentioned?  Something should be done
> about that, I'm sure.  That's what the second small patch
> ("signed_expr_tweaks") was for.
> 
> Actually, I wrote the above right after getting your message, but didn't
> send it then, because I had only been thinking about the parser, and thought
> of a more proper fix in zend_compile.c for the behavior difference (and
> something else).  I will send the fix shortly in a reply to the previous
> thread about constant substitution... :-)
> 
>> Thanks. Dmitry.
> 
> Thanks,
> Matt
> 
> 
>> Matt Wilmas wrote:
>>> Hi Dmitry, all,
>>>
>>> I was going to send this patch as a companion one to go with the
>>> compile-time constant substitution change (Nuno sent a message about
> this
>>> [1] last Sep. with a patch [2]), BUT I also realized that some
> different,
>>> inconsistent behavior is possible because of that change.
>>>
>>> First, the folding optimization part, which I don't know if you'll want
> to
>>> use (though it seems pretty simple/safe to apply at any time), does the
> same
>>> thing as Nuno's patch, but with a different implementation.  This is
> even
>>> more of an optimization when combined with constant substitution, for
> ORing
>>> function flags, etc.
>>>
>>> At the time, one of the objections (?) was that it didn't allow the same
>>> constant expressions to initialize static variables and class
>>> members/constants.  (Though I don't see much relation: hidden, internal
>>> optimization vs. actual syntax change/enhancement.)  So I also added
> support
>>> for arithmetic, bitwise, and concatenation operators (not logical or
>>> comparison) in that context.  Anyway, should be fairly simple to
>>> understand... :-)
>>>
>>> Now, the different, inconsistent behavior that's possible after the
> constant
>>> substitution change.  This code, for example:
>>>
>>> function foo() {
>>>     static $a = -PHP_INT_MAX;
>>> }
>>>
>>> Would have previously given "Unsupported operand types".  Now it can
> work
>>> because the value of PHP_INT_MAX may be substituted first.  Fine, good;
>>> except that it won't be substituted if it's in a namespace or
>>> ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION is set, and then the error occurs.
>>>
>>> I thought the best solution was to disallow constants in a
> "static_scalar"
>>> expression (e.g. only literals).  This shouldn't break anything unless
>>> someone was using - or + signs on TRUE/FALSE/NULL. :-O  That will cause
> a
>>> parse error with my changes.  Also:
>>>
>>> function foo() {
>>>     static $a = -'abc'; // 0
>>>     static $b = +'abc'; // abc
>>>     $c = +'abc'; // 0
>>> }
>>>
>>> So I made the static_scalar unary + operator "do something" and behave
> like
>>> the regular one.  Again, shouldn't break anything unless someone was
>>> applying + to literal strings or arrays!
>>>
>>> Full patch with constant folding, etc.
>>> http://realplain.com/php/const_folding.diff
>>> http://realplain.com/php/const_folding_5_3.diff
>>>
>>> -OR-, basic patch only containing the fix for signed static scalars, and
>>> only an optimization to save the opcode for unary - and + applied to a
>>> constant value (e.g. negative numbers, primarily):
>>> http://realplain.com/php/signed_expr_tweaks.diff
>>> http://realplain.com/php/signed_expr_tweaks_5_3.diff
>>>
>>>
>>> Thoughts...?  Thanks,
>>> Matt
>>>
>>>
>>> [1] http://marc.info/?l=php-internals&m=118925033731019&w=2
>>> [2] http://web.ist.utl.pt/nuno.lopes/zend_constant_folding.txt
>>>
> 

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to