private async void _Pending(Task task, ScriptContext context, JSValue[] resolving_funcs) { var safeRelease = new SafeRelease(context).Append(resolving_funcs); await task; if (!context.IsValid()) { return; } object result = null; var taskType = task.GetType(); if (taskType.IsGenericType && taskType.GetGenericTypeDefinition() == typeof(Task <>)) { try { result = taskType.GetProperty("Result").GetValue(task); } catch (Exception exception) { context.GetLogger()?.WriteException(exception); } } var ctx = (JSContext)context; var backVal = Binding.Values.js_push_classvalue(ctx, result); if (backVal.IsException()) { ctx.print_exception(); safeRelease.Release(); return; } var argv = new[] { backVal }; var rval = JSApi.JS_Call(ctx, resolving_funcs[0], JSApi.JS_UNDEFINED, 1, argv); JSApi.JS_FreeValue(ctx, backVal); if (rval.IsException()) { ctx.print_exception(); safeRelease.Release(); return; } JSApi.JS_FreeValue(ctx, rval); safeRelease.Release(); context.GetRuntime().ExecutePendingJob(); }
private IEnumerator _Pending(IEnumerator enumerator, ScriptContext context, JSValue[] resolving_funcs) { var safeRelease = new SafeRelease(context).Append(resolving_funcs); while (enumerator.MoveNext()) { var current = enumerator.Current; if (current is YieldInstruction) { yield return(current); } yield return(null); } if (!context.IsValid()) { yield break; } var ctx = (JSContext)context; var backVal = Binding.Values.js_push_var(ctx, enumerator.Current); if (backVal.IsException()) { ctx.print_exception(); safeRelease.Release(); yield break; } var argv = new[] { backVal }; var rval = JSApi.JS_Call(ctx, resolving_funcs[0], JSApi.JS_UNDEFINED, 1, argv); JSApi.JS_FreeValue(ctx, backVal); if (rval.IsException()) { ctx.print_exception(); safeRelease.Release(); yield break; } JSApi.JS_FreeValue(ctx, rval); safeRelease.Release(); context.GetRuntime().ExecutePendingJob(); }