Remove "virtual" from all lines that have both "virtual" and "override".
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGCallArrayAllocatorSlowPathGenerator.h
1 /*
2  * Copyright (C) 2012 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 #ifndef DFGCallArrayAllocatorSlowPathGenerator_h
27 #define DFGCallArrayAllocatorSlowPathGenerator_h
28
29 #if ENABLE(DFG_JIT)
30
31 #include "DFGCommon.h"
32 #include "DFGSlowPathGenerator.h"
33 #include "DFGSpeculativeJIT.h"
34 #include <wtf/Vector.h>
35
36 namespace JSC { namespace DFG {
37
38 class CallArrayAllocatorSlowPathGenerator : public JumpingSlowPathGenerator<MacroAssembler::JumpList> {
39 public:
40     CallArrayAllocatorSlowPathGenerator(
41         MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZ function,
42         GPRReg resultGPR, GPRReg storageGPR, Structure* structure, size_t size)
43         : JumpingSlowPathGenerator<MacroAssembler::JumpList>(from, jit)
44         , m_function(function)
45         , m_resultGPR(resultGPR)
46         , m_storageGPR(storageGPR)
47         , m_structure(structure)
48         , m_size(size)
49     {
50         ASSERT(size < static_cast<size_t>(std::numeric_limits<int32_t>::max()));
51         jit->silentSpillAllRegistersImpl(false, m_plans, resultGPR);
52     }
53
54 protected:
55     void generateInternal(SpeculativeJIT* jit) override
56     {
57         linkFrom(jit);
58         for (unsigned i = 0; i < m_plans.size(); ++i)
59             jit->silentSpill(m_plans[i]);
60         jit->callOperation(m_function, m_resultGPR, m_structure, m_size);
61         GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR);
62         for (unsigned i = m_plans.size(); i--;)
63             jit->silentFill(m_plans[i], canTrample);
64         jit->m_jit.exceptionCheck();
65         jit->m_jit.loadPtr(MacroAssembler::Address(m_resultGPR, JSObject::butterflyOffset()), m_storageGPR);
66         jumpTo(jit);
67     }
68     
69 private:
70     P_JITOperation_EStZ m_function;
71     GPRReg m_resultGPR;
72     GPRReg m_storageGPR;
73     Structure* m_structure;
74     size_t m_size;
75     Vector<SilentRegisterSavePlan, 2> m_plans;
76 };
77
78 class CallArrayAllocatorWithVariableSizeSlowPathGenerator : public JumpingSlowPathGenerator<MacroAssembler::JumpList> {
79 public:
80     CallArrayAllocatorWithVariableSizeSlowPathGenerator(
81         MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZ function,
82         GPRReg resultGPR, Structure* contiguousStructure, Structure* arrayStorageStructure, GPRReg sizeGPR)
83         : JumpingSlowPathGenerator<MacroAssembler::JumpList>(from, jit)
84         , m_function(function)
85         , m_resultGPR(resultGPR)
86         , m_contiguousStructure(contiguousStructure)
87         , m_arrayStorageStructure(arrayStorageStructure)
88         , m_sizeGPR(sizeGPR)
89     {
90         jit->silentSpillAllRegistersImpl(false, m_plans, resultGPR);
91     }
92
93 protected:
94     void generateInternal(SpeculativeJIT* jit) override
95     {
96         linkFrom(jit);
97         for (unsigned i = 0; i < m_plans.size(); ++i)
98             jit->silentSpill(m_plans[i]);
99         GPRReg scratchGPR = AssemblyHelpers::selectScratchGPR(m_sizeGPR);
100         MacroAssembler::Jump bigLength = jit->m_jit.branch32(MacroAssembler::AboveOrEqual, m_sizeGPR, MacroAssembler::TrustedImm32(MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH));
101         jit->m_jit.move(MacroAssembler::TrustedImmPtr(m_contiguousStructure), scratchGPR);
102         MacroAssembler::Jump done = jit->m_jit.jump();
103         bigLength.link(&jit->m_jit);
104         jit->m_jit.move(MacroAssembler::TrustedImmPtr(m_arrayStorageStructure), scratchGPR);
105         done.link(&jit->m_jit);
106         jit->callOperation(m_function, m_resultGPR, scratchGPR, m_sizeGPR);
107         GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR);
108         for (unsigned i = m_plans.size(); i--;)
109             jit->silentFill(m_plans[i], canTrample);
110         jit->m_jit.exceptionCheck();
111         jumpTo(jit);
112     }
113     
114 private:
115     P_JITOperation_EStZ m_function;
116     GPRReg m_resultGPR;
117     Structure* m_contiguousStructure;
118     Structure* m_arrayStorageStructure;
119     GPRReg m_sizeGPR;
120     Vector<SilentRegisterSavePlan, 2> m_plans;
121 };
122
123 } } // namespace JSC::DFG
124
125 #endif // ENABLE(DFG_JIT)
126
127 #endif // DFGCallArrayAllocatorSlowPathGenerator_h
128