Patches added to http://bugs.php.net/28261, and I re-opened the bug.
Greg
Gregory Beaver wrote:
> Hi,
>
> I spent a while tonight tinkering with the parser to try to figure out
> how to allow it to use T_IMPORT as well as T_STRING for method names,
> and quickly came to the conclusion that this causes way more trouble
> than it is worth. However, in a moment of inspiration, I realized that
> a minor change in the lexer would allow any reserved words for method
> names. The patch is attached. This patch allows all kinds of odd
> looking code that probably won't be used, but permanently guarantees
> that code written for PHP now will never conflict with future reserved
> words:
>
> <?php
> namespace testing;
> class Test {
> function array()
> {
> echo "array\n";
> }
> function class()
> {
> echo "class\n";
> }
> static function import()
> {
> echo "import\n";
> }
> function new()
> {
> echo "new\n";
> }
> $a = new Test;
> $a->array();
> $a->class();
> $a->new();
> Test::import();
> testing::Test::import();
> ?>
>
> The patch does not allow reserved names for class names, interface
> names, functions, or for class constants. This would be much harder to
> implement in the lexer, and in my experience collisions with reserved
> words most often happens with methods.
>
> The patch only allows methods to use reserved words, not functions, and
> causes a fatal error with this code:
>
> <?php
> function foreach($a)
> {
> }
> ?>
>
> This prevents this wtf code, which would also produce a different (and
> non-intuitive) fatal error:
>
> <?php
> foreach (foreach() as $foreach) {foreach();}
> ?>
>
> The patch is against PHP 5.3, and PHP 6
>
> Greg
>
>
> ------------------------------------------------------------------------
>
> ? better_halt.patch.txt
> ? config.cli
> ? config.nice.nodebug
> ? err
> ? install-pear-nozlib.phar
> ? run-tests.oops.patch.txt
> ? smarter_lexer.patch.txt
> ? test-phar.sh
> ? test.phar
> ? testme.php
> ? zlib.patch
> ? Zend/tests/zend_function_name.phpt
> ? ext/gd/run-tests.php
> ? ext/gettext/run-tests.php
> ? ext/mysqli/run-tests.php
> ? ext/zip/run-tests.php
> ? ext/zlib/zlib_filter.c.2
> ? pear/scripts
> ? tests/lang/halt_compiler1.phpt
> ? tests/lang/halt_compiler2.phpt
> ? tests/lang/halt_compiler3.phpt
> ? tests/lang/halt_compiler4.phpt
> Index: run-tests.php
> ===================================================================
> RCS file: /repository/php-src/run-tests.php,v
> retrieving revision 1.226.2.37.2.35
> diff -u -r1.226.2.37.2.35 run-tests.php
> --- run-tests.php 14 Sep 2007 15:28:03 -0000 1.226.2.37.2.35
> +++ run-tests.php 3 Oct 2007 02:40:57 -0000
> @@ -1328,12 +1328,15 @@
> $raw_lines = explode("\n", $post);
>
> $request = '';
> + $started = false;
> foreach ($raw_lines as $line) {
> if (empty($env['CONTENT_TYPE']) &&
> preg_match('/^Content-Type:(.*)/i', $line, $res)) {
> $env['CONTENT_TYPE'] = trim(str_replace("\r",
> '', $res[1]));
> continue;
> }
> - $request .= $line . "\n";
> + if ($started) $request .= "\n";
> + $started = true;
> + $request .= $line;
> }
>
> $env['CONTENT_LENGTH'] = strlen($request);
> Index: Zend/zend_language_scanner.l
> ===================================================================
> RCS file: /repository/ZendEngine2/zend_language_scanner.l,v
> retrieving revision 1.131.2.11.2.13.2.1
> diff -u -r1.131.2.11.2.13.2.1 zend_language_scanner.l
> --- Zend/zend_language_scanner.l 28 Sep 2007 19:52:50 -0000
> 1.131.2.11.2.13.2.1
> +++ Zend/zend_language_scanner.l 3 Oct 2007 02:41:02 -0000
> @@ -978,6 +978,9 @@
> }
>
> <ST_IN_SCRIPTING>"function" {
> + if (CG(active_class_entry)) {
> + yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
> + }
> return T_FUNCTION;
> }
>
> @@ -1118,6 +1121,14 @@
> return T_OBJECT_OPERATOR;
> }
>
> +<ST_LOOKING_FOR_PROPERTY>{WHITESPACE} {
> + zendlval->value.str.val = yytext; /* no copying - intentional */
> + zendlval->value.str.len = yyleng;
> + zendlval->type = IS_STRING;
> + HANDLE_NEWLINES(yytext, yyleng);
> + return T_WHITESPACE;
> +}
> +
> <ST_LOOKING_FOR_PROPERTY>{LABEL} {
> yy_pop_state(TSRMLS_C);
> zend_copy_value(zendlval, yytext, yyleng);
> @@ -1131,6 +1142,7 @@
> }
>
> <ST_IN_SCRIPTING>"::" {
> + yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
> return T_PAAMAYIM_NEKUDOTAYIM;
> }
>
>
>
> ------------------------------------------------------------------------
>
> Index: Zend/zend_language_scanner.l
> ===================================================================
> RCS file: /repository/ZendEngine2/zend_language_scanner.l,v
> retrieving revision 1.170
> diff -u -r1.170 zend_language_scanner.l
> --- Zend/zend_language_scanner.l 9 Sep 2007 22:49:31 -0000 1.170
> +++ Zend/zend_language_scanner.l 3 Oct 2007 02:42:31 -0000
> @@ -1483,6 +1483,9 @@
> }
>
> <ST_IN_SCRIPTING>"function" {
> + if (CG(active_class_entry)) {
> + yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
> + }
> return T_FUNCTION;
> }
>
> @@ -1627,6 +1630,14 @@
> return T_OBJECT_OPERATOR;
> }
>
> +<ST_LOOKING_FOR_PROPERTY>{WHITESPACE} {
> + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */
> + Z_STRLEN_P(zendlval) = yyleng;
> + Z_TYPE_P(zendlval) = IS_STRING;
> + HANDLE_NEWLINES(yytext, yyleng);
> + return T_WHITESPACE;
> +}
> +
> <ST_LOOKING_FOR_PROPERTY>{LABEL} {
> yy_pop_state(TSRMLS_C);
> if (!zend_copy_scanner_string(zendlval, yytext, yyleng,
> UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) {
> @@ -1644,6 +1655,7 @@
> }
>
> <ST_IN_SCRIPTING>"::" {
> + yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
> return T_PAAMAYIM_NEKUDOTAYIM;
> }
>
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php