@@ -594,7 +594,7 @@ namespace Js
594594 Js::DeferredTypeHandler<Js::JavascriptExternalFunction::DeferredConstructorInitializer>::GetDefaultInstance (), true , true );
595595
596596 boundFunctionType = DynamicType::New (scriptContext, TypeIds_Function, functionPrototype, BoundFunction::NewInstance,
597- GetDeferredFunctionTypeHandler (), true , true );
597+ GetDeferredFunctionWithLengthUnsetTypeHandler (), true , true );
598598 crossSiteDeferredFunctionType = CreateDeferredFunctionTypeNoProfileThunk (
599599 scriptContext->CurrentCrossSiteThunk , true /* isShared*/ );
600600 crossSiteDeferredPrototypeFunctionType = CreateDeferredPrototypeFunctionTypeNoProfileThunk (
@@ -784,7 +784,7 @@ namespace Js
784784 JavascriptArray::EnsureCalculationOfAllocationBuckets<Js::JavascriptArray>();
785785 }
786786
787- template <bool addPrototype, bool addName, bool useLengthType>
787+ template <bool addPrototype, bool addName, bool useLengthType, bool addLength >
788788 bool JavascriptLibrary::InitializeFunction (DynamicObject *instance, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode)
789789 {
790790 JavascriptFunction * function = VarTo<JavascriptFunction>(instance);
@@ -833,7 +833,8 @@ namespace Js
833833 {
834834 ParseableFunctionInfo * funcInfo = scriptFunction->GetFunctionProxy ()->EnsureDeserialized ();
835835
836- if (useLengthType)
836+ CompileAssert (!addLength || useLengthType);
837+ if (addLength)
837838 {
838839 function->SetPropertyWithAttributes (PropertyIds::length, TaggedInt::ToVarUnchecked (funcInfo->GetReportedInParamsCount () - 1 ), PropertyConfigurable, nullptr , PropertyOperation_None, SideEffects_None);
839840 }
@@ -914,10 +915,10 @@ namespace Js
914915 }
915916 };
916917
917- template <bool isNameAvailable, bool isPrototypeAvailable, bool isLengthAvailable>
918+ template <bool isNameAvailable, bool isPrototypeAvailable, bool isLengthAvailable, bool addLength >
918919 DynamicTypeHandler * JavascriptLibrary::GetDeferredFunctionTypeHandlerBase ()
919920 {
920- return DeferredTypeHandler<InitializeFunction<isPrototypeAvailable, isNameAvailable, isLengthAvailable>, InitializeFunctionDeferredTypeHandlerFilter<isNameAvailable, isPrototypeAvailable, isLengthAvailable>>::GetDefaultInstance ();
921+ return DeferredTypeHandler<InitializeFunction<isPrototypeAvailable, isNameAvailable, isLengthAvailable, addLength >, InitializeFunctionDeferredTypeHandlerFilter<isNameAvailable, isPrototypeAvailable, isLengthAvailable>>::GetDefaultInstance ();
921922 }
922923
923924 template <bool isNameAvailable, bool isPrototypeAvailable>
@@ -993,6 +994,11 @@ namespace Js
993994 return GetDeferredFunctionTypeHandlerBase</* isNameAvailable*/ true , /* isPrototypeAvailable*/ false , /* isLengthAvailable */ true >();
994995 }
995996
997+ DynamicTypeHandler * JavascriptLibrary::GetDeferredFunctionWithLengthUnsetTypeHandler ()
998+ {
999+ return GetDeferredFunctionTypeHandlerBase</* isNameAvailable*/ true , /* isPrototypeAvailable*/ false , /* isLengthAvailable */ true , /* addLength */ false >();
1000+ }
1001+
9961002 DynamicTypeHandler * JavascriptLibrary::ScriptFunctionTypeHandler (bool noPrototypeProperty, bool isAnonymousFunction)
9971003 {
9981004 DynamicTypeHandler * scriptFunctionTypeHandler = nullptr ;
0 commit comments