Pastakhov has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/111198

Change subject: fix array definition and array index
......................................................................

fix array definition and array index

* fix class BaseHooks

Change-Id: If68357aa2e0397dc20da795308c2c16f4a73acf7
---
M PhpTags.php
M includes/BaseHooks.php
M includes/Compiler.php
M includes/Runtime.php
M tests/phpunit/includes/RuntimeTest.php
5 files changed, 53 insertions(+), 32 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/PhpTags 
refs/changes/98/111198/1

diff --git a/PhpTags.php b/PhpTags.php
index 72e8a37..e1da87d 100644
--- a/PhpTags.php
+++ b/PhpTags.php
@@ -17,7 +17,7 @@
 
 define( 'PHPTAGS_MAJOR_VERSION' , 1 );
 define( 'PHPTAGS_MINOR_VERSION' , 0 );
-define( 'PHPTAGS_RELEASE_VERSION' , 2 );
+define( 'PHPTAGS_RELEASE_VERSION' , 3 );
 define( 'PHPTAGS_VERSION' , PHPTAGS_MAJOR_VERSION . '.' . 
PHPTAGS_MINOR_VERSION . '.' . PHPTAGS_RELEASE_VERSION );
 
 // Register this extension on Special:Version
@@ -85,7 +85,12 @@
        return true;
 };
 
-define( 'PHPTAGS_GROUP_EXPENSIVE', 1 );
+define( 'PHPTAGS_TRANSIT_VARIABLES', 'v' );
+define( 'PHPTAGS_TRANSIT_PARSER', 'p' );
+define( 'PHPTAGS_TRANSIT_PPFRAME', 'f' );
+define( 'PHPTAGS_TRANSIT_EXCEPTION', '@' );
+
+define( 'PHPTAGS_GROUP_UNLIMITED_MEMORY', 1 );
 
 /**
  * You can specify the namespaces in which allowed to use this extension.
diff --git a/includes/BaseHooks.php b/includes/BaseHooks.php
index 2d79bf2..077f436 100644
--- a/includes/BaseHooks.php
+++ b/includes/BaseHooks.php
@@ -10,7 +10,10 @@
 define( 'PHPTAGS_HOOK_RETURNS_ON_FAIL', 1 );
 
 define( 'PHPTAGS_TYPE_ARRAY', 'a' );
+define( 'PHPTAGS_TYPE_BOOL', 'b' );
 define( 'PHPTAGS_TYPE_INT', 'i' );
+define( 'PHPTAGS_TYPE_NUMBER', 'n' );
+define( 'PHPTAGS_TYPE_VOID', 'v' );
 define( 'PHPTAGS_TYPE_MIXED', 'm' );
 
 /**
@@ -36,7 +39,7 @@
                        $d = $i + 1;
                        if ( !isset($definition[$d]) ) {
                                if ( isset($definition[PHPTAGS_HOOK_VALUE_N]) ) 
{
-                                       $d = PHPTAGS_HOOK_LAST_VALUE;
+                                       $d = PHPTAGS_HOOK_VALUE_N;
                                } else {
                                        $transit[PHPTAGS_TRANSIT_EXCEPTION][] = 
new ExceptionPhpTags( PHPTAGS_EXCEPTION_WARNING_WRONG_PARAMETER_COUNT, $name );
                                        return;
@@ -45,21 +48,26 @@
 
                        if ( $definition[$d][PHPTAGS_HOOK_NEED_LINK] ) {
                                if ( $params[$i][PHPTAGS_STACK_COMMAND] != 
T_VARIABLE ) {
-                                       return new ExceptionPhpTags( 
PHPTAGS_EXCEPTION_FATAL_VALUE_PASSED_BY_REFERENCE );
-                               }
-                               if ( 
!array_key_exists($params[$i][PHPTAGS_STACK_PARAM], 
$transit[PHPTAGS_TRANSIT_VARIABLES]) ) {
-                                       $transit[PHPTAGS_TRANSIT_VARIABLES][ 
$params[$i][PHPTAGS_STACK_PARAM] ] = null;
-                               }
-                               $args[$i] = 
&$transit[PHPTAGS_TRANSIT_VARIABLES][ $params[$i][PHPTAGS_STACK_PARAM] ];
-                               if ( 
isset($params[$i][PHPTAGS_STACK_ARRAY_INDEX]) ) { // Example: $foo[1]
-                                       foreach ( 
$params[$i][PHPTAGS_STACK_ARRAY_INDEX] as $v ) {
-                                               if ( is_array($args[$i]) ) {
-                                                       if ( 
!array_key_exists($v[PHPTAGS_STACK_RESULT], $args[$i]) ) {
-                                                               $args[$i][ 
$v[PHPTAGS_STACK_RESULT] ] = null;
+                                       if ( 
$definition[$d][PHPTAGS_HOOK_NEED_LINK] === true ) {
+                                               return new ExceptionPhpTags( 
PHPTAGS_EXCEPTION_FATAL_VALUE_PASSED_BY_REFERENCE );
+                                       } else {
+                                               $args[$i] = 
$params[$i][PHPTAGS_STACK_RESULT];
+                                       }
+                               } else {
+                                       if ( 
!array_key_exists($params[$i][PHPTAGS_STACK_PARAM], 
$transit[PHPTAGS_TRANSIT_VARIABLES]) ) {
+                                               
$transit[PHPTAGS_TRANSIT_VARIABLES][ $params[$i][PHPTAGS_STACK_PARAM] ] = null;
+                                       }
+                                       $args[$i] = 
&$transit[PHPTAGS_TRANSIT_VARIABLES][ $params[$i][PHPTAGS_STACK_PARAM] ];
+                                       if ( 
isset($params[$i][PHPTAGS_STACK_ARRAY_INDEX]) ) { // Example: $foo[1]
+                                               foreach ( 
$params[$i][PHPTAGS_STACK_ARRAY_INDEX] as $v ) {
+                                                       if ( 
is_array($args[$i]) ) {
+                                                               if ( 
!array_key_exists($v[PHPTAGS_STACK_RESULT], $args[$i]) ) {
+                                                                       
$args[$i][ $v[PHPTAGS_STACK_RESULT] ] = null;
+                                                               }
+                                                               $args[$i] = 
&$args[$i][ $v[PHPTAGS_STACK_RESULT] ];
+                                                       } else {
+                                                               return new 
ExceptionPhpTags( PHPTAGS_EXCEPTION_FATAL_VALUE_PASSED_BY_REFERENCE );
                                                        }
-                                                       $args[$i] = &$args[$i][ 
$v[PHPTAGS_STACK_RESULT] ];
-                                               } else {
-                                                       return new 
ExceptionPhpTags( PHPTAGS_EXCEPTION_FATAL_VALUE_PASSED_BY_REFERENCE );
                                                }
                                        }
                                }
@@ -93,7 +101,7 @@
                while ( !isset($definition[PHPTAGS_HOOK_INVOKE][$i]) ) {
                        $d = $i + 1;
                        if ( 
!isset($definition[$d][PHPTAGS_HOOK_DEFAULT_VALUE]) ) {
-                               if ( 
isset($definition[PHPTAGS_HOOK_INVOKE][PHPTAGS_HOOK_VALUE_N]) ) {
+                               if ( !isset($definition[$d]) && 
isset($definition[PHPTAGS_HOOK_INVOKE][PHPTAGS_HOOK_VALUE_N]) ) {
                                        $d = PHPTAGS_HOOK_VALUE_N;
                                        break;
                                }
diff --git a/includes/Compiler.php b/includes/Compiler.php
index 2fda4b9..8b24c7b 100644
--- a/includes/Compiler.php
+++ b/includes/Compiler.php
@@ -479,10 +479,11 @@
                                                        throw new 
ExceptionPhpTags( PHPTAGS_EXCEPTION_SYNTAX_ERROR_UNEXPECTED, array( $this->id, 
"']'" ), $this->tokenLine, $this->place );
                                                }
                                                if ( $indexVal ) { // Example: 
$foo[1]
-                                                       
$variable[PHPTAGS_STACK_ARRAY_INDEX][] = $indexVal;
+                                                       
$variable[PHPTAGS_STACK_ARRAY_INDEX][] = &$indexVal;
                                                        if ( 
$indexVal[PHPTAGS_STACK_COMMAND] ) {
-                                                               $this->stack[] 
= $indexVal;
+                                                               $this->stack[] 
= &$indexVal;
                                                        }
+                                                       unset( $indexVal );
                                                } else { // Example: $foo[]
                                                        
$variable[PHPTAGS_STACK_ARRAY_INDEX][] = null;
                                                        $cannotRead = true;
@@ -1071,6 +1072,7 @@
                                                        
$result[PHPTAGS_STACK_PARAM_2][] = array( &$key[PHPTAGS_STACK_RESULT], 
&$value[PHPTAGS_STACK_RESULT] );
                                                        $array = array();
                                                }
+                                               unset( $key );
                                                $key = false;
                                        }
                                        if ( $value[PHPTAGS_STACK_COMMAND] ) {
@@ -1081,14 +1083,23 @@
                                        }
                                        break;
                                case T_DOUBLE_ARROW:
-                                       $key = $value;
-                                       if ( $value[PHPTAGS_STACK_COMMAND] ) {
-                                               $this->stack[] = $value; // Add 
the command for receive value into the stack
+                                       if ( $key !== false ) {
+                                               // PHP Parse error:  syntax 
error, unexpected $id, expecting ',' or ')'
+                                               throw new ExceptionPhpTags( 
PHPTAGS_EXCEPTION_SYNTAX_ERROR_UNEXPECTED, array( $this->id, "','", 
"'$endToken'" ), $this->tokenLine, $this->place );
+                                       }
+                                       $key = &$value;
+                                       unset( $value );
+                                       if ( $key[PHPTAGS_STACK_COMMAND] ) {
+                                               $this->stack[] = &$key; // Add 
the command for receive value into the stack
                                        }
                                        break;
                        }
                        $this->stepUP();
                }
+               if ( $key !== false ) {
+                       // PHP Parse error:  syntax error, unexpected $id
+                       throw new ExceptionPhpTags( 
PHPTAGS_EXCEPTION_SYNTAX_ERROR_UNEXPECTED, array( $this->id ), 
$this->tokenLine, $this->place );
+               }
                if ( $result === false ) {
                        return array( PHPTAGS_STACK_COMMAND=>false, 
PHPTAGS_STACK_RESULT=>$array );
                }
diff --git a/includes/Runtime.php b/includes/Runtime.php
index 10aec0f..7bf4202 100644
--- a/includes/Runtime.php
+++ b/includes/Runtime.php
@@ -12,15 +12,6 @@
 define( 'PHPTAGS_STACK_ARRAY_INDEX', 'a' );
 define( 'PHPTAGS_STACK_DEBUG', '#' );
 
-// definitions for Runtame::$functions
-define( 'PHPTAGS_DEFAULT_VALUES', 'd' );
-define( 'PHPTAGS_MIN_VALUES', '<' );
-
-define( 'PHPTAGS_TRANSIT_VARIABLES', 'v' );
-define( 'PHPTAGS_TRANSIT_PARSER', 'p' );
-define( 'PHPTAGS_TRANSIT_PPFRAME', 'f' );
-define( 'PHPTAGS_TRANSIT_EXCEPTION', '@' );
-
 /**
  * The runtime class of the extension PhpTags.
  *
diff --git a/tests/phpunit/includes/RuntimeTest.php 
b/tests/phpunit/includes/RuntimeTest.php
index 00e4698..79ec704 100644
--- a/tests/phpunit/includes/RuntimeTest.php
+++ b/tests/phpunit/includes/RuntimeTest.php
@@ -1652,6 +1652,12 @@
                                array('this is string')
                                );
        }
+       public function testRun_echo_array_11() {
+               $this->assertEquals(
+                               Runtime::runSource('$a = array(8=>7); $b = 
array(7=>3); echo $b[$a[8]];'),
+                               array('3')
+                               );
+       }
 
        public function testRun_echo_array_double_arrow_1() {
                $this->assertEquals(

-- 
To view, visit https://gerrit.wikimedia.org/r/111198
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If68357aa2e0397dc20da795308c2c16f4a73acf7
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/PhpTags
Gerrit-Branch: master
Gerrit-Owner: Pastakhov <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to