mirror of https://github.com/rusefi/lua.git
_PROMPT can have non-string values
'get_prompt' uses 'luaL_tolstring' to convert _PROMPT or _PROMPT2 value to a string. That conversion may invoke a '__tostring' metamethod.
This commit is contained in:
parent
d742a193e5
commit
69b71a6919
14
lua.c
14
lua.c
|
@ -416,14 +416,18 @@ static int handle_luainit (lua_State *L) {
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Returns the string to be used as a prompt by the interpreter.
|
** Return the string to be used as a prompt by the interpreter. Leave
|
||||||
|
** the string (or nil, if using the default value) on the stack, to keep
|
||||||
|
** it anchored.
|
||||||
*/
|
*/
|
||||||
static const char *get_prompt (lua_State *L, int firstline) {
|
static const char *get_prompt (lua_State *L, int firstline) {
|
||||||
const char *p;
|
if (lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2") == LUA_TNIL)
|
||||||
lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2");
|
return (firstline ? LUA_PROMPT : LUA_PROMPT2); /* use the default */
|
||||||
p = lua_tostring(L, -1);
|
else { /* apply 'tostring' over the value */
|
||||||
if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2);
|
const char *p = luaL_tolstring(L, -1, NULL);
|
||||||
|
lua_remove(L, -2); /* remove original value */
|
||||||
return p;
|
return p;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mark in error messages for incomplete statements */
|
/* mark in error messages for incomplete statements */
|
||||||
|
|
|
@ -287,6 +287,33 @@ RUN([[lua "-e_PROMPT='%s'" -i < %s > %s]], prompt, prog, out)
|
||||||
local t = getoutput()
|
local t = getoutput()
|
||||||
assert(string.find(t, prompt .. ".*" .. prompt .. ".*" .. prompt))
|
assert(string.find(t, prompt .. ".*" .. prompt .. ".*" .. prompt))
|
||||||
|
|
||||||
|
-- using the prompt default
|
||||||
|
prepfile[[ --
|
||||||
|
a = 2
|
||||||
|
]]
|
||||||
|
RUN([[lua -i < %s > %s]], prog, out)
|
||||||
|
local t = getoutput()
|
||||||
|
prompt = "> " -- the default
|
||||||
|
assert(string.find(t, prompt .. ".*" .. prompt .. ".*" .. prompt))
|
||||||
|
|
||||||
|
|
||||||
|
-- non-string prompt
|
||||||
|
prompt =
|
||||||
|
"local C = 0;\z
|
||||||
|
_PROMPT=setmetatable({},{__tostring = function () \z
|
||||||
|
C = C + 1; return C end})"
|
||||||
|
prepfile[[ --
|
||||||
|
a = 2
|
||||||
|
]]
|
||||||
|
RUN([[lua -e "%s" -i < %s > %s]], prompt, prog, out)
|
||||||
|
local t = getoutput()
|
||||||
|
assert(string.find(t, [[
|
||||||
|
1 --
|
||||||
|
2a = 2
|
||||||
|
3
|
||||||
|
]], 1, true))
|
||||||
|
|
||||||
|
|
||||||
-- test for error objects
|
-- test for error objects
|
||||||
prepfile[[
|
prepfile[[
|
||||||
debug = require "debug"
|
debug = require "debug"
|
||||||
|
|
Loading…
Reference in New Issue