private static void GetInfoAboutFunction(Table infoTable, DynValue function, string what, ScriptExecutionContext executionContext) { if (function.Type == DataType.Function) { Closure f = function.Function; var sourceRef = executionContext.GetFunctionSourceCodeRef(f); var source = executionContext.OwnerScript.GetSourceCode(sourceRef.SourceIdx); if (what.Contains("S")) { infoTable["source"] = source.Name; infoTable["short_src"] = source.Name.Substring(0, Math.Min(source.Name.Length, 60)); infoTable["what"] = "Lua"; } if (what.Contains("L")) { var lines = new Table(executionContext.OwnerScript); for (int i = sourceRef.FromLine; i <= sourceRef.ToLine; i++) { lines.Append(DynValue.NewString(source.Lines[i])); } infoTable["activelines"] = lines; } if (what.Contains("n")) { var name = executionContext.GetFunctionName(f); infoTable["name"] = name; var symbolRef = executionContext.FindSymbolByName(name); switch (symbolRef.Type) { case SymbolRefType.Global: infoTable["namewhat"] = "global"; break; case SymbolRefType.Local: infoTable["namewhat"] = "local"; break; case SymbolRefType.DefaultEnv: infoTable["namewhat"] = "field"; break; } } if (what.Contains("u")) { infoTable["nups"] = f.GetUpvaluesCount(); } infoTable["linedefined"] = sourceRef.FromLine; infoTable["lastlinedefined"] = sourceRef.ToLine; } else if (function.Type == DataType.ClrFunction) { CallbackFunction f = function.Callback; if (what.Contains("S")) { infoTable["source"] = "[C]"; infoTable["short_src"] = "[C]"; infoTable["what"] = "C"; } if (what.Contains("n")) { var symbolRef = executionContext.FindSymbolByName(f.Name); infoTable["name"] = f.Name; switch (symbolRef.Type) { case SymbolRefType.Global: infoTable["namewhat"] = "global"; break; case SymbolRefType.Local: infoTable["namewhat"] = "local"; break; case SymbolRefType.DefaultEnv: infoTable["namewhat"] = "field"; break; } } } }