Skip to content

Commit

Permalink
fix: fix Promise free
Browse files Browse the repository at this point in the history
  • Loading branch information
LazuliKao committed Aug 5, 2023
1 parent 84d1cd5 commit fc57653
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 47 deletions.
4 changes: 2 additions & 2 deletions src/Modules/IO/DirectoryModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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,)
Expand Down Expand Up @@ -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,)
Expand Down
2 changes: 1 addition & 1 deletion src/Modules/IO/FileModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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,)
Expand Down
118 changes: 76 additions & 42 deletions src/QuickJS/Helper/JsPromiseHelper.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
using Hosihikari.Minecraft.Extension;
using Hosihikari.VanillaScript.QuickJS.Extensions;
using Hosihikari.VanillaScript.QuickJS.Types;
using Hosihikari.VanillaScript.QuickJS.Wrapper;

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),
Expand Down Expand Up @@ -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();
}
}
}
});
Expand All @@ -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();
}
}
}
});
Expand All @@ -102,7 +122,7 @@ public static void AwaitTask<T>(
JsValue thisObj,
(SafeJsValue resolve, SafeJsValue reject) promise,
Task<T> tasks,
Func<T, JsValue> fetchResult
Func<T, AutoDropJsValue> fetchResult
)
{
var safeThis = new SafeJsValue(thisObj, ctxPtr);
Expand All @@ -113,21 +133,28 @@ Func<T, JsValue> 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();
}
}
}
});
Expand All @@ -140,17 +167,24 @@ Func<T, JsValue> 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();
}
}
}
});
Expand Down
3 changes: 1 addition & 2 deletions src/QuickJS/Helper/JsValueCreateHelper.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
10 changes: 10 additions & 0 deletions src/QuickJS/Wrapper/AutoDropJsValue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit fc57653

Please sign in to comment.