Replace WTF::move with WTFMove
[WebKit-https.git] / Source / JavaScriptCore / bytecode / GetByIdVariant.cpp
1 /*
2  * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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. 
24  */
25
26 #include "config.h"
27 #include "GetByIdVariant.h"
28
29 #include "CallLinkStatus.h"
30 #include "JSCInlines.h"
31 #include <wtf/ListDump.h>
32
33 namespace JSC {
34
35 GetByIdVariant::GetByIdVariant(
36     const StructureSet& structureSet, PropertyOffset offset,
37     const ObjectPropertyConditionSet& conditionSet,
38     std::unique_ptr<CallLinkStatus> callLinkStatus,
39     JSFunction* intrinsicFunction)
40     : m_structureSet(structureSet)
41     , m_conditionSet(conditionSet)
42     , m_offset(offset)
43     , m_callLinkStatus(WTFMove(callLinkStatus))
44     , m_intrinsicFunction(intrinsicFunction)
45 {
46     if (!structureSet.size()) {
47         ASSERT(offset == invalidOffset);
48         ASSERT(conditionSet.isEmpty());
49     }
50     if (intrinsicFunction)
51         ASSERT(intrinsic() != NoIntrinsic);
52 }
53                      
54 GetByIdVariant::~GetByIdVariant() { }
55
56 GetByIdVariant::GetByIdVariant(const GetByIdVariant& other)
57     : GetByIdVariant()
58 {
59     *this = other;
60 }
61
62 GetByIdVariant& GetByIdVariant::operator=(const GetByIdVariant& other)
63 {
64     m_structureSet = other.m_structureSet;
65     m_conditionSet = other.m_conditionSet;
66     m_offset = other.m_offset;
67     m_intrinsicFunction = other.m_intrinsicFunction;
68     if (other.m_callLinkStatus)
69         m_callLinkStatus = std::make_unique<CallLinkStatus>(*other.m_callLinkStatus);
70     else
71         m_callLinkStatus = nullptr;
72     return *this;
73 }
74
75 inline bool GetByIdVariant::canMergeIntrinsicStructures(const GetByIdVariant& other) const
76 {
77     if (m_intrinsicFunction != other.m_intrinsicFunction)
78         return false;
79     switch (intrinsic()) {
80     case TypedArrayByteLengthIntrinsic: {
81         // We can merge these sets as long as the element size of the two sets is the same.
82         TypedArrayType thisType = (*m_structureSet.begin())->classInfo()->typedArrayStorageType;
83         TypedArrayType otherType = (*other.m_structureSet.begin())->classInfo()->typedArrayStorageType;
84
85         ASSERT(isTypedView(thisType) && isTypedView(otherType));
86
87         return logElementSize(thisType) == logElementSize(otherType);
88     }
89
90     default:
91         return true;
92     }
93     RELEASE_ASSERT_NOT_REACHED();
94 }
95
96 bool GetByIdVariant::attemptToMerge(const GetByIdVariant& other)
97 {
98     if (m_offset != other.m_offset)
99         return false;
100     if (m_callLinkStatus || other.m_callLinkStatus)
101         return false;
102
103     if (!canMergeIntrinsicStructures(other))
104         return false;
105
106     if (m_conditionSet.isEmpty() != other.m_conditionSet.isEmpty())
107         return false;
108     
109     ObjectPropertyConditionSet mergedConditionSet;
110     if (!m_conditionSet.isEmpty()) {
111         mergedConditionSet = m_conditionSet.mergedWith(other.m_conditionSet);
112         if (!mergedConditionSet.isValid() || !mergedConditionSet.hasOneSlotBaseCondition())
113             return false;
114     }
115     m_conditionSet = mergedConditionSet;
116     
117     m_structureSet.merge(other.m_structureSet);
118     
119     return true;
120 }
121
122 void GetByIdVariant::dump(PrintStream& out) const
123 {
124     dumpInContext(out, 0);
125 }
126
127 void GetByIdVariant::dumpInContext(PrintStream& out, DumpContext* context) const
128 {
129     if (!isSet()) {
130         out.print("<empty>");
131         return;
132     }
133     
134     out.print(
135         "<", inContext(structureSet(), context), ", ", inContext(m_conditionSet, context));
136     out.print(", offset = ", offset());
137     if (m_callLinkStatus)
138         out.print(", call = ", *m_callLinkStatus);
139     if (m_intrinsicFunction)
140         out.print(", intrinsic = ", *m_intrinsicFunction);
141     out.print(">");
142 }
143
144 } // namespace JSC
145