From fc576539c94479bf566841fcd449049151504462 Mon Sep 17 00:00:00 2001 From: LazuliKao Date: Sat, 5 Aug 2023 18:23:10 +0800 Subject: [PATCH] fix: fix Promise free --- src/Modules/IO/DirectoryModule.cs | 4 +- src/Modules/IO/FileModule.cs | 2 +- src/QuickJS/Helper/JsPromiseHelper.cs | 118 ++++++++++++++-------- src/QuickJS/Helper/JsValueCreateHelper.cs | 3 +- src/QuickJS/Wrapper/AutoDropJsValue.cs | 10 ++ 5 files changed, 90 insertions(+), 47 deletions(-) diff --git a/src/Modules/IO/DirectoryModule.cs b/src/Modules/IO/DirectoryModule.cs index 38c97b2..dd3520f 100644 --- a/src/Modules/IO/DirectoryModule.cs +++ b/src/Modules/IO/DirectoryModule.cs @@ -66,7 +66,7 @@ static JsValue GetFiles( thisObj, (resolve, reject), Task.Run(() => Directory.GetFiles(directory)), - result => JsValueCreateHelper.NewArray(ctx, result).Steal() + result => JsValueCreateHelper.NewArray(ctx, result) ); return promise.Steal(); //Native.JS_Call(ctx, resolve, safeThis.Instance,) @@ -107,7 +107,7 @@ static JsValue GetDirectories( thisObj, (resolve, reject), Task.Run(() => Directory.GetDirectories(directory)), - result => JsValueCreateHelper.NewArray(ctx, result).Steal() + result => JsValueCreateHelper.NewArray(ctx, result) ); return promise.Steal(); //Native.JS_Call(ctx, resolve, safeThis.Instance,) diff --git a/src/Modules/IO/FileModule.cs b/src/Modules/IO/FileModule.cs index 40474e1..e9c15d0 100644 --- a/src/Modules/IO/FileModule.cs +++ b/src/Modules/IO/FileModule.cs @@ -66,7 +66,7 @@ static JsValue FileReadAllText( thisObj, (resolve, reject), File.ReadAllTextAsync(file), - result => JsValueCreateHelper.NewString(ctx, result).Steal() + result => JsValueCreateHelper.NewString(ctx, result) ); return promise.Steal(); //Native.JS_Call(ctx, resolve, safeThis.Instance,) diff --git a/src/QuickJS/Helper/JsPromiseHelper.cs b/src/QuickJS/Helper/JsPromiseHelper.cs index 6a29be7..d01af44 100644 --- a/src/QuickJS/Helper/JsPromiseHelper.cs +++ b/src/QuickJS/Helper/JsPromiseHelper.cs @@ -1,5 +1,4 @@ using Hosihikari.Minecraft.Extension; -using Hosihikari.VanillaScript.QuickJS.Extensions; using Hosihikari.VanillaScript.QuickJS.Types; using Hosihikari.VanillaScript.QuickJS.Wrapper; @@ -7,11 +6,14 @@ namespace Hosihikari.VanillaScript.QuickJS.Helper; public static class JsPromiseHelper { - internal static JsValue BuildErrorJsValue(this JsContextWrapper ctx, Exception exception) + internal static AutoDropJsValue BuildErrorJsValue( + this JsContextWrapper ctx, + Exception exception + ) { unsafe { - var errorObj = JsValueCreateHelper.NewError(ctx.Context).Steal(); + var errorObj = JsValueCreateHelper.NewError(ctx.Context); /* JS_DefinePropertyValue(ctx, obj, JS_ATOM_message, JS_NewString(ctx, buf), @@ -53,13 +55,22 @@ Task tasks { if (JsContextWrapper.TryGet(ctxPtr, out var ctx)) { - Native.JS_Call( - ctx.Context, - promise.resolve.Instance, - safeThis.Instance, - 0, - null - ); + try + { + using var callResult = Native.JS_Call( + ctx.Context, + promise.resolve.Instance, + safeThis.Instance, + 0, + null + ); + } + finally + { + safeThis.FreeThis(); + promise.resolve.FreeThis(); + promise.reject.FreeThis(); + } } } }); @@ -68,19 +79,28 @@ Task tasks { LevelTick.PostTick(() => { - var reason = ex.ToString(); unsafe { if (JsContextWrapper.TryGet(ctxPtr, out var ctx)) { - var reasonObj = ctx.BuildErrorJsValue(ex); - Native.JS_Call( - ctx.Context, - promise.reject.Instance, - safeThis.Instance, - 1, - &reasonObj - ); + try + { + using var reasonObj = ctx.BuildErrorJsValue(ex); + var reasonValue = reasonObj.Value; + using var callResult = Native.JS_Call( + ctx.Context, + promise.reject.Instance, + safeThis.Instance, + 1, + &reasonValue + ); + } + finally + { + safeThis.FreeThis(); + promise.resolve.FreeThis(); + promise.reject.FreeThis(); + } } } }); @@ -102,7 +122,7 @@ public static void AwaitTask( JsValue thisObj, (SafeJsValue resolve, SafeJsValue reject) promise, Task tasks, - Func fetchResult + Func fetchResult ) { var safeThis = new SafeJsValue(thisObj, ctxPtr); @@ -113,21 +133,28 @@ Func fetchResult var result = await tasks.ConfigureAwait(false); LevelTick.PostTick(() => { - var resultObj = fetchResult(result); + using var resultObj = fetchResult(result); + var resultValue = resultObj.Value; unsafe { if (JsContextWrapper.TryGet(ctxPtr, out var ctx)) { - Native.JS_Call( - ctx.Context, - promise.resolve.Instance, - safeThis.Instance, - 1, - &resultObj - ); - safeThis.FreeThis(); - promise.resolve.FreeThis(); - promise.reject.FreeThis(); + try + { + using var callResult = Native.JS_Call( + ctx.Context, + promise.resolve.Instance, + safeThis.Instance, + 1, + &resultValue + ); + } + finally + { + safeThis.FreeThis(); + promise.resolve.FreeThis(); + promise.reject.FreeThis(); + } } } }); @@ -140,17 +167,24 @@ Func fetchResult { if (JsContextWrapper.TryGet(ctxPtr, out var ctx)) { - var reasonObj = ctx.BuildErrorJsValue(ex); - Native.JS_Call( - ctx.Context, - promise.reject.Instance, - safeThis.Instance, - 1, - &reasonObj - ); - safeThis.FreeThis(); - promise.resolve.FreeThis(); - promise.reject.FreeThis(); + try + { + using var reasonObj = ctx.BuildErrorJsValue(ex); + var reasonValue = reasonObj.Value; + using var callResult = Native.JS_Call( + ctx.Context, + promise.reject.Instance, + safeThis.Instance, + 1, + &reasonValue + ); + } + finally + { + safeThis.FreeThis(); + promise.resolve.FreeThis(); + promise.reject.FreeThis(); + } } } }); diff --git a/src/QuickJS/Helper/JsValueCreateHelper.cs b/src/QuickJS/Helper/JsValueCreateHelper.cs index 178ef1c..fb597b0 100644 --- a/src/QuickJS/Helper/JsValueCreateHelper.cs +++ b/src/QuickJS/Helper/JsValueCreateHelper.cs @@ -1,7 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using Hosihikari.VanillaScript.Hook.QuickJS; using Hosihikari.VanillaScript.QuickJS.Types; using Hosihikari.VanillaScript.QuickJS.Wrapper; using Hosihikari.VanillaScript.QuickJS.Wrapper.ClrProxy; @@ -131,7 +130,7 @@ public static unsafe AutoDropJsValue New(object? val, JsContext* ctx, JsValue th thisObj, (resolve, reject), ConvertTaskAsync(task), - result => New(result, ctx, thisObj).Steal() + result => New(result, ctx, thisObj) ); return promise; } diff --git a/src/QuickJS/Wrapper/AutoDropJsValue.cs b/src/QuickJS/Wrapper/AutoDropJsValue.cs index 9b7bb90..b388635 100644 --- a/src/QuickJS/Wrapper/AutoDropJsValue.cs +++ b/src/QuickJS/Wrapper/AutoDropJsValue.cs @@ -116,6 +116,16 @@ public string ToJson() } } + public unsafe bool DefineProperty( + JsContext* ctx, + JsAtom propertyAtom, + JsValue value, + JsPropertyFlags flags = JsPropertyFlags.CWE + ) + { + return _value.DefineProperty(ctx, propertyAtom, value, flags); + } + public void DefineProperty( JsContextWrapper ctx, string exists,