Module:LuaCall and Module:LuaCall/sandbox: Difference between pages

(Difference between pages)
Page 1
Page 2
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))}
    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
elseif not pfargs[2] then
else
pfargs[2], usedpargs[1] = pframe.args[1], true
if not pfargs[2] then
pfargs[2], usedpargs[1] = pframe.args[1], true
end
end
end
-- repack sequential args
-- repack sequential args