private static DynValue SetErrorHandlerStrategy(string funcName, ScriptExecutionContext executionContext, CallbackArguments args, DynValue handlerBeforeUnwind) { var v = args[0]; var a = new DynValue[args.Count - 1]; for (var i = 1; i < args.Count; i++) a[i - 1] = args[i]; if (args[0].Type == DataType.ClrFunction) { try { var ret = args[0].Callback.Invoke(executionContext, a); if (ret.Type == DataType.TailCallRequest) { if (ret.TailCallData.Continuation != null || ret.TailCallData.ErrorHandler != null) throw new ScriptRuntimeException( "the function passed to {0} cannot be called directly by {0}. wrap in a script function instead.", funcName); return DynValue.NewTailCallReq(new TailCallData { Args = ret.TailCallData.Args, Function = ret.TailCallData.Function, Continuation = new CallbackFunction(pcall_continuation, funcName), ErrorHandler = new CallbackFunction(pcall_onerror, funcName), ErrorHandlerBeforeUnwind = handlerBeforeUnwind }); } if (ret.Type == DataType.YieldRequest) { throw new ScriptRuntimeException( "the function passed to {0} cannot be called directly by {0}. wrap in a script function instead.", funcName); } return DynValue.NewTupleNested(DynValue.True, ret); } catch (ScriptRuntimeException ex) { executionContext.PerformMessageDecorationBeforeUnwind(handlerBeforeUnwind, ex); return DynValue.NewTupleNested(DynValue.False, DynValue.NewString(ex.DecoratedMessage)); } } if (args[0].Type != DataType.Function) { return DynValue.NewTupleNested(DynValue.False, DynValue.NewString("attempt to " + funcName + " a non-function")); } return DynValue.NewTailCallReq(new TailCallData { Args = a, Function = v, Continuation = new CallbackFunction(pcall_continuation, funcName), ErrorHandler = new CallbackFunction(pcall_onerror, funcName), ErrorHandlerBeforeUnwind = handlerBeforeUnwind }); }
private static DynValue SetErrorHandlerStrategy(string funcName, ScriptExecutionContext executionContext, CallbackArguments args, DynValue handlerBeforeUnwind) { DynValue v = args[0]; DynValue[] a = new DynValue[args.Count - 1]; for (int i = 1; i < args.Count; i++) { a[i - 1] = args[i]; } if (args[0].Type == DataType.ClrFunction) { try { DynValue ret = args[0].Callback.Invoke(executionContext, a); if (ret.Type == DataType.TailCallRequest) { if (ret.TailCallData.Continuation != null || ret.TailCallData.ErrorHandler != null) { throw new ScriptRuntimeException("the function passed to {0} cannot be called directly by {0}. wrap in a script function instead.", funcName); } return(DynValue.NewTailCallReq(new TailCallData() { Args = ret.TailCallData.Args, Function = ret.TailCallData.Function, Continuation = new CallbackFunction(pcall_continuation, funcName), ErrorHandler = new CallbackFunction(pcall_onerror, funcName), ErrorHandlerBeforeUnwind = handlerBeforeUnwind })); } else if (ret.Type == DataType.YieldRequest) { throw new ScriptRuntimeException("the function passed to {0} cannot be called directly by {0}. wrap in a script function instead.", funcName); } else { return(DynValue.NewTupleNested(DynValue.True, ret)); } } catch (ScriptRuntimeException ex) { executionContext.PerformMessageDecorationBeforeUnwind(handlerBeforeUnwind, ex); return(DynValue.NewTupleNested(DynValue.False, DynValue.NewString(ex.DecoratedMessage))); } } else if (args[0].Type != DataType.Function) { return(DynValue.NewTupleNested(DynValue.False, DynValue.NewString("attempt to " + funcName + " a non-function"))); } else { return(DynValue.NewTailCallReq(new TailCallData() { Args = a, Function = v, Continuation = new CallbackFunction(pcall_continuation, funcName), ErrorHandler = new CallbackFunction(pcall_onerror, funcName), ErrorHandlerBeforeUnwind = handlerBeforeUnwind })); } }