Add test for combination of print() and tostring(), test case when tostring is changed in global environment.
This commit is contained in:
@@ -122,10 +122,17 @@ public class BaseLib extends LFunction {
|
||||
switch ( id ) {
|
||||
case PRINT: {
|
||||
int n = vm.gettop();
|
||||
vm.getglobal("tostring");
|
||||
for ( int i=2; i<=n; i++ ) {
|
||||
vm.pushvalue(-1);
|
||||
vm.pushvalue(i);
|
||||
vm.call(1, 1);
|
||||
if ( vm.type(-1) != Lua.LUA_TSTRING )
|
||||
vm.error( "'tostring' must return a string to 'print'" );
|
||||
if ( i > 2 )
|
||||
STDOUT.print( "\t" );
|
||||
STDOUT.print( vm.tostring(i) );
|
||||
STDOUT.print( vm.tostring(-1) );
|
||||
vm.poplvalue();
|
||||
}
|
||||
STDOUT.println();
|
||||
vm.resettop();
|
||||
|
||||
@@ -321,7 +321,10 @@ public class LValue {
|
||||
baos.write(b,0,b.length);
|
||||
}
|
||||
|
||||
/** Return true if this is a LString */
|
||||
/** Return true if this is a lua string, meaning it is
|
||||
* either a LString or LNumber,since all numbers are
|
||||
* convertible to strings in lua
|
||||
*/
|
||||
public boolean isString() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -112,6 +112,10 @@ public class CompatibiltyTest extends ScriptDrivenTest {
|
||||
runTest("pcalls");
|
||||
}
|
||||
|
||||
public void testPrint() throws IOException, InterruptedException {
|
||||
runTest("print");
|
||||
}
|
||||
|
||||
public void testRequire() throws IOException, InterruptedException {
|
||||
runTest("require");
|
||||
}
|
||||
|
||||
26
src/test/res/print.lua
Normal file
26
src/test/res/print.lua
Normal file
@@ -0,0 +1,26 @@
|
||||
-- print uses tostring under-the-hood!
|
||||
|
||||
local function f()
|
||||
print()
|
||||
print('abc')
|
||||
print(123)
|
||||
print(true)
|
||||
print('abc',123,true)
|
||||
end
|
||||
|
||||
local function g()
|
||||
local fenv = {tostring=function(x)
|
||||
return '*'..type(x)..'*'
|
||||
end}
|
||||
package.seeall(fenv)
|
||||
f()
|
||||
print('setfenv', pcall(setfenv, 0, fenv), {}, f )
|
||||
f()
|
||||
end
|
||||
|
||||
local s,c = pcall( coroutine.create, g )
|
||||
print('create', s, s and type(c) or c)
|
||||
print('resume', pcall( coroutine.resume, c ) )
|
||||
f()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user