@@ -430,6 +430,7 @@ namespace Js
430430 generatorFunctionPrototype = nullptr ;
431431 generatorPrototype = nullptr ;
432432 iteratorPrototype = nullptr ;
433+ asyncFunctionPrototype = nullptr ;
433434
434435 if (scriptContext->GetConfig ()->IsES6SymbolEnabled ())
435436 {
@@ -520,6 +521,13 @@ namespace Js
520521 DynamicType::New (scriptContext, TypeIds_Object, proto, nullptr ,
521522 DeferredTypeHandler<InitializeGeneratorPrototype>::GetDefaultInstance ()));
522523 }
524+
525+ if (scriptContext->GetConfig ()->IsES7AsyncAndAwaitEnabled ())
526+ {
527+ asyncFunctionPrototype = DynamicObject::New (recycler,
528+ DynamicType::New (scriptContext, TypeIds_Object, functionPrototype, nullptr ,
529+ DeferredTypeHandler<InitializeAsyncFunctionPrototype>::GetDefaultInstance ()));
530+ }
523531 }
524532
525533 void JavascriptLibrary::InitializeTypes ()
@@ -975,19 +983,21 @@ namespace Js
975983 return functionTypeHandler;
976984 }
977985
978- DynamicTypeHandler * JavascriptLibrary::ScriptFunctionTypeHandler (bool hasPrototype , bool isAnonymousFunction)
986+ DynamicTypeHandler * JavascriptLibrary::ScriptFunctionTypeHandler (bool noPrototypeProperty , bool isAnonymousFunction)
979987 {
980988 DynamicTypeHandler * scriptFunctionTypeHandler = nullptr ;
981989
982- if (hasPrototype )
990+ if (noPrototypeProperty )
983991 {
984992 scriptFunctionTypeHandler = isAnonymousFunction ?
985- this ->GetDeferredAnonymousFunctionTypeHandler () : this ->GetDeferredFunctionTypeHandler ();
993+ this ->GetDeferredAnonymousFunctionTypeHandler () :
994+ this ->GetDeferredFunctionTypeHandler ();
986995 }
987996 else
988997 {
989998 scriptFunctionTypeHandler = isAnonymousFunction ?
990- JavascriptLibrary::GetDeferredAnonymousPrototypeFunctionTypeHandler () : JavascriptLibrary::GetDeferredPrototypeFunctionTypeHandler (scriptContext);
999+ JavascriptLibrary::GetDeferredAnonymousPrototypeFunctionTypeHandler () :
1000+ JavascriptLibrary::GetDeferredPrototypeFunctionTypeHandler (scriptContext);
9911001 }
9921002 return scriptFunctionTypeHandler;
9931003 }
@@ -1143,6 +1153,7 @@ namespace Js
11431153 stringTypeDisplayString = CreateStringFromCppLiteral (L" string" );
11441154 functionPrefixString = CreateStringFromCppLiteral (L" function " );
11451155 generatorFunctionPrefixString = CreateStringFromCppLiteral (L" function* " );
1156+ asyncFunctionPrefixString = CreateStringFromCppLiteral (L" async function " );
11461157 functionDisplayString = CreateStringFromCppLiteral (JS_DISPLAY_STRING_FUNCTION_ANONYMOUS);
11471158 xDomainFunctionDisplayString = CreateStringFromCppLiteral (L" \012 function anonymous() {\012 [x-domain code]\012 }\012 " );
11481159 invalidDateString = CreateStringFromCppLiteral (L" Invalid Date" );
@@ -1474,6 +1485,7 @@ namespace Js
14741485 weakMapConstructor = nullptr ;
14751486 weakSetConstructor = nullptr ;
14761487 generatorFunctionConstructor = nullptr ;
1488+ asyncFunctionConstructor = nullptr ;
14771489
14781490 if (scriptContext->GetConfig ()->IsES6MapEnabled ())
14791491 {
@@ -1511,6 +1523,14 @@ namespace Js
15111523 // GeneratorFunction is not a global property by ES6 spec so don't add it to the global object
15121524 }
15131525
1526+ if (scriptContext->GetConfig ()->IsES7AsyncAndAwaitEnabled ())
1527+ {
1528+ asyncFunctionConstructor = CreateBuiltinConstructor (&JavascriptFunction::EntryInfo::NewAsyncFunctionInstance,
1529+ DeferredTypeHandler<InitializeAsyncFunctionConstructor>::GetDefaultInstance (),
1530+ functionConstructor);
1531+ // AsyncFunction is not a global property by ES7 spec so don't add it to the global object
1532+ }
1533+
15141534 errorConstructor = CreateBuiltinConstructor (&JavascriptError::EntryInfo::NewErrorInstance,
15151535 DeferredTypeHandler<InitializeErrorConstructor>::GetDefaultInstance ());
15161536 AddFunction (globalObject, PropertyIds::Error, errorConstructor);
@@ -2260,8 +2280,6 @@ namespace Js
22602280 void JavascriptLibrary::InitializeGeneratorFunctionConstructor (DynamicObject* generatorFunctionConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode)
22612281 {
22622282 typeHandler->Convert (generatorFunctionConstructor, mode, 3 );
2263- // Note: Any new function addition/deletion/modification should also be updated in JavascriptLibrary::ProfilerRegisterGeneratorFunction
2264- // so that the update is in sync with profiler
22652283 JavascriptLibrary* library = generatorFunctionConstructor->GetLibrary ();
22662284 ScriptContext* scriptContext = generatorFunctionConstructor->GetScriptContext ();
22672285 library->AddMember (generatorFunctionConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked (1 ), PropertyConfigurable);
@@ -2276,8 +2294,6 @@ namespace Js
22762294 void JavascriptLibrary::InitializeGeneratorFunctionPrototype (DynamicObject* generatorFunctionPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode)
22772295 {
22782296 typeHandler->Convert (generatorFunctionPrototype, mode, 3 );
2279- // Note: Any new function addition/deletion/modification should also be updated in JavascriptLibrary::ProfilerRegisterGeneratorFunction
2280- // so that the update is in sync with profiler
22812297 JavascriptLibrary* library = generatorFunctionPrototype->GetLibrary ();
22822298 ScriptContext* scriptContext = library->GetScriptContext ();
22832299
@@ -2310,6 +2326,34 @@ namespace Js
23102326 generatorPrototype->SetHasNoEnumerableProperties (true );
23112327 }
23122328
2329+ void JavascriptLibrary::InitializeAsyncFunctionConstructor (DynamicObject* asyncFunctionConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode)
2330+ {
2331+ typeHandler->Convert (asyncFunctionConstructor, mode, 3 );
2332+ JavascriptLibrary* library = asyncFunctionConstructor->GetLibrary ();
2333+ ScriptContext* scriptContext = asyncFunctionConstructor->GetScriptContext ();
2334+ library->AddMember (asyncFunctionConstructor, PropertyIds::length, TaggedInt::ToVarUnchecked (1 ), PropertyConfigurable);
2335+ library->AddMember (asyncFunctionConstructor, PropertyIds::prototype, library->asyncFunctionPrototype , PropertyNone);
2336+ if (scriptContext->GetConfig ()->IsES6FunctionNameEnabled ())
2337+ {
2338+ library->AddMember (asyncFunctionConstructor, PropertyIds::name, library->CreateStringFromCppLiteral (L" AsyncFunction" ), PropertyConfigurable);
2339+ }
2340+ asyncFunctionConstructor->SetHasNoEnumerableProperties (true );
2341+ }
2342+
2343+ void JavascriptLibrary::InitializeAsyncFunctionPrototype (DynamicObject* asyncFunctionPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode)
2344+ {
2345+ typeHandler->Convert (asyncFunctionPrototype, mode, 2 );
2346+ JavascriptLibrary* library = asyncFunctionPrototype->GetLibrary ();
2347+ ScriptContext* scriptContext = library->GetScriptContext ();
2348+
2349+ library->AddMember (asyncFunctionPrototype, PropertyIds::constructor, library->asyncFunctionConstructor , PropertyConfigurable);
2350+ if (scriptContext->GetConfig ()->IsES6ToStringTagEnabled ())
2351+ {
2352+ library->AddMember (asyncFunctionPrototype, PropertyIds::_symbolToStringTag, library->CreateStringFromCppLiteral (L" AsyncFunction" ), PropertyConfigurable);
2353+ }
2354+ asyncFunctionPrototype->SetHasNoEnumerableProperties (true );
2355+ }
2356+
23132357 void JavascriptLibrary::InitializeProxyConstructor (DynamicObject* proxyConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode)
23142358 {
23152359 typeHandler->Convert (proxyConstructor, mode, 4 );
@@ -3075,6 +3119,7 @@ namespace Js
30753119 this ->promiseConstructor ,
30763120 this ->proxyConstructor ,
30773121 this ->generatorFunctionConstructor ,
3122+ this ->asyncFunctionConstructor ,
30783123 this ->errorConstructor ,
30793124 this ->evalErrorConstructor ,
30803125 this ->rangeErrorConstructor ,
0 commit comments