* A preprocessor optimised for HipHop, using HipHop-specific syntax.
* vim: ft=php
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup Parser
*/
const CACHE_VERSION = 1;
+ /**
+ * @param $parser Parser
+ */
function __construct( $parser ) {
$this->parser = $parser;
}
}
/**
- * @param $args
+ * @param $args array
* @return PPCustomFrame_HipHop
*/
function newCustomFrame( array $args ) {
* cache may be implemented at a later date which takes further advantage of these strict
* dependency requirements.
*
+ * @throws MWException
* @return PPNode_HipHop_Tree
*/
function preprocessToObj( string $text, int $flags = 0 ) {
// Check cache.
global $wgMemc, $wgPreprocessorCacheThreshold;
- $cacheable = ($wgPreprocessorCacheThreshold !== false && strlen( $text ) > $wgPreprocessorCacheThreshold);
+ $lengthText = strlen( $text );
+
+ $cacheable = ($wgPreprocessorCacheThreshold !== false && $lengthText > $wgPreprocessorCacheThreshold);
if ( $cacheable ) {
wfProfileIn( __METHOD__.'-cacheable' );
$accum->addLiteral( strval( substr( $text, $i, $literalLength ) ) );
$i += $literalLength;
}
- if ( $i >= strlen( $text ) ) {
+ if ( $i >= $lengthText ) {
if ( $currentClosing === "\n" ) {
// Do a past-the-end run to finish off the heading
$curChar = '';
// Unclosed comment in input, runs to end
$inner = strval( substr( $text, $i ) );
$accum->addNodeWithText( 'comment', $inner );
- $i = strlen( $text );
+ $i = $lengthText;
} else {
$endPos = intval( $variantEndPos );
// Search backwards for leading whitespace
if ( $i ) {
- $wsStart = $i - intval( strspn( $revText, ' ', strlen( $text ) - $i ) );
+ $wsStart = $i - intval( strspn( $revText, ' ', $lengthText - $i ) );
} else {
$wsStart = 0;
}
} else {
// No end tag -- let it run out to the end of the text.
$inner = strval( substr( $text, $tagEndPos + 1 ) );
- $i = strlen( $text );
+ $i = $lengthText;
$haveClose = false;
}
}
} elseif ( $found === 'line-end' ) {
$piece = $stack->getTop();
// A heading must be open, otherwise \n wouldn't have been in the search list
- assert( $piece->open === "\n" );
+ assert( $piece->open === "\n" ); // Passing the assert condition directly instead of string, as
+ // HPHP /compiler/ chokes on strings when ASSERT_ACTIVE != 0.
$part = $piece->getCurrentPart();
// Search back through the input to see if it has a proper close
// Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
- $wsLength = intval( strspn( $revText, " \t", strlen( $text ) - $i ) );
+ $wsLength = intval( strspn( $revText, " \t", $lengthText - $i ) );
$searchStart = $i - $wsLength;
if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
// Comment found at line end
// Search for equals signs before the comment
$searchStart = intval( $part->visualEnd );
- $searchStart -= intval( strspn( $revText, " \t", strlen( $text ) - $searchStart ) );
+ $searchStart -= intval( strspn( $revText, " \t", $lengthText - $searchStart ) );
}
$count = intval( $piece->count );
- $equalsLength = intval( strspn( $revText, '=', strlen( $text ) - $searchStart ) );
+ $equalsLength = intval( strspn( $revText, '=', $lengthText - $searchStart ) );
$isTreeNode = false;
$resultAccum = $accum;
if ( $equalsLength > 0 ) {
* @ingroup Parser
*/
class PPDStackElement_HipHop {
- var $open, // Opening character (\n for heading)
- $close, // Matching closing character
+ var $open, // Opening character (\n for heading)
+ $close, // Matching closing character
$count, // Number of opening characters found (number of "=" for heading)
$parts, // Array of PPDPart objects describing pipe-separated parts.
$lineStart; // True if the open char appeared at the start of the input line. Not set for headings.
+ /**
+ * @param $obj PPDStackElement_HipHop
+ * @return PPDStackElement_HipHop
+ */
static function cast( PPDStackElement_HipHop $obj ) {
return $obj;
}
+ /**
+ * @param $data array
+ */
function __construct( $data = array() ) {
$this->parts = array( new PPDPart_HipHop );
}
}
+ /**
+ * @return PPDAccum_HipHop
+ */
function getAccum() {
return PPDAccum_HipHop::cast( $this->parts[count($this->parts) - 1]->out );
}
+ /**
+ * @param $s string
+ */
function addPart( $s = '' ) {
$this->parts[] = new PPDPart_HipHop( $s );
}
+ /**
+ * @return PPDPart_HipHop
+ */
function getCurrentPart() {
return PPDPart_HipHop::cast( $this->parts[count($this->parts) - 1] );
}
/**
* Get the accumulator that would result if the close is not found.
*
+ * @param $openingCount bool
* @return PPDAccum_HipHop
*/
function breakSyntax( $openingCount = false ) {
* Create a new child frame
* $args is optionally a multi-root PPNode or array containing the template arguments
*
- * @param $args PPNode_HipHop_Array|array
- * @param $title Title|false
+ * @param $args PPNode_HipHop_Array|array|bool
+ * @param $title Title|bool
*
+ * @throws MWException
* @return PPTemplateFrame_HipHop
*/
function newChild( $args = false, $title = false ) {
}
if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
+ $this->parser->limitationWarn( 'node-count-exceeded',
+ $this->parser->mPPNodeCount,
+ $this->parser->mOptions->getMaxPPNodeCount()
+ );
return '<span class="error">Node-count limit exceeded</span>';
}
if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
+ $this->parser->limitationWarn( 'expansion-depth-exceeded',
+ $expansionDepth,
+ $this->parser->mOptions->getMaxPPExpandDepth()
+ );
return '<span class="error">Expansion depth limit exceeded</span>';
}
++$expansionDepth;
+ if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+ $this->parser->mHighestExpansionDepth = $expansionDepth;
+ }
$outStack = array( '', '' );
$iteratorStack = array( false, $root );
/**
* Implode with no flags specified
* This previously called implodeWithFlags but has now been inlined to reduce stack depth
+ * @param $sep
* @return string
*/
function implode( $sep /*, ... */ ) {
* Makes an object that, when expand()ed, will be the same as one obtained
* with implode()
*
+ * @param $sep
* @return PPNode_HipHop_Array
*/
function virtualImplode( $sep /*, ... */ ) {
/**
* Virtual implode with brackets
*
+ * @param $start
+ * @param $sep
+ * @param $end
* @return PPNode_HipHop_Array
*/
function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) {
var $numberedExpansionCache, $namedExpansionCache;
/**
- * @param $preprocessor
- * @param $parent
+ * @param $preprocessor Preprocessor_HipHop
+ * @param $parent bool
* @param $numberedArgs array
* @param $namedArgs array
- * @param $title Title
+ * @param $title Title|bool
*/
function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
parent::__construct( $preprocessor );
return $this->nextSibling;
}
+ /**
+ * @param $name string
+ * @return array
+ */
function getChildrenOfType( $name ) {
$children = array();
for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
if ( isset( $child->name ) && $child->name === $name ) {
- $children[] = $name;
+ $children[] = $child;
}
}
return $children;
* index String index
* value PPNode value
*
+ * @throws MWException
* @return array
*/
function splitArg() {
* Split an <ext> node into an associative array containing name, attr, inner and close
* All values in the resulting array are PPNodes. Inner and close are optional.
*
+ * @throws MWException
* @return array
*/
function splitExt() {
/**
* Split an <h> node
*
+ * @throws MWException
* @return array
*/
function splitHeading() {