mediawiki-extensions-Scribunto/tests/engines/LuaCommon/LuaDataProvider.php
Jackmcbarn 1201618b7d Keep modules' export tables inside Lua
When tables are passed from Lua to PHP, their metatables are lost. Because
of this, they need to be kept inside of Lua to allow the __index
metamethod to return a method to be called by #invoke.

Bug: 64141
Change-Id: I0840bc12b25dee72828ec97d2b205812e4929f2b
2014-05-26 20:01:18 -04:00

53 lines
1.3 KiB
PHP

<?php
class Scribunto_LuaDataProvider implements Iterator {
protected $engine = null;
protected $exports = null;
protected $key = 1;
public function __construct( $engine, $moduleName ) {
$this->engine = $engine;
$this->key = 1;
$module = $engine->fetchModuleFromParser(
Title::makeTitle( NS_MODULE, $moduleName )
);
if ( $module === null ) {
throw new Exception( "Failed to load module $moduleName" );
}
// Calling executeModule with null isn't the best idea, since it brings
// the whole export table into PHP and throws away metatables and such,
// but for this use case, we don't have anything like that to worry about
$this->exports = $engine->executeModule( $module->getInitChunk(), null );
}
public function destroy() {
$this->engine = null;
$this->exports = null;
}
public function rewind() {
$this->key = 1;
}
public function valid() {
return $this->key <= $this->exports['count'];
}
public function key() {
return $this->key;
}
public function next() {
$this->key++;
}
public function current() {
return $this->engine->getInterpreter()->callFunction( $this->exports['provide'], $this->key );
}
public function run( $key ) {
list( $ret ) = $this->engine->getInterpreter()->callFunction( $this->exports['run'], $key );
return $ret;
}
}