• 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 #include "Instruction.h"
30 #include "Opcode.h"
31 #include "Structure.h"
32 
33 namespace JSC {
34 
35 #if ENABLE(JIT)
36     struct StructureStubInfo {
StructureStubInfoStructureStubInfo37         StructureStubInfo(OpcodeID opcodeID)
38             : opcodeID(opcodeID)
39             , stubRoutine(0)
40             , callReturnLocation(0)
41             , hotPathBegin(0)
42         {
43         }
44 
initGetByIdSelfStructureStubInfo45         void initGetByIdSelf(Structure* baseObjectStructure)
46         {
47             opcodeID = op_get_by_id_self;
48 
49             u.getByIdSelf.baseObjectStructure = baseObjectStructure;
50             baseObjectStructure->ref();
51         }
52 
initGetByIdProtoStructureStubInfo53         void initGetByIdProto(Structure* baseObjectStructure, Structure* prototypeStructure)
54         {
55             opcodeID = op_get_by_id_proto;
56 
57             u.getByIdProto.baseObjectStructure = baseObjectStructure;
58             baseObjectStructure->ref();
59 
60             u.getByIdProto.prototypeStructure = prototypeStructure;
61             prototypeStructure->ref();
62         }
63 
initGetByIdChainStructureStubInfo64         void initGetByIdChain(Structure* baseObjectStructure, StructureChain* chain)
65         {
66             opcodeID = op_get_by_id_chain;
67 
68             u.getByIdChain.baseObjectStructure = baseObjectStructure;
69             baseObjectStructure->ref();
70 
71             u.getByIdChain.chain = chain;
72             chain->ref();
73         }
74 
initGetByIdSelfListStructureStubInfo75         void initGetByIdSelfList(PolymorphicAccessStructureList* structureList, int listSize)
76         {
77             opcodeID = op_get_by_id_self_list;
78 
79             u.getByIdProtoList.structureList = structureList;
80             u.getByIdProtoList.listSize = listSize;
81         }
82 
initGetByIdProtoListStructureStubInfo83         void initGetByIdProtoList(PolymorphicAccessStructureList* structureList, int listSize)
84         {
85             opcodeID = op_get_by_id_proto_list;
86 
87             u.getByIdProtoList.structureList = structureList;
88             u.getByIdProtoList.listSize = listSize;
89         }
90 
91         // PutById*
92 
initPutByIdTransitionStructureStubInfo93         void initPutByIdTransition(Structure* previousStructure, Structure* structure, StructureChain* chain)
94         {
95             opcodeID = op_put_by_id_transition;
96 
97             u.putByIdTransition.previousStructure = previousStructure;
98             previousStructure->ref();
99 
100             u.putByIdTransition.structure = structure;
101             structure->ref();
102 
103             u.putByIdTransition.chain = chain;
104             chain->ref();
105         }
106 
initPutByIdReplaceStructureStubInfo107         void initPutByIdReplace(Structure* baseObjectStructure)
108         {
109             opcodeID = op_put_by_id_replace;
110 
111             u.putByIdReplace.baseObjectStructure = baseObjectStructure;
112             baseObjectStructure->ref();
113         }
114 
115         void deref();
116 
117         OpcodeID opcodeID;
118         union {
119             struct {
120                 Structure* baseObjectStructure;
121             } getByIdSelf;
122             struct {
123                 Structure* baseObjectStructure;
124                 Structure* prototypeStructure;
125             } getByIdProto;
126             struct {
127                 Structure* baseObjectStructure;
128                 StructureChain* chain;
129             } getByIdChain;
130             struct {
131                 PolymorphicAccessStructureList* structureList;
132                 int listSize;
133             } getByIdSelfList;
134             struct {
135                 PolymorphicAccessStructureList* structureList;
136                 int listSize;
137             } getByIdProtoList;
138             struct {
139                 Structure* previousStructure;
140                 Structure* structure;
141                 StructureChain* chain;
142             } putByIdTransition;
143             struct {
144                 Structure* baseObjectStructure;
145             } putByIdReplace;
146         } u;
147 
148         void* stubRoutine;
149         void* callReturnLocation;
150         void* hotPathBegin;
151     };
152 #endif
153 
154 } // namespace JSC
155 
156 #endif // StructureStubInfo_h
157