Skip to content

Commit cd0cb8b

Browse files
committed
[MERGE chakra-core#1426 @curtisman] Remove DynamicObjectEnumerator index type template parameter
Merge pull request chakra-core#1426 from curtisman:enumclean Only BigPropertyIndex ever specified. Also remove unused GetNextProperty and the small index version of FindNextProperty functions
2 parents 25dbe89 + 65dfa87 commit cd0cb8b

15 files changed

Lines changed: 91 additions & 285 deletions

lib/Backend/LowerMDShared.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5115,7 +5115,7 @@ LowererMD::GenerateFastBrBReturn(IR::Instr *instr)
51155115
instr->InsertBefore(checkFirstPrototypeNullInstr);
51165116
instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JNE, labelHelper, this->m_func));
51175117

5118-
typedef Js::DynamicObjectSnapshotEnumeratorWPCache<Js::BigPropertyIndex, true, false> SmallDynamicObjectSnapshotEnumeratorWPCache;
5118+
typedef Js::DynamicObjectSnapshotEnumeratorWPCache<true, false> SmallDynamicObjectSnapshotEnumeratorWPCache;
51195119

51205120
// MOV currentEnumeratorOpnd, forInEnumerator->currentEnumerator
51215121
// CMP currentEnumeratorOpnd, SmallDynamicObjectSnapshotEnumeratorWPCache::`vtable

lib/Backend/arm/LowerMD.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5740,7 +5740,7 @@ LowererMD::GenerateFastBrBReturn(IR::Instr *instr)
57405740
instr->InsertBefore(checkFirstPrototypeNullInstr);
57415741
instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::BNE, labelHelper, this->m_func));
57425742

5743-
typedef Js::DynamicObjectSnapshotEnumeratorWPCache<Js::BigPropertyIndex, true, false> SmallDynamicObjectSnapshotEnumeratorWPCache;
5743+
typedef Js::DynamicObjectSnapshotEnumeratorWPCache<true, false> SmallDynamicObjectSnapshotEnumeratorWPCache;
57445744

57455745
// LDR currentEnumeratorOpnd, forInEnumerator->currentEnumerator
57465746
// CMP currentEnumeratorOpnd, SmallDynamicObjectSnapshotEnumeratorWPCache::`vtable

lib/Runtime/Language/ModuleNamespace.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -265,19 +265,6 @@ namespace Js
265265
return Constants::NoProperty;
266266
}
267267

268-
Var ModuleNamespace::GetNextProperty(BigPropertyIndex& index)
269-
{
270-
PropertyId propertyId;
271-
Var result = GetLibrary()->GetUndefined();
272-
BOOL retVal = FALSE;
273-
if (this->FindNextProperty(index, nullptr, &propertyId, nullptr))
274-
{
275-
retVal = this->GetProperty(this, propertyId, &result, nullptr, GetScriptContext());
276-
Assert(retVal);
277-
}
278-
return result;
279-
}
280-
281268
BOOL ModuleNamespace::FindNextProperty(BigPropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes) const
282269
{
283270
if (index < propertyMap->Count())

lib/Runtime/Language/ModuleNamespace.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ namespace Js
9595
UnambiguousExportMap* GetUnambiguousNonLocalExports() const { return unambiguousNonLocalExports; }
9696

9797
// Methods used by NamespaceEnumerator;
98-
Var GetNextProperty(BigPropertyIndex& index);
9998
BOOL FindNextProperty(BigPropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes) const;
10099
};
101100
}

lib/Runtime/Library/ForInObjectEnumerator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Js
99
class ForInObjectEnumerator : public WeakReferenceCache<ForInObjectEnumerator>
1010
{
1111
private:
12-
DynamicObjectSnapshotEnumeratorWPCache<BigPropertyIndex, true, false> embeddedEnumerator;
12+
DynamicObjectSnapshotEnumeratorWPCache<true, false> embeddedEnumerator;
1313
JavascriptEnumerator * currentEnumerator;
1414
RecyclableObject *object;
1515
RecyclableObject *baseObject;

lib/Runtime/Library/JavascriptLibrary.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3050,7 +3050,7 @@ namespace Js
30503050
vtableAddresses[VTableValue::VtableInvalid] = Js::ScriptContextOptimizationOverrideInfo::InvalidVtable;
30513051
vtableAddresses[VTableValue::VtablePropertyString] = VirtualTableInfo<Js::PropertyString>::Address;
30523052
vtableAddresses[VTableValue::VtableJavascriptBoolean] = VirtualTableInfo<Js::JavascriptBoolean>::Address;
3053-
vtableAddresses[VTableValue::VtableSmallDynamicObjectSnapshotEnumeratorWPCache] = VirtualTableInfo<Js::DynamicObjectSnapshotEnumeratorWPCache<Js::BigPropertyIndex,true,false>>::Address;
3053+
vtableAddresses[VTableValue::VtableSmallDynamicObjectSnapshotEnumeratorWPCache] = VirtualTableInfo<Js::DynamicObjectSnapshotEnumeratorWPCache<true,false>>::Address;
30543054
vtableAddresses[VTableValue::VtableJavascriptArray] = VirtualTableInfo<Js::JavascriptArray>::Address;
30553055
vtableAddresses[VTableValue::VtableInt8Array] = VirtualTableInfo<Js::Int8Array>::Address;
30563056
vtableAddresses[VTableValue::VtableUint8Array] = VirtualTableInfo<Js::Uint8Array>::Address;

lib/Runtime/Types/DynamicObject.cpp

Lines changed: 1 addition & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -373,170 +373,8 @@ namespace Js
373373
return this->GetTypeHandler()->GetFlags() & DynamicTypeHandler::IsExtensibleFlag;
374374
}
375375

376-
Var
377-
DynamicObject::GetNextProperty(PropertyIndex& index, DynamicType *typeToEnumerate, bool requireEnumerable, bool enumSymbols)
378-
{
379-
JavascriptString* propertyString= nullptr;
380-
PropertyId propertyId = Constants::NoProperty;
381-
382-
#if ENABLE_TTD
383-
BOOL findResult = FALSE;
384-
Js::PropertyAttributes dummyAttributes = PropertyNone;
385-
386-
if(this->GetScriptContext()->ShouldPerformDebugAction())
387-
{
388-
int32 pIndex = -1;
389-
this->GetScriptContext()->GetThreadContext()->TTDLog->ReplayPropertyEnumEvent(&findResult, &pIndex, this, &propertyId, &dummyAttributes, &propertyString);
390-
index = (Js::PropertyIndex)pIndex;
391-
}
392-
else if(this->GetScriptContext()->ShouldPerformRecordAction())
393-
{
394-
findResult = this->GetTypeHandler()->FindNextProperty(this->GetScriptContext(), index, &propertyString, &propertyId, nullptr, this->GetType(), typeToEnumerate, requireEnumerable, enumSymbols);
395-
396-
this->GetScriptContext()->GetThreadContext()->TTDLog->RecordPropertyEnumEvent(findResult, propertyId, dummyAttributes, propertyString);
397-
}
398-
else
399-
{
400-
findResult = this->GetTypeHandler()->FindNextProperty(this->GetScriptContext(), index, &propertyString, &propertyId, nullptr, this->GetType(), typeToEnumerate, requireEnumerable, enumSymbols);
401-
}
402-
#else
403-
BOOL findResult = this->GetTypeHandler()->FindNextProperty(this->GetScriptContext(), index, &propertyString, &propertyId, nullptr, this->GetType(), typeToEnumerate, requireEnumerable, enumSymbols);
404-
#endif
405-
406-
if (!findResult)
407-
{
408-
return nullptr;
409-
}
410-
411-
Assert(propertyString);
412-
Assert(propertyId);
413-
if (VirtualTableInfo<PropertyString>::HasVirtualTable(propertyString))
414-
{
415-
PropertyCache const* cache = ((PropertyString*)propertyString)->GetPropertyCache();
416-
if (cache && cache->type == this->GetType())
417-
{
418-
if (cache->isInlineSlot)
419-
{
420-
return this->GetInlineSlot(cache->dataSlotIndex);
421-
}
422-
else
423-
{
424-
return this->GetAuxSlot(cache->dataSlotIndex);
425-
}
426-
}
427-
}
428-
429-
Var value = nullptr;
430-
BOOL result;
431-
if (propertyId != Constants::NoProperty)
432-
{
433-
result = this->GetProperty(this, propertyId, &value, NULL, this->GetScriptContext());
434-
}
435-
else
436-
{
437-
result = this->GetProperty(this, propertyString, &value, NULL, this->GetScriptContext());
438-
}
439-
Assert(result);
440-
441-
return value;
442-
}
443-
444-
Var
445-
DynamicObject::GetNextProperty(BigPropertyIndex& index, DynamicType *typeToEnumerate, bool requireEnumerable, bool enumSymbols)
446-
{
447-
JavascriptString* propertyString = nullptr;
448-
PropertyId propertyId = Constants::NoProperty;
449-
450-
#if ENABLE_TTD
451-
BOOL findResult = FALSE;
452-
Js::PropertyAttributes dummyAttributes = PropertyNone;
453-
454-
if(this->GetScriptContext()->ShouldPerformDebugAction())
455-
{
456-
int32 pIndex = -1;
457-
this->GetScriptContext()->GetThreadContext()->TTDLog->ReplayPropertyEnumEvent(&findResult, &pIndex, this, &propertyId, &dummyAttributes, &propertyString);
458-
index = (Js::PropertyIndex)pIndex;
459-
}
460-
else if(this->GetScriptContext()->ShouldPerformRecordAction())
461-
{
462-
findResult = this->GetTypeHandler()->FindNextProperty(this->GetScriptContext(), index, &propertyString, &propertyId, nullptr, this->GetType(), typeToEnumerate, requireEnumerable, enumSymbols);
463-
464-
this->GetScriptContext()->GetThreadContext()->TTDLog->RecordPropertyEnumEvent(findResult, propertyId, dummyAttributes, propertyString);
465-
}
466-
else
467-
{
468-
findResult = this->GetTypeHandler()->FindNextProperty(this->GetScriptContext(), index, &propertyString, &propertyId, nullptr, this->GetType(), typeToEnumerate, requireEnumerable, enumSymbols);
469-
}
470-
#else
471-
BOOL findResult = this->GetTypeHandler()->FindNextProperty(this->GetScriptContext(), index, &propertyString, &propertyId, nullptr, this->GetType(), typeToEnumerate, requireEnumerable, enumSymbols);
472-
#endif
473-
474-
if (!findResult)
475-
{
476-
return nullptr;
477-
}
478-
479-
Assert(propertyString);
480-
Assert(propertyId);
481-
482-
Var value = nullptr;
483-
BOOL result;
484-
if (propertyId != Constants::NoProperty)
485-
{
486-
result = this->GetProperty(this, propertyId, &value, NULL, this->GetScriptContext());
487-
}
488-
else
489-
{
490-
result = this->GetProperty(this, propertyString, &value, NULL, this->GetScriptContext());
491-
}
492-
Assert(result);
493-
494-
return value;
495-
}
496-
497-
BOOL
498-
DynamicObject::FindNextProperty(PropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, DynamicType *typeToEnumerate, bool requireEnumerable, bool enumSymbols) const
499-
{
500-
if (index == Constants::NoSlot)
501-
{
502-
return FALSE;
503-
}
504-
505-
#if ENABLE_TTD
506-
if(this->GetScriptContext()->ShouldPerformDebugAction())
507-
{
508-
BOOL res = FALSE;
509-
int32 pIndex = -1;
510-
PropertyAttributes tmpAttributes = PropertyNone;
511-
this->GetScriptContext()->GetThreadContext()->TTDLog->ReplayPropertyEnumEvent(&res, &pIndex, this, propertyId, &tmpAttributes, propertyString);
512-
index = (Js::PropertyIndex)pIndex;
513-
514-
if(attributes != nullptr)
515-
{
516-
*attributes = tmpAttributes;
517-
}
518-
519-
return res;
520-
}
521-
else if(this->GetScriptContext()->ShouldPerformRecordAction())
522-
{
523-
BOOL res = this->GetTypeHandler()->FindNextProperty(this->GetScriptContext(), index, propertyString, propertyId, attributes, this->GetType(), typeToEnumerate, requireEnumerable, enumSymbols);
524-
525-
PropertyAttributes tmpAttributes = (attributes != nullptr) ? *attributes : PropertyNone;
526-
this->GetScriptContext()->GetThreadContext()->TTDLog->RecordPropertyEnumEvent(res, *propertyId, tmpAttributes, *propertyString);
527-
return res;
528-
}
529-
else
530-
{
531-
return this->GetTypeHandler()->FindNextProperty(this->GetScriptContext(), index, propertyString, propertyId, attributes, this->GetType(), typeToEnumerate, requireEnumerable, enumSymbols);
532-
}
533-
#else
534-
return this->GetTypeHandler()->FindNextProperty(this->GetScriptContext(), index, propertyString, propertyId, attributes, this->GetType(), typeToEnumerate, requireEnumerable, enumSymbols);
535-
#endif
536-
}
537-
538376
BOOL
539-
DynamicObject::FindNextProperty(BigPropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, DynamicType *typeToEnumerate, bool requireEnumerable, bool enumSymbols) const
377+
DynamicObject::FindNextProperty(BigPropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, DynamicType *typeToEnumerate, bool requireEnumerable, bool enumSymbols) const
540378
{
541379
if(index == Constants::NoBigSlot)
542380
{

lib/Runtime/Types/DynamicObject.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ namespace Js
4848
friend class CrossSite;
4949
friend class DynamicTypeHandler;
5050
friend class ModuleNamespace;
51-
template <typename T> friend class DynamicObjectEnumeratorBase;
52-
template <typename T, bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics> friend class DynamicObjectEnumerator;
51+
template <bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics> friend class DynamicObjectEnumerator;
5352
friend class RecyclableObject;
5453
friend struct InlineCache;
5554
friend class ForInObjectEnumerator; // for cache enumerator
@@ -272,8 +271,7 @@ namespace Js
272271

273272
Var GetNextProperty(PropertyIndex& index, DynamicType *typeToEnumerate, bool requireEnumerable, bool enumSymbols = false);
274273
Var GetNextProperty(BigPropertyIndex& index, DynamicType *typeToEnumerate, bool requireEnumerable, bool enumSymbols = false);
275-
276-
BOOL FindNextProperty(PropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, DynamicType *typeToEnumerate, bool requireEnumerable, bool enumSymbols = false) const;
274+
277275
BOOL FindNextProperty(BigPropertyIndex& index, JavascriptString** propertyString, PropertyId* propertyId, PropertyAttributes* attributes, DynamicType *typeToEnumerate, bool requireEnumerable, bool enumSymbols = false) const;
278276

279277
virtual BOOL HasDeferredTypeHandler() const sealed;

lib/Runtime/Types/DynamicObjectEnumerator.cpp

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@
66

77
namespace Js
88
{
9-
template <typename T, bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
10-
JavascriptEnumerator* DynamicObjectEnumerator<T, enumNonEnumerable, enumSymbols, snapShotSemantics>::New(ScriptContext* scriptContext, DynamicObject* object)
9+
template <bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
10+
JavascriptEnumerator* DynamicObjectEnumerator<enumNonEnumerable, enumSymbols, snapShotSemantics>::New(ScriptContext* scriptContext, DynamicObject* object)
1111
{
1212
DynamicObjectEnumerator* enumerator = RecyclerNew(scriptContext->GetRecycler(), DynamicObjectEnumerator, scriptContext);
1313
enumerator->Initialize(object);
1414
return enumerator;
1515
}
1616

17-
template <typename T, bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
18-
DynamicType *DynamicObjectEnumerator<T, enumNonEnumerable, enumSymbols, snapShotSemantics>::GetTypeToEnumerate() const
17+
template <bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
18+
DynamicType *DynamicObjectEnumerator<enumNonEnumerable, enumSymbols, snapShotSemantics>::GetTypeToEnumerate() const
1919
{
2020
return
2121
snapShotSemantics &&
@@ -25,8 +25,8 @@ namespace Js
2525
: object->GetDynamicType();
2626
}
2727

28-
template <typename T, bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
29-
uint32 DynamicObjectEnumerator<T, enumNonEnumerable, enumSymbols, snapShotSemantics>::GetCurrentItemIndex()
28+
template <bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
29+
uint32 DynamicObjectEnumerator<enumNonEnumerable, enumSymbols, snapShotSemantics>::GetCurrentItemIndex()
3030
{
3131
if (arrayEnumerator)
3232
{
@@ -38,22 +38,22 @@ namespace Js
3838
}
3939
}
4040

41-
template <typename T, bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
42-
void DynamicObjectEnumerator<T, enumNonEnumerable, enumSymbols, snapShotSemantics>::Reset()
41+
template <bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
42+
void DynamicObjectEnumerator<enumNonEnumerable, enumSymbols, snapShotSemantics>::Reset()
4343
{
4444
ResetHelper();
4545
}
4646

4747
// Initialize (or reuse) this enumerator for a given object.
48-
template <typename T, bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
49-
void DynamicObjectEnumerator<T, enumNonEnumerable, enumSymbols, snapShotSemantics>::Initialize(DynamicObject* object)
48+
template <bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
49+
void DynamicObjectEnumerator<enumNonEnumerable, enumSymbols, snapShotSemantics>::Initialize(DynamicObject* object)
5050
{
5151
this->object = object;
5252
ResetHelper();
5353
}
5454

55-
template <typename T, bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
56-
Var DynamicObjectEnumerator<T, enumNonEnumerable, enumSymbols, snapShotSemantics>::MoveAndGetNext(PropertyId& propertyId, PropertyAttributes* attributes)
55+
template <bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
56+
Var DynamicObjectEnumerator<enumNonEnumerable, enumSymbols, snapShotSemantics>::MoveAndGetNext(PropertyId& propertyId, PropertyAttributes* attributes)
5757
{
5858
if (arrayEnumerator)
5959
{
@@ -83,8 +83,8 @@ namespace Js
8383
return propertyString;
8484
}
8585

86-
template <typename T, bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
87-
void DynamicObjectEnumerator<T, enumNonEnumerable, enumSymbols, snapShotSemantics>::ResetHelper()
86+
template <bool enumNonEnumerable, bool enumSymbols, bool snapShotSemantics>
87+
void DynamicObjectEnumerator<enumNonEnumerable, enumSymbols, snapShotSemantics>::ResetHelper()
8888
{
8989
if (object->HasObjectArray())
9090
{
@@ -97,23 +97,15 @@ namespace Js
9797
arrayEnumerator = nullptr;
9898
}
9999
initialType = object->GetDynamicType();
100-
objectIndex = (T)-1; // This is Constants::NoSlot or Constants::NoBigSlot
100+
objectIndex = Constants::NoBigSlot;
101101
}
102-
103-
template class DynamicObjectEnumerator<PropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/true, /*snapShotSemantics*/false>;
104-
template class DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/true, /*snapShotSemantics*/false>;
105-
template class DynamicObjectEnumerator<PropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/true, /*snapShotSemantics*/false>;
106-
template class DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/true, /*snapShotSemantics*/false>;
107-
template class DynamicObjectEnumerator<PropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/true, /*snapShotSemantics*/true>;
108-
template class DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/true, /*snapShotSemantics*/true>;
109-
template class DynamicObjectEnumerator<PropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/false, /*snapShotSemantics*/false>;
110-
template class DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/false, /*snapShotSemantics*/false>;
111-
template class DynamicObjectEnumerator<PropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/false, /*snapShotSemantics*/false>;
112-
template class DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/false, /*snapShotSemantics*/false>;
113-
template class DynamicObjectEnumerator<PropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/false, /*snapShotSemantics*/true>;
114-
template class DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/false, /*enumSymbols*/false, /*snapShotSemantics*/true>;
115-
template class DynamicObjectEnumerator<PropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/false, /*snapShotSemantics*/true>;
116-
template class DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/false, /*snapShotSemantics*/true>;
117-
template class DynamicObjectEnumerator<PropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/true, /*snapShotSemantics*/true>;
118-
template class DynamicObjectEnumerator<BigPropertyIndex, /*enumNonEnumerable*/true, /*enumSymbols*/true, /*snapShotSemantics*/true>;
102+
103+
template class DynamicObjectEnumerator</*enumNonEnumerable*/true, /*enumSymbols*/true, /*snapShotSemantics*/false>;
104+
template class DynamicObjectEnumerator</*enumNonEnumerable*/false, /*enumSymbols*/true, /*snapShotSemantics*/false>;
105+
template class DynamicObjectEnumerator</*enumNonEnumerable*/false, /*enumSymbols*/true, /*snapShotSemantics*/true>;
106+
template class DynamicObjectEnumerator</*enumNonEnumerable*/true, /*enumSymbols*/false, /*snapShotSemantics*/false>;
107+
template class DynamicObjectEnumerator</*enumNonEnumerable*/false, /*enumSymbols*/false, /*snapShotSemantics*/false>;
108+
template class DynamicObjectEnumerator</*enumNonEnumerable*/false, /*enumSymbols*/false, /*snapShotSemantics*/true>;
109+
template class DynamicObjectEnumerator</*enumNonEnumerable*/true, /*enumSymbols*/false, /*snapShotSemantics*/true>;
110+
template class DynamicObjectEnumerator</*enumNonEnumerable*/true, /*enumSymbols*/true, /*snapShotSemantics*/true>;
119111
}

0 commit comments

Comments
 (0)