@@ -288,7 +288,7 @@ function construct() {
288288 return value instanceof savedPromise;
289289 },
290290
291- onTaskWithResultCompleted : function (task, resolve, reject) {
291+ completePromiseWithResult : function (task, resolve, reject) {
292292 try {
293293 resolve(task.Result);
294294 }
@@ -297,7 +297,7 @@ function construct() {
297297 }
298298 },
299299
300- onTaskCompleted : function (task, resolve, reject) {
300+ completePromise : function (task, resolve, reject) {
301301 try {
302302 task.Wait();
303303 resolve();
@@ -1291,18 +1291,29 @@ internal override object MarshalToScript(object obj, HostItemFlags flags)
12911291
12921292 if ( engineFlags . HasFlag ( V8ScriptEngineFlags . EnableTaskPromiseConversion ) && ! bypassTaskPromiseConversion )
12931293 {
1294- if ( obj . GetType ( ) . IsAssignableToGenericType ( typeof ( Task < > ) , out var typeArgs ) )
1294+ // .NET Core async functions return Task subclass instances that trigger result wrapping
1295+
1296+ var testObject = obj ;
1297+ if ( testObject is HostObject testHostObject )
12951298 {
1296- using ( Scope . Create ( ( ) => bypassTaskPromiseConversion = true , ( ) => bypassTaskPromiseConversion = false ) )
1297- {
1298- obj = typeof ( TaskConverter < > ) . MakeSpecificType ( typeArgs ) . InvokeMember ( "ToPromise" , BindingFlags . InvokeMethod | BindingFlags . Public | BindingFlags . Static , null , null , new [ ] { obj , this } ) ;
1299- }
1299+ testObject = testHostObject . Target ;
13001300 }
1301- else if ( obj is Task task )
1301+
1302+ if ( testObject != null )
13021303 {
1303- using ( Scope . Create ( ( ) => bypassTaskPromiseConversion = true , ( ) => bypassTaskPromiseConversion = false ) )
1304+ if ( testObject . GetType ( ) . IsAssignableToGenericType ( typeof ( Task < > ) , out var typeArgs ) )
1305+ {
1306+ using ( Scope . Create ( ( ) => MiscHelpers . Exchange ( ref bypassTaskPromiseConversion , true ) , oldValue => bypassTaskPromiseConversion = oldValue ) )
1307+ {
1308+ obj = typeof ( TaskConverter < > ) . MakeSpecificType ( typeArgs ) . InvokeMember ( "ToPromise" , BindingFlags . InvokeMethod | BindingFlags . Public | BindingFlags . Static , null , null , new [ ] { testObject , this } ) ;
1309+ }
1310+ }
1311+ else if ( testObject is Task task )
13041312 {
1305- obj = task . ToPromise ( this ) ;
1313+ using ( Scope . Create ( ( ) => MiscHelpers . Exchange ( ref bypassTaskPromiseConversion , true ) , oldValue => bypassTaskPromiseConversion = oldValue ) )
1314+ {
1315+ obj = task . ToPromise ( this ) ;
1316+ }
13061317 }
13071318 }
13081319 }
@@ -1369,7 +1380,7 @@ internal override object MarshalToHost(object obj, bool preserveHostTarget)
13691380 var scriptItem = V8ScriptItem . Wrap ( this , obj ) ;
13701381 if ( engineFlags . HasFlag ( V8ScriptEngineFlags . EnableTaskPromiseConversion ) && ! bypassTaskPromiseConversion && ( obj is IV8Object v8Object ) && v8Object . IsPromise ( ) )
13711382 {
1372- using ( Scope . Create ( ( ) => bypassTaskPromiseConversion = true , ( ) => bypassTaskPromiseConversion = false ) )
1383+ using ( Scope . Create ( ( ) => MiscHelpers . Exchange ( ref bypassTaskPromiseConversion , true ) , oldValue => bypassTaskPromiseConversion = oldValue ) )
13731384 {
13741385 return scriptItem . ToTask ( ) ;
13751386 }
@@ -1494,6 +1505,22 @@ protected override void Dispose(bool disposing)
14941505
14951506 uint IJavaScriptEngine . BaseLanguageVersion => 8 ;
14961507
1508+ void IJavaScriptEngine . CompletePromiseWithResult < T > ( Task < T > task , object resolve , object reject )
1509+ {
1510+ using ( Scope . Create ( ( ) => MiscHelpers . Exchange ( ref bypassTaskPromiseConversion , true ) , oldValue => bypassTaskPromiseConversion = oldValue ) )
1511+ {
1512+ Script . EngineInternal . completePromiseWithResult ( task , resolve , reject ) ;
1513+ }
1514+ }
1515+
1516+ void IJavaScriptEngine . CompletePromise ( Task task , object resolve , object reject )
1517+ {
1518+ using ( Scope . Create ( ( ) => MiscHelpers . Exchange ( ref bypassTaskPromiseConversion , true ) , oldValue => bypassTaskPromiseConversion = oldValue ) )
1519+ {
1520+ Script . EngineInternal . completePromise ( task , resolve , reject ) ;
1521+ }
1522+ }
1523+
14971524 #endregion
14981525
14991526 #region unit test support
0 commit comments