-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathArgumentsObjectEnumerator.cpp
More file actions
102 lines (88 loc) · 4.31 KB
/
ArgumentsObjectEnumerator.cpp
File metadata and controls
102 lines (88 loc) · 4.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#include "RuntimeLibraryPch.h"
#include "ArgumentsObjectEnumerator.h"
namespace Js
{
ArgumentsObjectPrefixEnumerator::ArgumentsObjectPrefixEnumerator(ArgumentsObject* argumentsObject, EnumeratorFlags flags, ScriptContext* requestContext)
: JavascriptEnumerator(requestContext),
argumentsObject(argumentsObject),
flags(flags)
{
Reset();
}
JavascriptString * ArgumentsObjectPrefixEnumerator::MoveAndGetNext(PropertyId& propertyId, PropertyAttributes* attributes)
{
propertyId = Constants::NoProperty;
if (!doneFormalArgs)
{
formalArgIndex = argumentsObject->GetNextFormalArgIndex(formalArgIndex, !!(flags & EnumeratorFlags::EnumNonEnumerable), attributes);
if (formalArgIndex != JavascriptArray::InvalidIndex
&& formalArgIndex < argumentsObject->GetNumberOfArguments())
{
return this->GetScriptContext()->GetIntegerString(formalArgIndex);
}
doneFormalArgs = true;
}
return nullptr;
}
void ArgumentsObjectPrefixEnumerator::Reset()
{
formalArgIndex = JavascriptArray::InvalidIndex;
doneFormalArgs = false;
}
//---------------------- ES5ArgumentsObjectEnumerator -------------------------------
ES5ArgumentsObjectEnumerator * ES5ArgumentsObjectEnumerator::New(ArgumentsObject* argumentsObject, EnumeratorFlags flags, ScriptContext* requestContext, EnumeratorCache * enumeratorCache)
{
ES5ArgumentsObjectEnumerator * enumerator = RecyclerNew(requestContext->GetRecycler(), ES5ArgumentsObjectEnumerator, argumentsObject, flags, requestContext);
if (!enumerator->Init(enumeratorCache))
{
return nullptr;
}
return enumerator;
}
ES5ArgumentsObjectEnumerator::ES5ArgumentsObjectEnumerator(ArgumentsObject* argumentsObject, EnumeratorFlags flags, ScriptContext* requestcontext)
: ArgumentsObjectPrefixEnumerator(argumentsObject, flags, requestcontext),
enumeratedFormalsInObjectArrayCount(0)
{
}
BOOL ES5ArgumentsObjectEnumerator::Init(EnumeratorCache * enumeratorCache)
{
__super::Reset();
this->enumeratedFormalsInObjectArrayCount = 0;
return argumentsObject->DynamicObject::GetEnumerator(&objectEnumerator, flags, GetScriptContext(), enumeratorCache);
}
JavascriptString * ES5ArgumentsObjectEnumerator::MoveAndGetNext(PropertyId& propertyId, PropertyAttributes* attributes)
{
// Formals:
// - deleted => not in objectArray && not connected -- do not enum, do not advance
// - connected, in objectArray -- if (enumerable) enum it, advance objectEnumerator
// - disconnected =>in objectArray -- if (enumerable) enum it, advance objectEnumerator
if (!doneFormalArgs)
{
ES5HeapArgumentsObject* es5HAO = static_cast<ES5HeapArgumentsObject*>(
static_cast<ArgumentsObject*>(argumentsObject));
formalArgIndex = es5HAO->GetNextFormalArgIndexHelper(formalArgIndex, !!(flags & EnumeratorFlags::EnumNonEnumerable), attributes);
if (formalArgIndex != JavascriptArray::InvalidIndex
&& formalArgIndex < argumentsObject->GetNumberOfArguments())
{
if (argumentsObject->HasObjectArrayItem(formalArgIndex))
{
PropertyId tempPropertyId;
JavascriptString * tempIndex = objectEnumerator.MoveAndGetNext(tempPropertyId, attributes);
AssertMsg(tempIndex, "We advanced objectEnumerator->MoveNext() too many times.");
}
propertyId = Constants::NoProperty;
return this->GetScriptContext()->GetIntegerString(formalArgIndex);
}
doneFormalArgs = true;
}
return objectEnumerator.MoveAndGetNext(propertyId, attributes);
}
void ES5ArgumentsObjectEnumerator::Reset()
{
Init(nullptr);
}
}