Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:31331 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 7234 invoked by uid 1010); 30 Jul 2007 20:33:36 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 7219 invoked from network); 30 Jul 2007 20:33:36 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 30 Jul 2007 20:33:36 -0000 Authentication-Results: pb1.pair.com smtp.mail=colder@php.net; spf=unknown; sender-id=unknown Authentication-Results: pb1.pair.com header.from=colder@php.net; sender-id=unknown Received-SPF: unknown (pb1.pair.com: domain php.net does not designate 213.239.212.54 as permitted sender) X-PHP-List-Original-Sender: colder@php.net X-Host-Fingerprint: 213.239.212.54 dns1.omne-serveurs.net Linux 2.4/2.6 Received: from [213.239.212.54] ([213.239.212.54:35221] helo=dns1.omne-serveurs.net) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 5F/4D-26552-D1B4EA64 for ; Mon, 30 Jul 2007 16:33:35 -0400 Received: (qmail 30274 invoked from network); 30 Jul 2007 20:33:29 -0000 Received: from 83.79.183.126 by dns1 (envelope-from , uid 1004) with qmail-scanner-1.23 (clamdscan: 0.82. spamassassin: 3.0.1. perlscan: 1.32. Clear:RC:1(83.79.183.126):. Processed in 0.419476 secs); 30 Jul 2007 20:33:29 -0000 Received: from 126.183.79.83.cust.bluewin.ch (HELO ?192.168.1.39?) (83.79.183.126) by dns1.omne-serveurs.net with (DHE-RSA-AES256-SHA encrypted) SMTP; 30 Jul 2007 20:33:29 -0000 Message-ID: <46AE49B3.2070100@php.net> Date: Mon, 30 Jul 2007 22:27:31 +0200 User-Agent: Thunderbird 1.5.0.7 (X11/20060909) MIME-Version: 1.0 To: internals@lists.php.net Content-Type: multipart/mixed; boundary="------------000209060402080004030908" Subject: Fix inconsistencies in OO calls From: colder@php.net (Etienne Kneuss) --------------000209060402080004030908 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hello, Currently, those are allowed: new $classname; classname::$methodname(); but those aren't: $classname::foo(); $classname::CONST; $classname::$member; Here is a patch for head that fixes those inconsistencies by extending the language parser to support such syntax: http://patches.colder.ch/Zend/dynamic_static_calls.patch?markup (patch also attached) Regards -- Etienne Kneuss http://www.colder.ch Men never do evil so completely and cheerfully as when they do it from a religious conviction. -- Pascal --------------000209060402080004030908 Content-Type: text/plain; name="dynamic_static_calls.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="dynamic_static_calls.patch" Index: Zend/zend_language_parser.y =================================================================== RCS file: /repository/ZendEngine2/zend_language_parser.y,v retrieving revision 1.186 diff -u -p -r1.186 zend_language_parser.y --- Zend/zend_language_parser.y 27 Jul 2007 09:04:12 -0000 1.186 +++ Zend/zend_language_parser.y 30 Jul 2007 20:28:41 -0000 @@ -649,6 +649,12 @@ function_call: | fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING '(' { zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); } function_call_parameter_list ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} + | variable_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING '(' { zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); } + function_call_parameter_list + ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} + | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects '(' { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); } + function_call_parameter_list + ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} | fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects '(' { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); } function_call_parameter_list ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} @@ -809,6 +815,11 @@ variable_without_objects: static_member: fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_static_member(&$$, &$1 TSRMLS_CC); } + | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_static_member(&$$, &$1 TSRMLS_CC); } +; + +variable_class_name: + reference_variable { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); $$=$1;} ; @@ -935,6 +946,7 @@ isset_variables: class_constant: fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_RT TSRMLS_CC); } + | variable_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_RT TSRMLS_CC); } ; %% Index: tests/lang/041.phpt =================================================================== RCS file: tests/lang/041.phpt diff -N tests/lang/041.phpt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/lang/041.phpt 30 Jul 2007 20:28:41 -0000 @@ -0,0 +1,23 @@ +--TEST-- +Dynamic access of static members +--FILE-- + +===DONE=== +--EXPECTF-- +foo +foo + +Fatal error: Class 'B' not found in %s041.php on line %d Index: tests/lang/042.phpt =================================================================== RCS file: tests/lang/042.phpt diff -N tests/lang/042.phpt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/lang/042.phpt 30 Jul 2007 20:28:41 -0000 @@ -0,0 +1,22 @@ +--TEST-- +Dynamic access of constants +--FILE-- + +===DONE=== +--EXPECTF-- +foo +foo + +Fatal error: Class 'B' not found in %s042.php on line %d Index: tests/lang/043.phpt =================================================================== RCS file: tests/lang/043.phpt diff -N tests/lang/043.phpt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/lang/043.phpt 30 Jul 2007 20:28:41 -0000 @@ -0,0 +1,22 @@ +--TEST-- +Dynamic call for static methods +--FILE-- + +===DONE=== +--EXPECTF-- +foo +foo + +Fatal error: Class 'B' not found in %s043.php on line %d Index: tests/lang/044.phpt =================================================================== RCS file: tests/lang/044.phpt diff -N tests/lang/044.phpt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/lang/044.phpt 30 Jul 2007 20:28:41 -0000 @@ -0,0 +1,30 @@ +--TEST-- +Dynamic call for static methods dynamically named +--FILE-- + +===DONE=== +--EXPECTF-- +foo +foo +foo +foo + +Fatal error: Class 'B' not found in %s044.php on line %d --------------000209060402080004030908--