• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_get_by_id,
47         access_put_by_id,
48         access_get_by_id_generic,
49         access_put_by_id_generic,
50         access_get_array_length,
51         access_get_string_length,
52     };
53 
54     struct StructureStubInfo {
StructureStubInfoStructureStubInfo55         StructureStubInfo(AccessType accessType)
56             : accessType(accessType)
57             , seen(false)
58         {
59         }
60 
initGetByIdSelfStructureStubInfo61         void initGetByIdSelf(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure)
62         {
63             accessType = access_get_by_id_self;
64 
65             u.getByIdSelf.baseObjectStructure.set(globalData, owner, baseObjectStructure);
66         }
67 
initGetByIdProtoStructureStubInfo68         void initGetByIdProto(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure, Structure* prototypeStructure)
69         {
70             accessType = access_get_by_id_proto;
71 
72             u.getByIdProto.baseObjectStructure.set(globalData, owner, baseObjectStructure);
73             u.getByIdProto.prototypeStructure.set(globalData, owner, prototypeStructure);
74         }
75 
initGetByIdChainStructureStubInfo76         void initGetByIdChain(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure, StructureChain* chain)
77         {
78             accessType = access_get_by_id_chain;
79 
80             u.getByIdChain.baseObjectStructure.set(globalData, owner, baseObjectStructure);
81             u.getByIdChain.chain.set(globalData, owner, chain);
82         }
83 
initGetByIdSelfListStructureStubInfo84         void initGetByIdSelfList(PolymorphicAccessStructureList* structureList, int listSize)
85         {
86             accessType = access_get_by_id_self_list;
87 
88             u.getByIdProtoList.structureList = structureList;
89             u.getByIdProtoList.listSize = listSize;
90         }
91 
initGetByIdProtoListStructureStubInfo92         void initGetByIdProtoList(PolymorphicAccessStructureList* structureList, int listSize)
93         {
94             accessType = access_get_by_id_proto_list;
95 
96             u.getByIdProtoList.structureList = structureList;
97             u.getByIdProtoList.listSize = listSize;
98         }
99 
100         // PutById*
101 
initPutByIdTransitionStructureStubInfo102         void initPutByIdTransition(JSGlobalData& globalData, JSCell* owner, Structure* previousStructure, Structure* structure, StructureChain* chain)
103         {
104             accessType = access_put_by_id_transition;
105 
106             u.putByIdTransition.previousStructure.set(globalData, owner, previousStructure);
107             u.putByIdTransition.structure.set(globalData, owner, structure);
108             u.putByIdTransition.chain.set(globalData, owner, chain);
109         }
110 
initPutByIdReplaceStructureStubInfo111         void initPutByIdReplace(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure)
112         {
113             accessType = access_put_by_id_replace;
114 
115             u.putByIdReplace.baseObjectStructure.set(globalData, owner, baseObjectStructure);
116         }
117 
118         void deref();
119         void markAggregate(MarkStack&);
120 
seenOnceStructureStubInfo121         bool seenOnce()
122         {
123             return seen;
124         }
125 
setSeenStructureStubInfo126         void setSeen()
127         {
128             seen = true;
129         }
130 
131         int accessType : 31;
132         int seen : 1;
133 
134         union {
135             struct {
136                 WriteBarrierBase<Structure> baseObjectStructure;
137             } getByIdSelf;
138             struct {
139                 WriteBarrierBase<Structure> baseObjectStructure;
140                 WriteBarrierBase<Structure> prototypeStructure;
141             } getByIdProto;
142             struct {
143                 WriteBarrierBase<Structure> baseObjectStructure;
144                 WriteBarrierBase<StructureChain> chain;
145             } getByIdChain;
146             struct {
147                 PolymorphicAccessStructureList* structureList;
148                 int listSize;
149             } getByIdSelfList;
150             struct {
151                 PolymorphicAccessStructureList* structureList;
152                 int listSize;
153             } getByIdProtoList;
154             struct {
155                 WriteBarrierBase<Structure> previousStructure;
156                 WriteBarrierBase<Structure> structure;
157                 WriteBarrierBase<StructureChain> chain;
158             } putByIdTransition;
159             struct {
160                 WriteBarrierBase<Structure> baseObjectStructure;
161             } putByIdReplace;
162         } u;
163 
164         CodeLocationLabel stubRoutine;
165         CodeLocationCall callReturnLocation;
166         CodeLocationLabel hotPathBegin;
167     };
168 
169 } // namespace JSC
170 
171 #endif
172 
173 #endif // StructureStubInfo_h
174