2013-08-28 12 views
5

Ich versuche, ein Lua-Test-Framework, dass Sie die Funktion kennen, die das Problem hatte, aber wenn ich von Loadstring zu _G wechselte, (ich wechselte So konnte mein Testkabelbaum die Ergebnisse des Funktionsaufrufs sehen) Meine Funktionen begannen mit 'Null' für den FunktionsnamenWarum ist 'name' nil für debug.getinfo (1)

Warum kann _G den Namen der aktuellen Funktion im folgenden Code nicht erkennen? Wie kann ich die Ergebnisse von loadstring (dh die 'false' aus dem Blah-Aufruf) erhalten oder den Funktionsnamen bei Verwendung von _G setzen (dh dem Lua-Interpreter mitteilen, wie der Funktionsname lauten soll)?

function run_test(one, two) 
    if one ~= two then 
     print(debug.getinfo(2).name..' Failed') 
    end 
end 

function blah() 
    run_test(false, true) 
    return false 
end 

local fname = 'blah' 
local status, result = pcall(_G[fname]) -- Outputs 'nil'; result is 'false' 
local status, result = pcall(loadstring(fname..'()')) -- Outputs 'blah', result is 'nil' 

Die Hauptsache ich brauche, ist eine Möglichkeit, eine Funktion mit einer Zeichenfolge der Funktion Namen zu nennen, in der Lage sein, die Funktionsnamen innerhalb des Anrufs zu sehen (für Ausfälle Test auf die Funktion zu zeigen, wie gescheitert fname = ‚blah‘ im Code oben) und in der Lage sein, den Rückgabewert zu erhalten

local fname = 'blah' 
status, result = pcall(??Call fname somehow??) 
assert(status) 
assert(not result) 

--stdout should be "blah Failed" 
+0

Nur eine Vermutung, aber könnte es sein, weil 'pcall' in C land geht und Funktionswerte auf dem Stapel keinen zugehörigen symbolischen Namen in diesem Zusammenhang haben? – greatwolf

+0

Beide Linien verwenden pcall. Plus, es ist das Gegenteil von dem, was ich erwarten würde, da loadstring 'mehr' dynamisch ist als _G –

+0

ja, aber die zweite Zeile hat den Effekt, eine anonyme Funktion über 'blah' zu wickeln und das geht zurück nach lua land. – greatwolf

Antwort

4

Dies ist eine Einschränkung der von Lua verwendet Heuristiken Namen für Funktionen zur Verfügung zu stellen.

In Lua sind alle Funktionen anonym. Eine gegebene Funktion kann der Wert mehrerer Variablen sein: globale, lokale und Tabellenfelder. Das Lua-Debug-System versucht, einen vernünftigen Namen für einen Wert zu finden, der darauf basiert, woher es stammt, indem es in den Bytecode schaut, der ausgeführt wird.

Betrachten Sie das einfachere Beispiel

blah() 
pcall(blah) 

Im ersten Aufruf sieht das Debug-System, dass die Funktion stammt aus den globalen blah aufgerufen wird und debug.getinfo(1).name gibt das erwartete Ergebnis, blah.

Im zweiten Aufruf sieht die Debug-System, dass die Funktion zu pcall stammt aus dem ersten Argument aufgerufen wird, aber es sieht nicht weiter zu sehen, wo das Argument herkam, und debug.getinfo(1).name gibt nil.

Das gleiche passiert, wenn Sie _G[name]() aufrufen. Das ganze Debugsystem sieht ein Feld einer Tabelle und der Name des Feldes ist zu weit entfernt.

Versuchen Sie, print(debug.traceback()) als die erste Zeile von blah hinzuzufügen, um eine andere Einstellung zu dieser Erklärung zu sehen.

+0

Irgendwelche Ideen zu meiner zweiten Frage? –

+0

@solarmist Beziehen Sie sich auf die Frage, wie Sie die Ergebnisse zurück erhalten? Willst du zurückkommen, was auch immer 'blah' zurückkommt? – greatwolf

+0

Ja, zurück, was 'blah' zurückkommt oder einen Namen für den _G Anruf vortäuscht. –