Skip to content

Commit ed99187

Browse files
committed
1. Prevented a occurrence of the access violation exception during setting of the promise continuation callback;
2. Improved a unit tests to check the execution of promises.
1 parent ae003e6 commit ed99187

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

src/JavaScriptEngineSwitcher.ChakraCore/ChakraCoreJsEngine.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ public sealed class ChakraCoreJsEngine : JsEngineBase
6161
/// </summary>
6262
private JsObjectFinalizeCallback _externalObjectFinalizeCallback;
6363

64+
/// <summary>
65+
/// Callback for continuation of promise
66+
/// </summary>
67+
private JsPromiseContinuationCallback _promiseContinuationCallback;
68+
6469
/// <summary>
6570
/// List of native function callbacks
6671
/// </summary>
@@ -125,6 +130,7 @@ public ChakraCoreJsEngine(ChakraCoreSettings settings)
125130
}
126131

127132
_externalObjectFinalizeCallback = ExternalObjectFinalizeCallback;
133+
_promiseContinuationCallback = PromiseContinuationCallback;
128134

129135
_dispatcher.Invoke(() =>
130136
{
@@ -209,7 +215,7 @@ private JsScope CreateJsScope()
209215

210216
var jsScope = new JsScope(_jsContext);
211217

212-
JsRuntime.SetPromiseContinuationCallback(PromiseContinuationCallback, IntPtr.Zero);
218+
JsRuntime.SetPromiseContinuationCallback(_promiseContinuationCallback, IntPtr.Zero);
213219

214220
return jsScope;
215221
}
@@ -1349,6 +1355,7 @@ private void Dispose(bool disposing)
13491355
_nativeFunctions.Clear();
13501356
}
13511357

1358+
_promiseContinuationCallback = null;
13521359
_externalObjectFinalizeCallback = null;
13531360
}
13541361
}

test/JavaScriptEngineSwitcher.Tests/Es2015TestsBase.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,43 @@ public abstract class Es2015TestsBase : TestsBase
1212
public virtual void ExecutionOfPromisesIsCorrect()
1313
{
1414
// Arrange
15-
var sb = new StringBuilder();
15+
var stringBuilder = new StringBuilder();
1616
const string input = @"var successfulWork = new Promise(function(resolve, reject) {
17-
resolve(""Resolved promise from JavaScript"");
17+
resolve(""Success!"");
1818
});
1919
2020
var unsuccessfulWork = new Promise(function (resolve, reject) {
21-
reject(""Rejected promise from JavaScript"");
21+
reject(""Fail!"");
2222
});
2323
2424
function resolveCallback(result) {
25-
console.AppendLine('Resolved: ' + result);
25+
stringBuilder.AppendLine('Resolved: ' + result);
2626
}
2727
2828
function rejectCallback(reason) {
29-
console.AppendLine('Rejected: ' + reason);
29+
stringBuilder.AppendLine('Rejected: ' + reason);
3030
}
3131
3232
successfulWork.then(resolveCallback, rejectCallback);
3333
unsuccessfulWork.then(resolveCallback, rejectCallback);";
34+
const string targetOutput = @"Resolved: Success!
35+
Rejected: Fail!
36+
";
3437

3538
// Act
39+
string output;
40+
3641
using (var jsEngine = CreateJsEngine())
3742
{
38-
jsEngine.EmbedHostObject("sb", sb);
43+
jsEngine.EmbedHostObject("stringBuilder", stringBuilder);
3944
jsEngine.Execute(input);
45+
46+
output = stringBuilder.ToString();
47+
stringBuilder.Clear();
4048
}
4149

4250
// Assert
51+
Assert.Equal(targetOutput, output);
4352
}
4453

4554
#endregion

0 commit comments

Comments
 (0)