Example #1
0
 void DynamicObject::ChangeType()
 {
     Assert(!GetDynamicType()->GetIsShared() || GetTypeHandler()->GetIsShared());
     this->type = this->DuplicateType();
 }
Example #2
0
    BOOL DynamicObject::GetEnumerator(BOOL enumNonEnumerable, Var* enumerator, ScriptContext * requestContext, bool preferSnapshotSemantics, bool enumSymbols)
    {
        if (!this->GetTypeHandler()->EnsureObjectReady(this))
        {
            *enumerator = nullptr;
            return FALSE;
        }

        // Create the appropriate enumerator object.
        if (preferSnapshotSemantics)
        {
            if (this->GetTypeHandler()->GetPropertyCount() == 0 && !this->HasObjectArray())
            {
                *enumerator = requestContext->GetLibrary()->GetNullEnumerator();
            }
            else
            {
                GetDynamicType()->PrepareForTypeSnapshotEnumeration();
                if (this->GetDynamicType()->GetIsLocked())
                {
                    if (enumSymbols)
                    {
                        if (enumNonEnumerable)
                        {
                            *enumerator = DynamicObjectSnapshotEnumeratorWPCache<BigPropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/true>::New(requestContext, this);
                        }
                        else
                        {
                            *enumerator = DynamicObjectSnapshotEnumeratorWPCache<BigPropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/true>::New(requestContext, this);
                        }
                    }
                    else if (enumNonEnumerable)
                    {
                        *enumerator = DynamicObjectSnapshotEnumeratorWPCache<BigPropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/false>::New(requestContext, this);
                    }
                    else
                    {
                        *enumerator = DynamicObjectSnapshotEnumeratorWPCache<BigPropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/false>::New(requestContext, this);
                    }
                }
                else
                {
                    if (enumSymbols)
                    {
                        if (enumNonEnumerable)
                        {
                            *enumerator = DynamicObjectSnapshotEnumerator<BigPropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/true>::New(requestContext, this);
                        }
                        else
                        {
                            *enumerator = DynamicObjectSnapshotEnumerator<BigPropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/true>::New(requestContext, this);
                        }
                    }
                    else if (enumNonEnumerable)
                    {
                        *enumerator = DynamicObjectSnapshotEnumerator<BigPropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/false>::New(requestContext, this);
                    }
                    else
                    {
                        *enumerator = DynamicObjectSnapshotEnumerator<BigPropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/false>::New(requestContext, this);
                    }
                }
            }
        }
        else if (enumSymbols)
        {
            if (enumNonEnumerable)
            {
                *enumerator = DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/true, /*snapShotSementics*/false>::New(requestContext, this);
            }
            else
            {
                *enumerator = DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/true, /*snapShotSementics*/false>::New(requestContext, this);
            }
        }
        else if (enumNonEnumerable)
        {
            *enumerator = DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/false, /*snapShotSementics*/false>::New(requestContext, this);
        }
        else
        {
            *enumerator = DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/false, /*snapShotSementics*/false>::New(requestContext, this);
        }

        return true;
    }