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