2 * Copyright (C) 2015 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "DFGArgumentsUtilities.h"
31 #include "JSCInlines.h"
33 namespace JSC
{ namespace DFG
{
35 bool argumentsInvolveStackSlot(InlineCallFrame
* inlineCallFrame
, VirtualRegister reg
)
38 return (reg
.isArgument() && reg
.toArgument()) || reg
.isHeader();
40 if (inlineCallFrame
->isClosureCall
41 && reg
== VirtualRegister(inlineCallFrame
->stackOffset
+ JSStack::Callee
))
44 if (inlineCallFrame
->isVarargs()
45 && reg
== VirtualRegister(inlineCallFrame
->stackOffset
+ JSStack::ArgumentCount
))
48 unsigned numArguments
= inlineCallFrame
->arguments
.size() - 1;
49 VirtualRegister argumentStart
=
50 VirtualRegister(inlineCallFrame
->stackOffset
) + CallFrame::argumentOffset(0);
51 return reg
>= argumentStart
&& reg
< argumentStart
+ numArguments
;
54 bool argumentsInvolveStackSlot(Node
* candidate
, VirtualRegister reg
)
56 return argumentsInvolveStackSlot(candidate
->origin
.semantic
.inlineCallFrame
, reg
);
59 Node
* emitCodeToGetArgumentsArrayLength(
60 InsertionSet
& insertionSet
, Node
* arguments
, unsigned nodeIndex
, NodeOrigin origin
)
62 Graph
& graph
= insertionSet
.graph();
66 arguments
->op() == CreateDirectArguments
|| arguments
->op() == CreateScopedArguments
67 || arguments
->op() == CreateClonedArguments
|| arguments
->op() == PhantomDirectArguments
68 || arguments
->op() == PhantomClonedArguments
);
70 InlineCallFrame
* inlineCallFrame
= arguments
->origin
.semantic
.inlineCallFrame
;
72 if (inlineCallFrame
&& !inlineCallFrame
->isVarargs()) {
73 return insertionSet
.insertConstant(
74 nodeIndex
, origin
, jsNumber(inlineCallFrame
->arguments
.size() - 1));
79 argumentCount
= insertionSet
.insertNode(nodeIndex
, SpecInt32
, GetArgumentCount
, origin
);
81 VirtualRegister
argumentCountRegister(inlineCallFrame
->stackOffset
+ JSStack::ArgumentCount
);
83 argumentCount
= insertionSet
.insertNode(
84 nodeIndex
, SpecInt32
, GetStack
, origin
,
85 OpInfo(graph
.m_stackAccessData
.add(argumentCountRegister
, FlushedInt32
)));
88 return insertionSet
.insertNode(
89 nodeIndex
, SpecInt32
, ArithSub
, origin
, OpInfo(Arith::Unchecked
),
90 Edge(argumentCount
, Int32Use
),
91 insertionSet
.insertConstantForUse(
92 nodeIndex
, origin
, jsNumber(1), Int32Use
));
95 } } // namespace JSC::DFG
97 #endif // ENABLE(DFG_JIT)