Re: com php-src: Disable restrictions regarding arrays in constants at run-time. For the discussion around it, see the thread on the mailing list:
http://www.mail-archive.com/internals@lists.php.net/msg68245.html: NEWS Zend/tests/constant_expressions_arrays.phpt Zend/tests/errmsg_040.phpt
Zend/tests/ns_059.phpt Zend/zend_language_parser.y Zend/zend_vm_def.h Zend/zend_vm_execute.h ext/standard/array.c
| From: | Bob Weinand | Date: | Tue, 12 Aug 2014 09:35:05 +0000 |
| Subject: | Re: com php-src: Disable restrictions regarding arrays in constants at run-time. For the discussion around it, see the thread on the mailing list: http://www.mail-archive.com/internals@lists.php.net/msg68245.html: NEWS Zend/tests/constant_expressions_arrays.phpt Zend/tests/errmsg_040.phpt Zend/tests/ns_059.phpt Zend/zend_language_parser.y Zend/zend_vm_def.h Zend/zend_vm_execute.h ext/standard/array.c |
||
| References: | 1 2 3 4 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-79813@lists.php.net to get a copy of this message | ||
Am 12.8.2014 um 11:13 schrieb Nikita Popov <nikita.ppv@gmail.com>:
> On Tue, Aug 12, 2014 at 11:02 AM, Bob Weinand <bobwei9@hotmail.com> wrote:
> Am 12.8.2014 um 10:49 schrieb Nikita Popov <nikita.ppv@gmail.com>:
>
>> On Wed, Jul 30, 2014 at 5:57 PM, Bob Weinand <bwoebi@php.net> wrote:
>> Commit: d5ddd2dbb263cd626a5e0f203c00d6f39168507b
>> Author: Bob Weinand <bobwei9@hotmail.com> Wed, 30 Jul 2014 17:57:07 +0200
>> Parents: 354ee12b73dbe20d0c4fa7883eb34714f89109df
>> Branches: PHP-5.6
>>
>> Link:
>> http://git.php.net/?p=php-src.git;a=commitdiff;h=d5ddd2dbb263cd626a5e0f203c00d6f39168507b
>>
>> Log:
>> Disable restrictions regarding arrays in constants at run-time.
>> For the discussion around it, see the thread on the mailing list:
>>
>> http://www.mail-archive.com/internals@lists.php.net/msg68245.html
>>
>> Changed paths:
>> M NEWS
>> M Zend/tests/constant_expressions_arrays.phpt
>> M Zend/tests/errmsg_040.phpt
>> M Zend/tests/ns_059.phpt
>> M Zend/zend_language_parser.y
>> M Zend/zend_vm_def.h
>> M Zend/zend_vm_execute.h
>> M ext/standard/array.c
>>
>>
>> Diff:
>> diff --git a/NEWS b/NEWS
>> index ba58827..7516f0c 100644
>> --- a/NEWS
>> +++ b/NEWS
>> @@ -4,6 +4,8 @@ PHP
>> NEWS
>>
>> - Core:
>> . Fixed bug #67693 (incorrect push to the empty array). (Tjerk)
>> + . Removed inconsistency regarding behaviour of array in constants at
>> + run-time. (Bob)
>>
>> - SPL:
>> . Revert fix for bug #67064 (BC issues). (Bob)
>> diff --git a/Zend/tests/constant_expressions_arrays.phpt
>> b/Zend/tests/constant_expressions_arrays.phpt
>> index 061fcc6..2ab0345 100644
>> --- a/Zend/tests/constant_expressions_arrays.phpt
>> +++ b/Zend/tests/constant_expressions_arrays.phpt
>> @@ -22,7 +22,7 @@ class foo {
>>
>> var_dump(foo::bar);
>>
>> -var_dump(a); // Eventually allow that later with array dereferencing of constants
>> +var_dump(a, a[0], a[2], a[2][1], a[3]);
>>
>> ?>
>> --EXPECTF--
>> @@ -32,4 +32,35 @@ int(1)
>> int(4)
>> int(1)
>>
>> -Fatal error: Arrays are not allowed in constants at run-time in %s on line %d
>> +Notice: Undefined offset: 3 in %s on line %d
>> +array(3) {
>> + [0]=>
>> + int(1)
>> + [1]=>
>> + int(2)
>> + [2]=>
>> + array(2) {
>> + [0]=>
>> + int(3)
>> + [1]=>
>> + array(1) {
>> + [0]=>
>> + int(4)
>> + }
>> + }
>> +}
>> +int(1)
>> +array(2) {
>> + [0]=>
>> + int(3)
>> + [1]=>
>> + array(1) {
>> + [0]=>
>> + int(4)
>> + }
>> +}
>> +array(1) {
>> + [0]=>
>> + int(4)
>> +}
>> +NULL
>> diff --git a/Zend/tests/errmsg_040.phpt b/Zend/tests/errmsg_040.phpt
>> index c3a007f..cda8d4c 100644
>> --- a/Zend/tests/errmsg_040.phpt
>> +++ b/Zend/tests/errmsg_040.phpt
>> @@ -12,4 +12,12 @@ var_dump(test::TEST);
>> echo "Done\n";
>> ?>
>> --EXPECTF--
>> -Fatal error: Arrays are not allowed in constants at run-time in %s on line %d
>> +array(3) {
>> + [0]=>
>> + int(1)
>> + [1]=>
>> + int(2)
>> + [2]=>
>> + int(3)
>> +}
>> +Done
>> diff --git a/Zend/tests/ns_059.phpt b/Zend/tests/ns_059.phpt
>> index 48da40b..701e448 100644
>> --- a/Zend/tests/ns_059.phpt
>> +++ b/Zend/tests/ns_059.phpt
>> @@ -7,5 +7,5 @@ const C = array();
>> var_dump(C);
>> ?>
>> --EXPECTF--
>> -Fatal error: Arrays are not allowed in constants at run-time in %sns_059.php on line 4
>> -
>> +array(0) {
>> +}
>> diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
>> index 56e702e..7502723 100644
>> --- a/Zend/zend_language_parser.y
>> +++ b/Zend/zend_language_parser.y
>> @@ -865,13 +865,16 @@ yield_expr:
>> ;
>>
>> combined_scalar_offset:
>> - combined_scalar '[' dim_offset ']' {
>> zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
>> - | combined_scalar_offset '[' dim_offset ']' {
>> fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
>> - | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $1.EA = 0;
>> zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
>> + combined_scalar '[' dim_offset ']' {
>> zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
>> + | combined_scalar_offset '[' dim_offset ']' {
>> fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
>> + | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $1.EA =
>> 0; zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
>> + | general_constant '[' dim_offset ']' {
>> zend_do_begin_variable_parse(TSRMLS_C); fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
>> +;
>>
>> combined_scalar:
>> - T_ARRAY '(' array_pair_list ')' { $$ = $3; }
>> - | '[' array_pair_list ']' { $$ = $2; }
>> + T_ARRAY '(' array_pair_list ')' { $$ = $3; }
>> + | '[' array_pair_list ']' { $$ = $2; }
>> +;
>>
>> function:
>> T_FUNCTION { $$.u.op.opline_num = CG(zend_lineno); }
>> @@ -1038,20 +1041,22 @@ static_operation:
>> | '(' static_scalar_value ')' { $$ = $2; }
>> ;
>>
>> -
>> -scalar:
>> - T_STRING_VARNAME { $$ = $1; }
>> - | class_name_scalar { $$ = $1; }
>> - | class_constant { $$ = $1; }
>> +general_constant:
>> + class_constant { $$ = $1; }
>> | namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_RT, 1
>> TSRMLS_CC); }
>> | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST;
>> ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3
>> TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_RT, 0 TSRMLS_CC); }
>> | T_NS_SEPARATOR namespace_name { char *tmp =
>> estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]),
>> Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\';
>> efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant);
>> zend_do_fetch_constant(&$$, NULL, &$2, ZEND_RT, 0 TSRMLS_CC); }
>> - | common_scalar { $$ = $1; }
>> - | '"' encaps_list '"' { $$ = $2; }
>> - | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $2; }
>> - | T_CLASS_C { if (Z_TYPE($1.u.constant) ==
>> IS_CONSTANT) {zend_do_fetch_constant(&$$, NULL, &$1, ZEND_RT, 1 TSRMLS_CC);} else {$$ = $1;}
>> }
>> ;
>>
>> +scalar:
>> + T_STRING_VARNAME { $$ = $1; }
>> + | general_constant { $$ = $1; }
>> + | class_name_scalar { $$ = $1; }
>> + | common_scalar { $$ = $1; }
>> + | '"' encaps_list '"' { $$ = $2; }
>> + | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $2; }
>> + | T_CLASS_C { if (Z_TYPE($1.u.constant) == IS_CONSTANT)
>> {zend_do_fetch_constant(&$$, NULL, &$1, ZEND_RT, 1 TSRMLS_CC);} else {$$ = $1;} }
>> +;
>>
>> If I read the patch correctly, these changes allow Foo[0] usage in normal expressions -
>> however the [] implementation for static scalars still allows a bunch of things that are not allowed
>> otherwise, like 1[0], __NAMESPACE__[3] or <<<'A'\nB\nA\n[0].
>>
>> Either the general PHP syntax should support these as well, or they should be removed for
>> constant scalar expressions, or - which I would prefer as we're close to a 5.6 release - the []
>> support for constant scalar expressions should be removed altogether and implemented again when
>> properly thought through.
>>
>> Thanks,
>> Nikita
>
> No, then you've misread the patch, none of your examples works.
>
> It just now allows dereferencing everything which is a constant identifier:
>
> general_constant:
> class_constant { /* ... */ }
> | namespace_name { /* ... */ }
> | T_NAMESPACE T_NS_SEPARATOR namespace_name { /* ... */ }
> | T_NS_SEPARATOR namespace_name { /* ... */ }
> ;
>
>
> maybe you were a bit confused by the mixed additions and deletions like git shows it, but
> there's actually no issue.
>
> The issue is that static scalar expressions do allow all these things, even though normal
> expressions do not. Using PHP-5.6 HEAD:
>
> <?php
> const C1 = 1[0];
> const C2 = __FILE__[0];
> const C3 = <<<'A'
> B
> A
> [0];
>
> var_dump(C1, C2, C3);
>
> Yields:
>
> NULL
> string(1) "/"
> string(1) "B"
>
> Nikita
That shouldn't be allowed, but that's not related to that patch, so I was a bit confused.
Will look into it.
Thank you,
Bob