initial import
[vuplus_webkit] / Source / JavaScriptCore / bytecode / StructureStubInfo.h
1 /*
2  * Copyright (C) 2008 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 StructureStubInfo_h
27 #define StructureStubInfo_h
28
29 #if ENABLE(JIT)
30
31 #include "Instruction.h"
32 #include "MacroAssembler.h"
33 #include "Opcode.h"
34 #include "Structure.h"
35
36 namespace JSC {
37
38     enum AccessType {
39         access_get_by_id_self,
40         access_get_by_id_proto,
41         access_get_by_id_chain,
42         access_get_by_id_self_list,
43         access_get_by_id_proto_list,
44         access_put_by_id_transition,
45         access_put_by_id_replace,
46         access_unset,
47         access_get_by_id_generic,
48         access_put_by_id_generic,
49         access_get_array_length,
50         access_get_string_length,
51     };
52
53     struct StructureStubInfo {
54         StructureStubInfo()
55             : accessType(access_unset)
56             , seen(false)
57         {
58         }
59
60         void initGetByIdSelf(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure)
61         {
62             accessType = access_get_by_id_self;
63
64             u.getByIdSelf.baseObjectStructure.set(globalData, owner, baseObjectStructure);
65         }
66
67         void initGetByIdProto(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure, Structure* prototypeStructure)
68         {
69             accessType = access_get_by_id_proto;
70
71             u.getByIdProto.baseObjectStructure.set(globalData, owner, baseObjectStructure);
72             u.getByIdProto.prototypeStructure.set(globalData, owner, prototypeStructure);
73         }
74
75         void initGetByIdChain(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure, StructureChain* chain)
76         {
77             accessType = access_get_by_id_chain;
78
79             u.getByIdChain.baseObjectStructure.set(globalData, owner, baseObjectStructure);
80             u.getByIdChain.chain.set(globalData, owner, chain);
81         }
82
83         void initGetByIdSelfList(PolymorphicAccessStructureList* structureList, int listSize)
84         {
85             accessType = access_get_by_id_self_list;
86
87             u.getByIdProtoList.structureList = structureList;
88             u.getByIdProtoList.listSize = listSize;
89         }
90
91         void initGetByIdProtoList(PolymorphicAccessStructureList* structureList, int listSize)
92         {
93             accessType = access_get_by_id_proto_list;
94
95             u.getByIdProtoList.structureList = structureList;
96             u.getByIdProtoList.listSize = listSize;
97         }
98
99         // PutById*
100
101         void initPutByIdTransition(JSGlobalData& globalData, JSCell* owner, Structure* previousStructure, Structure* structure, StructureChain* chain)
102         {
103             accessType = access_put_by_id_transition;
104
105             u.putByIdTransition.previousStructure.set(globalData, owner, previousStructure);
106             u.putByIdTransition.structure.set(globalData, owner, structure);
107             u.putByIdTransition.chain.set(globalData, owner, chain);
108         }
109
110         void initPutByIdReplace(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure)
111         {
112             accessType = access_put_by_id_replace;
113     
114             u.putByIdReplace.baseObjectStructure.set(globalData, owner, baseObjectStructure);
115         }
116
117         void deref();
118         void visitAggregate(SlotVisitor&);
119
120         bool seenOnce()
121         {
122             return seen;
123         }
124
125         void setSeen()
126         {
127             seen = true;
128         }
129
130         int8_t accessType;
131         int8_t seen;
132         
133 #if ENABLE(DFG_JIT)
134         int8_t baseGPR;
135         int8_t valueGPR;
136         int8_t scratchGPR;
137         int16_t deltaCallToDone;
138         int16_t deltaCallToStructCheck;
139         int16_t deltaCallToSlowCase;
140 #endif
141
142         union {
143             struct {
144                 int16_t deltaCheckImmToCall;
145                 int16_t deltaCallToLoadOrStore;
146             } unset;
147             struct {
148                 WriteBarrierBase<Structure> baseObjectStructure;
149             } getByIdSelf;
150             struct {
151                 WriteBarrierBase<Structure> baseObjectStructure;
152                 WriteBarrierBase<Structure> prototypeStructure;
153             } getByIdProto;
154             struct {
155                 WriteBarrierBase<Structure> baseObjectStructure;
156                 WriteBarrierBase<StructureChain> chain;
157             } getByIdChain;
158             struct {
159                 PolymorphicAccessStructureList* structureList;
160                 int listSize;
161             } getByIdSelfList;
162             struct {
163                 PolymorphicAccessStructureList* structureList;
164                 int listSize;
165             } getByIdProtoList;
166             struct {
167                 WriteBarrierBase<Structure> previousStructure;
168                 WriteBarrierBase<Structure> structure;
169                 WriteBarrierBase<StructureChain> chain;
170             } putByIdTransition;
171             struct {
172                 WriteBarrierBase<Structure> baseObjectStructure;
173             } putByIdReplace;
174         } u;
175
176         MacroAssemblerCodeRef stubRoutine;
177         CodeLocationCall callReturnLocation;
178         CodeLocationLabel hotPathBegin;
179     };
180
181 } // namespace JSC
182
183 #endif
184
185 #endif // StructureStubInfo_h