|
|
@@ -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);
|
|
|
}
|
|
|
|