فهرست منبع

For external types reject deferred initializer calls if disableimplicit call is set

If JIT has disabled implicit call, we should not call the DeferredTypeHandler
initializer as it can potentially go out of engine and change stuff.
Sandeep Agarwal 8 سال پیش
والد
کامیت
a171bd2743

+ 3 - 1
lib/Runtime/Library/EngineInterfaceObject.cpp

@@ -188,7 +188,7 @@ namespace Js
     }
 #endif
 
-    void EngineInterfaceObject::InitializeCommonNativeInterfaces(DynamicObject* commonNativeInterfaces, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode)
+    bool EngineInterfaceObject::InitializeCommonNativeInterfaces(DynamicObject* commonNativeInterfaces, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode)
     {
         typeHandler->Convert(commonNativeInterfaces, mode, 38);
 
@@ -228,6 +228,8 @@ namespace Js
         library->AddFunctionToLibraryObject(commonNativeInterfaces, Js::PropertyIds::tagPublicLibraryCode, &EngineInterfaceObject::EntryInfo::TagPublicLibraryCode, 1);
 
         commonNativeInterfaces->SetHasNoEnumerableProperties(true);
+
+        return true;
     }
 
     Var EngineInterfaceObject::Entry_GetErrorMessage(RecyclableObject *function, CallInfo callInfo, ...)

+ 1 - 1
lib/Runtime/Library/EngineInterfaceObject.h

@@ -76,7 +76,7 @@ namespace Js
 
         void Initialize();
 
-        static void __cdecl InitializeCommonNativeInterfaces(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeCommonNativeInterfaces(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 
         class EntryInfo
         {

+ 3 - 1
lib/Runtime/Library/IntlEngineInterfaceExtensionObject.cpp

@@ -266,7 +266,7 @@ namespace Js
     }
 #endif
 
-    void IntlEngineInterfaceExtensionObject::InitializeIntlNativeInterfaces(DynamicObject* intlNativeInterfaces, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode)
+    bool IntlEngineInterfaceExtensionObject::InitializeIntlNativeInterfaces(DynamicObject* intlNativeInterfaces, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode)
     {
         typeHandler->Convert(intlNativeInterfaces, mode, 16);
 
@@ -296,6 +296,8 @@ namespace Js
         library->AddFunctionToLibraryObject(intlNativeInterfaces, Js::PropertyIds::setHiddenObject, &IntlEngineInterfaceExtensionObject::EntryInfo::Intl_SetHiddenObject, 1);
 
         intlNativeInterfaces->SetHasNoEnumerableProperties(true);
+
+        return true;
     }
 
     void IntlEngineInterfaceExtensionObject::deletePrototypePropertyHelper(ScriptContext* scriptContext, DynamicObject* intlObject, Js::PropertyId objectPropertyId, Js::PropertyId getterFunctionId)

+ 1 - 1
lib/Runtime/Library/IntlEngineInterfaceExtensionObject.h

@@ -27,7 +27,7 @@ namespace Js
         JavascriptFunction* GetDateToLocaleDateString() { return dateToLocaleDateString; }
         JavascriptFunction* GetNumberToLocaleString() { return numberToLocaleString; }
         JavascriptFunction* GetStringLocaleCompare() { return stringLocaleCompare; }
-        static void __cdecl InitializeIntlNativeInterfaces(DynamicObject* intlNativeInterfaces, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeIntlNativeInterfaces(DynamicObject* intlNativeInterfaces, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 
 #if DBG
         void DumpByteCode() override;

+ 3 - 2
lib/Runtime/Library/JavascriptExternalFunction.cpp

@@ -56,7 +56,7 @@ namespace Js
         DebugOnly(VerifyEntryPoint());
     }
 
-    void __cdecl JavascriptExternalFunction::DeferredInitializer(DynamicObject* instance, DeferredTypeHandlerBase* typeHandler, DeferredInitializeMode mode)
+    bool __cdecl JavascriptExternalFunction::DeferredInitializer(DynamicObject* instance, DeferredTypeHandlerBase* typeHandler, DeferredInitializeMode mode)
     {
         JavascriptExternalFunction* object = static_cast<JavascriptExternalFunction*>(instance);
         HRESULT hr = E_FAIL;
@@ -68,7 +68,7 @@ namespace Js
         {
             scriptContext->GetThreadContext()->AddImplicitCallFlags(ImplicitCall_External);
             //we will return if we get call further into implicitcalls.
-            return;
+            return false;
         }
 
         if (scriptContext->IsClosed() || scriptContext->IsInvalidatedForHostObjects())
@@ -101,6 +101,7 @@ namespace Js
             object->SetPropertyWithAttributes(PropertyIds::name, functionName, PropertyConfigurable, nullptr);
         }
 
+        return true;
     }
 
     void JavascriptExternalFunction::PrepareExternalCall(Js::Arguments * args)

+ 1 - 1
lib/Runtime/Library/JavascriptExternalFunction.h

@@ -74,7 +74,7 @@ namespace Js
         static Var WrappedFunctionThunk(RecyclableObject* function, CallInfo callInfo, ...);
         static Var StdCallExternalFunctionThunk(RecyclableObject* function, CallInfo callInfo, ...);
         static Var DefaultExternalFunctionThunk(RecyclableObject* function, CallInfo callInfo, ...);
-        static void __cdecl DeferredInitializer(DynamicObject* instance, DeferredTypeHandlerBase* typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl DeferredInitializer(DynamicObject* instance, DeferredTypeHandlerBase* typeHandler, DeferredInitializeMode mode);
 
         void PrepareExternalCall(Arguments * args);
 

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 206 - 75
lib/Runtime/Library/JavascriptLibrary.cpp


+ 36 - 36
lib/Runtime/Library/JavascriptLibrary.h

@@ -1240,8 +1240,8 @@ namespace Js
         static void PrecalculateArrayAllocationBuckets();
 
 #define STANDARD_INIT(name) \
-        static void __cdecl Initialize##name##Constructor(DynamicObject* arrayConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); \
-        static void __cdecl Initialize##name##Prototype(DynamicObject* arrayPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl Initialize##name##Constructor(DynamicObject* arrayConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); \
+        static bool __cdecl Initialize##name##Prototype(DynamicObject* arrayPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 
         STANDARD_INIT(Array);
         STANDARD_INIT(SharedArrayBuffer);
@@ -1291,57 +1291,57 @@ namespace Js
 
 #undef STANDARD_INIT
 
-        static void __cdecl InitializeAtomicsObject(DynamicObject* atomicsObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeAtomicsObject(DynamicObject* atomicsObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 
-        static void __cdecl InitializeInt64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeUint64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeBoolArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeCharArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeInt64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeUint64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeBoolArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeCharArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 
         void InitializeComplexThings();
         void InitializeStaticValues();
-        static void __cdecl InitializeMathObject(DynamicObject* mathObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeMathObject(DynamicObject* mathObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 #ifdef ENABLE_WASM
-        static void __cdecl InitializeWebAssemblyObject(DynamicObject* WasmObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeWebAssemblyObject(DynamicObject* WasmObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 #endif
         // SIMD_JS
-        static void __cdecl InitializeSIMDObject(DynamicObject* simdObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDOpCodeMaps();
+        static bool __cdecl InitializeSIMDObject(DynamicObject* simdObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDOpCodeMaps();
 
         template<typename SIMDTypeName>
         static void SIMDPrototypeInitHelper(DynamicObject* simdPrototype, JavascriptLibrary* library, JavascriptFunction* constructorFn, JavascriptString* strLiteral);
 
-        static void __cdecl InitializeSIMDBool8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDBool16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDBool32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDInt8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDInt16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDInt32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDUint8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDUint16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDUint32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDFloat32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSIMDFloat64x2Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-
-        static void __cdecl InitializeJSONObject(DynamicObject* JSONObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeEngineInterfaceObject(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeReflectObject(DynamicObject* reflectObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDBool8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDBool16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDBool32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDInt8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDInt16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDInt32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDUint8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDUint16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDUint32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDFloat32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSIMDFloat64x2Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+
+        static bool __cdecl InitializeJSONObject(DynamicObject* JSONObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeEngineInterfaceObject(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeReflectObject(DynamicObject* reflectObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 #ifdef ENABLE_INTL_OBJECT
-        static void __cdecl InitializeIntlObject(DynamicObject* IntlEngineObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeIntlObject(DynamicObject* IntlEngineObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 #endif
 #ifdef ENABLE_PROJECTION
         void InitializeWinRTPromiseConstructor();
 #endif
 
-        static void __cdecl InitializeIteratorPrototype(DynamicObject* iteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeArrayIteratorPrototype(DynamicObject* arrayIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeMapIteratorPrototype(DynamicObject* mapIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeSetIteratorPrototype(DynamicObject* setIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
-        static void __cdecl InitializeStringIteratorPrototype(DynamicObject* stringIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeIteratorPrototype(DynamicObject* iteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeArrayIteratorPrototype(DynamicObject* arrayIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeMapIteratorPrototype(DynamicObject* mapIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeSetIteratorPrototype(DynamicObject* setIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeStringIteratorPrototype(DynamicObject* stringIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 
-        static void __cdecl InitializeGeneratorPrototype(DynamicObject* generatorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeGeneratorPrototype(DynamicObject* generatorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 
-        static void __cdecl InitializeAsyncFunction(DynamicObject *function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeAsyncFunction(DynamicObject *function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 
         RuntimeFunction* CreateBuiltinConstructor(FunctionInfo * functionInfo, DynamicTypeHandler * typeHandler, DynamicObject* prototype = nullptr);
         RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, PropertyId nameId);
@@ -1352,9 +1352,9 @@ namespace Js
         JavascriptString* CreateEmptyString();
 
 
-        static void __cdecl InitializeGeneratorFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeGeneratorFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
         template<bool addPrototype>
-        static void __cdecl InitializeFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+        static bool __cdecl InitializeFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 
         static size_t const LibraryFunctionArgC[BuiltinFunction::Count + 1];
         static int const LibraryFunctionFlags[BuiltinFunction::Count + 1];   // returns enum BuiltInFlags.

+ 91 - 39
lib/Runtime/Types/DeferredTypeHandler.h

@@ -227,13 +227,7 @@ namespace Js
     template <DeferredTypeInitializer initializer, typename DeferredTypeFilter, bool isPrototypeTemplate, uint16 _inlineSlotCapacity, uint16 _offsetOfInlineSlots>
     bool DeferredTypeHandler<initializer, DeferredTypeFilter, isPrototypeTemplate, _inlineSlotCapacity, _offsetOfInlineSlots>::EnsureObjectReady(DynamicObject* instance, DeferredInitializeMode mode)
     {
-        initializer(instance, this, mode);
-        ThreadContext* threadContext = instance->GetScriptContext()->GetThreadContext();
-        if ((threadContext->GetImplicitCallFlags() > ImplicitCall_None) && threadContext->IsDisableImplicitCall())
-        {
-            return false;
-        }
-        return true;
+        return initializer(instance, this, mode);
     }
 
     template <DeferredTypeInitializer initializer, typename DeferredTypeFilter, bool isPrototypeTemplate, uint16 _inlineSlotCapacity, uint16 _offsetOfInlineSlots>
@@ -246,12 +240,14 @@ namespace Js
 
         if (DeferredTypeFilter::HasFilter() && DeferredTypeFilter::HasProperty(propertyId))
         {
-            return true;
+            return TRUE;
         }
+
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->HasProperty(instance, propertyId, noRedecl);
     }
 
@@ -260,8 +256,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->HasProperty(instance, propertyNameString);
     }
 
@@ -272,13 +269,17 @@ namespace Js
         if (DeferredTypeFilter::HasFilter() && !DeferredTypeFilter::HasProperty(propertyId))
         {
             *value = requestContext->GetMissingPropertyResult();
-            return false;
+            return FALSE;
         }
+
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
             *value = requestContext->GetMissingPropertyResult();
-            return FALSE;
+
+            // Return true so that we stop walking the prototype
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->GetProperty(instance, originalInstance, propertyId, value, info, requestContext);
     }
 
@@ -289,8 +290,11 @@ namespace Js
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
             *value = requestContext->GetMissingPropertyResult();
-            return FALSE;
+
+            // Return true so that we stop walking the prototype
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->GetProperty(instance, originalInstance, propertyNameString, value, info, requestContext);
     }
 
@@ -299,8 +303,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Set))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetProperty(instance, propertyId, value, flags, info);
     }
 
@@ -309,32 +314,46 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Set))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetProperty(instance, propertyNameString, value, flags, info);
     }
 
     template <DeferredTypeInitializer initializer, typename DeferredTypeFilter, bool isPrototypeTemplate, uint16 _inlineSlotCapacity, uint16 _offsetOfInlineSlots>
     DescriptorFlags DeferredTypeHandler<initializer, DeferredTypeFilter, isPrototypeTemplate, _inlineSlotCapacity, _offsetOfInlineSlots>::GetSetter(DynamicObject* instance, PropertyId propertyId, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext)
     {
+        if (setterValue != nullptr)
+        {
+            *setterValue = nullptr;
+        }
+
         if (DeferredTypeFilter::HasFilter() && !DeferredTypeFilter::HasProperty(propertyId))
         {
             return DescriptorFlags::None;
         }
+
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
             return DescriptorFlags::None;
         }
+
         return GetCurrentTypeHandler(instance)->GetSetter(instance, propertyId, setterValue, info, requestContext);
     }
 
     template <DeferredTypeInitializer initializer, typename DeferredTypeFilter, bool isPrototypeTemplate, uint16 _inlineSlotCapacity, uint16 _offsetOfInlineSlots>
     DescriptorFlags DeferredTypeHandler<initializer, DeferredTypeFilter, isPrototypeTemplate, _inlineSlotCapacity, _offsetOfInlineSlots>::GetSetter(DynamicObject* instance, JavascriptString* propertyNameString, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext)
     {
+        if (setterValue != nullptr)
+        {
+            *setterValue = nullptr;
+        }
+
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
             return DescriptorFlags::None;
         }
+
         return GetCurrentTypeHandler(instance)->GetSetter(instance, propertyNameString, setterValue, info, requestContext);
     }
 
@@ -343,8 +362,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->DeleteProperty(instance, propertyId, flags);
     }
 
@@ -353,8 +373,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->HasItem(instance, index);
     }
 
@@ -363,15 +384,19 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetItem(instance, index, value, flags);
     }
 
     template <DeferredTypeInitializer initializer, typename DeferredTypeFilter, bool isPrototypeTemplate, uint16 _inlineSlotCapacity, uint16 _offsetOfInlineSlots>
     BOOL DeferredTypeHandler<initializer, DeferredTypeFilter, isPrototypeTemplate, _inlineSlotCapacity, _offsetOfInlineSlots>::SetItemWithAttributes(DynamicObject* instance, uint32 index, Var value, PropertyAttributes attributes)
     {
-        EnsureObjectReady(instance, DeferredInitializeMode_Default);
+        if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
+        {
+            return TRUE;
+        }
         return GetCurrentTypeHandler(instance)->SetItemWithAttributes(instance, index, value, attributes);
     }
 
@@ -380,8 +405,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetItemAttributes(instance, index, attributes);
     }
 
@@ -390,8 +416,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetItemAccessors(instance, index, getter, setter);
     }
 
@@ -400,8 +427,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->DeleteItem(instance, index, flags);
     }
     template <DeferredTypeInitializer initializer, typename DeferredTypeFilter, bool isPrototypeTemplate, uint16 _inlineSlotCapacity, uint16 _offsetOfInlineSlots>
@@ -410,8 +438,9 @@ namespace Js
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
             *value = requestContext->GetMissingItemResult();
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->GetItem(instance, originalInstance, index, value, requestContext);
     }
 
@@ -422,6 +451,7 @@ namespace Js
         {
             return DescriptorFlags::None;
         }
+
         return GetCurrentTypeHandler(instance)->GetItemSetter(instance, index, setterValue, requestContext);
     }
 
@@ -430,8 +460,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->IsEnumerable(instance, propertyId);
     }
 
@@ -440,8 +471,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->IsWritable(instance, propertyId);
     }
 
@@ -450,8 +482,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->IsConfigurable(instance, propertyId);
     }
 
@@ -460,8 +493,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetEnumerable(instance, propertyId, value);
     }
 
@@ -470,8 +504,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetWritable(instance, propertyId, value);
     }
 
@@ -480,8 +515,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetConfigurable(instance, propertyId, value);
     }
 
@@ -490,8 +526,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_SetAccessors))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetAccessors(instance, propertyId, getter, setter, flags);
     }
 
@@ -500,8 +537,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->GetAccessors(instance, propertyId, getter, setter);
     }
 
@@ -510,8 +548,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->IsSealed(instance);
     }
 
@@ -520,8 +559,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->IsFrozen(instance);
     }
 
@@ -530,8 +570,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Extensions))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->PreventExtensions(instance);
     }
 
@@ -540,8 +581,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Extensions))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->Seal(instance);
     }
 
@@ -550,8 +592,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Extensions))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->Freeze(instance, true);
     }
 
@@ -560,8 +603,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Set))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetPropertyWithAttributes(instance, propertyId, value, attributes, info, flags, possibleSideEffects);
     }
 
@@ -570,8 +614,9 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Set))
         {
-            return FALSE;
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->SetAttributes(instance, propertyId, attributes);
     }
 
@@ -580,8 +625,13 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Default))
         {
-            return FALSE;
+            if (attributes)
+            {
+                *attributes = PropertyDynamicTypeDefaults;
+            }
+            return TRUE;
         }
+
         return GetCurrentTypeHandler(instance)->GetAttributesWithPropertyIndex(instance, propertyId, index, attributes);
     }
 
@@ -590,8 +640,10 @@ namespace Js
     {
         if (!EnsureObjectReady(instance, DeferredInitializeMode_Set))
         {
+            AssertOrFailFastMsg(false, "Is this a valid scenario?");
             return nullptr;
         }
+
         return GetCurrentTypeHandler(instance)->ConvertToTypeWithItemAttributes(instance);
     }
 

+ 1 - 1
lib/Runtime/Types/TypeHandler.h

@@ -47,7 +47,7 @@ namespace Js
         EquivalentPropertyEntry* properties;
     };
 
-    typedef void (__cdecl *DeferredTypeInitializer)(DynamicObject* instance, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
+    typedef bool (__cdecl *DeferredTypeInitializer)(DynamicObject* instance, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
 
     class DynamicTypeHandler
     {

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است