Module:LuaCall and Module:LuaCall/sandbox: Difference between pages
(Difference between pages)
imported>Lemondoge m Modified code formatting |
convert "invoke" to do a true #invoke off the parent frame instead of mangling the frame args and attempting to emulate a #invoke as the emulation is error prone and can easily be detected |
||
Line 2: | Line 2: | ||
function p.main(frame) | function p.main(frame) | ||
local parent = frame.getParent(frame) or {} | local parent=frame.getParent(frame) or {} | ||
local reserved_value = {} | local reserved_value={} | ||
local reserved_function, reserved_contents | local reserved_function,reserved_contents | ||
for k, v in pairs(parent.args or {}) do | for k,v in pairs(parent.args or {}) do | ||
_G[k] = tonumber(v) or v -- transfer every parameter directly to the global variable table | _G[k]=tonumber(v) or v -- transfer every parameter directly to the global variable table | ||
end | end | ||
for k, v in pairs(frame.args or {}) do | for k,v in pairs(frame.args or {}) do | ||
_G[k] = tonumber(v) or v -- transfer every parameter directly to the global variable table | _G[k]=tonumber(v) or v -- transfer every parameter directly to the global variable table | ||
end | end | ||
--- Alas Scribunto does NOT implement coroutines, according to | --- Alas Scribunto does NOT implement coroutines, according to | ||
Line 15: | Line 15: | ||
--- this will not stop us from trying to implement one single lousy function call | --- this will not stop us from trying to implement one single lousy function call | ||
if _G[1] then | if _G[1] then | ||
reserved_function, reserved_contents = mw.ustring.match(_G[1], "^%s*(%a[^%s%(]*)%(([^%)]*)%)%s*$") | reserved_function,reserved_contents=mw.ustring.match(_G[1],"^%s*(%a[^%s%(]*)%(([^%)]*)%)%s*$") | ||
end | end | ||
if reserved_contents then | if reserved_contents then | ||
local reserved_counter = 0 | local reserved_counter=0 | ||
repeat | repeat | ||
reserved_counter = reserved_counter + 1 | reserved_counter=reserved_counter+1 | ||
reserved_value[reserved_counter] = _G[mw.ustring.match(reserved_contents, "([^%,]+)")] | reserved_value[reserved_counter]=_G[mw.ustring.match(reserved_contents,"([^%,]+)")] | ||
reserved_contents = mw.ustring.match(reserved_contents, "[^%,]+,(.*)$") | reserved_contents=mw.ustring.match(reserved_contents,"[^%,]+,(.*)$") | ||
until not reserved_contents | until not reserved_contents | ||
end | end | ||
local reserved_arraypart = _G | local reserved_arraypart=_G | ||
while mw.ustring.match(reserved_function, "%.") do | while mw.ustring.match(reserved_function,"%.") do | ||
reserved_functionpart, reserved_function = mw.ustring.match(reserved_function, "^(%a[^%.]*)%.(.*)$") | reserved_functionpart,reserved_function=mw.ustring.match(reserved_function,"^(%a[^%.]*)%.(.*)$") | ||
reserved_arraypart = reserved_arraypart[reserved_functionpart] | reserved_arraypart=reserved_arraypart[reserved_functionpart] | ||
end | end | ||
local reserved_call = reserved_arraypart[reserved_function] | local reserved_call=reserved_arraypart[reserved_function] | ||
if type(reserved_call) ~= "function" then | if type(reserved_call)~="function" then | ||
return tostring(reserved_call) | return tostring(reserved_call) | ||
else | else reserved_output={reserved_call(unpack(reserved_value))} | ||
return reserved_output[reserved_return or 1] | return reserved_output[reserved_return or 1] | ||
end | end | ||
Line 153: | Line 152: | ||
pfargs[2], usedpargs[2] = pframe.args[2], true | pfargs[2], usedpargs[2] = pframe.args[2], true | ||
end | end | ||
else | |||
if not pfargs[2] then | |||
pfargs[2], usedpargs[1] = pframe.args[1], true | |||
end | |||
end | end | ||
-- repack sequential args | -- repack sequential args |