mediawiki-extensions-Scribunto/includes/Engines/LuaStandalone/LuaStandaloneEngine.php
Umherirrender 7c1ea4284e build: Use inline ignore for MediaWiki.Usage.ForbiddenFunctions
This avoids addition of new code with the function,
or at least it gives extra attention on review when new code also uses
the inline ignore

Change-Id: I17981b52d9f96ee5f19ba46cf370c7477c81a72a
2024-09-23 17:40:51 +00:00

117 lines
3 KiB
PHP

<?php
namespace MediaWiki\Extension\Scribunto\Engines\LuaStandalone;
use Exception;
use MediaWiki\Extension\Scribunto\Engines\LuaCommon\LuaEngine;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\Parser\ParserOutput;
class LuaStandaloneEngine extends LuaEngine {
/** @var int|null */
protected static $clockTick;
/** @var array|false */
public $initialStatus;
/**
* @var LuaStandaloneInterpreter
*/
protected $interpreter;
public function load() {
parent::load();
if ( php_uname( 's' ) === 'Linux' ) {
$this->initialStatus = $this->interpreter->getStatus();
} else {
$this->initialStatus = false;
}
}
/** @inheritDoc */
public function getPerformanceCharacteristics() {
return [
'phpCallsRequireSerialization' => true,
];
}
/** @inheritDoc */
public function reportLimitData( ParserOutput $parserOutput ) {
try {
$this->load();
} catch ( Exception $e ) {
return;
}
if ( $this->initialStatus ) {
$status = $this->interpreter->getStatus();
$parserOutput->setLimitReportData( 'scribunto-limitreport-timeusage',
[
sprintf( "%.3f", $status['time'] / $this->getClockTick() ),
// Strip trailing .0s
rtrim( rtrim( sprintf( "%.3f", $this->options['cpuLimit'] ), '0' ), '.' )
]
);
$parserOutput->setLimitReportData( 'scribunto-limitreport-virtmemusage',
[
$status['vsize'],
$this->options['memoryLimit']
]
);
$parserOutput->setLimitReportData( 'scribunto-limitreport-estmemusage',
$status['vsize'] - $this->initialStatus['vsize']
);
}
$logs = $this->getLogBuffer();
if ( $logs !== '' ) {
$parserOutput->addModules( [ 'ext.scribunto.logs' ] );
$parserOutput->setLimitReportData( 'scribunto-limitreport-logs', $logs );
}
}
/** @inheritDoc */
public function formatLimitData( $key, &$value, &$report, $isHTML, $localize ) {
switch ( $key ) {
case 'scribunto-limitreport-logs':
if ( $isHTML ) {
$report .= $this->formatHtmlLogs( $value, $localize );
}
return false;
}
return true;
}
/**
* @return int
*/
protected function getClockTick() {
if ( self::$clockTick === null ) {
// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged,MediaWiki.Usage.ForbiddenFunctions.shell_exec
self::$clockTick = intval( @shell_exec( 'getconf CLK_TCK' ) );
if ( !self::$clockTick ) {
self::$clockTick = 100;
}
}
return self::$clockTick;
}
/**
* @return LuaStandaloneInterpreter
*/
protected function newInterpreter() {
return new LuaStandaloneInterpreter( $this, $this->options + [
'logger' => LoggerFactory::getInstance( 'Scribunto' )
] );
}
/** @inheritDoc */
public function getSoftwareInfo( array &$software ) {
$ver = LuaStandaloneInterpreter::getLuaVersion( $this->options );
if ( $ver !== null ) {
if ( substr( $ver, 0, 6 ) === 'LuaJIT' ) {
$software['[http://luajit.org/ LuaJIT]'] = str_replace( 'LuaJIT ', '', $ver );
} else {
$software['[http://www.lua.org/ Lua]'] = str_replace( 'Lua ', '', $ver );
}
}
}
}