private static int _PcallErrorHandler(IntPtr L) { var lua = GetCLRReferenceUpvalue(L, 1) as LuaState; Exception inner = null; string msg = "An error occured while executing a Lua function"; object value = null; var obj = lua.ToCLR(); if (obj is Exception) { inner = (Exception)obj; } else if (obj is String) { msg = (String)obj; } else { msg = obj.ToString(); value = obj; } lua.Pop(); var trace = lua.TracebackArray(); var ex = new LuaException(msg, trace, value, inner); // the first line is always Environment.get_StackTrace ex.StackTraceOverride = string.Join("\n", Environment.StackTrace.Split('\n').Skip(1).ToArray()); lua.Push(ex); return(1); }
private void _LoadErrorMechanism() { string code; using (var s = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("ErrorMechanism.lua"), Encoding.UTF8)) { code = s.ReadToEnd(); } LoadBuffer("MicroLua", code); if (VoidProtCall(0) != LuaResult.OK) { var ex = new LuaException(ToString()); Pop(); throw ex; } GetGlobal("microlua_make_call_wrapper"); _MicroLuaMakeCallWrapperRef = MakeLuaReference(); Pop(); GetGlobal("debug"); GetField("traceback"); _DebugTracebackRef = MakeLuaReference(); Pop(2); }