]> git.saurik.com Git - apple/javascriptcore.git/blob - bytecode/StructureStubInfo.h
JavaScriptCore-554.1.tar.gz
[apple/javascriptcore.git] / 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 struct StructureStubInfo {
39 StructureStubInfo(OpcodeID opcodeID)
40 : opcodeID(opcodeID)
41 {
42 }
43
44 void initGetByIdSelf(Structure* baseObjectStructure)
45 {
46 opcodeID = op_get_by_id_self;
47
48 u.getByIdSelf.baseObjectStructure = baseObjectStructure;
49 baseObjectStructure->ref();
50 }
51
52 void initGetByIdProto(Structure* baseObjectStructure, Structure* prototypeStructure)
53 {
54 opcodeID = op_get_by_id_proto;
55
56 u.getByIdProto.baseObjectStructure = baseObjectStructure;
57 baseObjectStructure->ref();
58
59 u.getByIdProto.prototypeStructure = prototypeStructure;
60 prototypeStructure->ref();
61 }
62
63 void initGetByIdChain(Structure* baseObjectStructure, StructureChain* chain)
64 {
65 opcodeID = op_get_by_id_chain;
66
67 u.getByIdChain.baseObjectStructure = baseObjectStructure;
68 baseObjectStructure->ref();
69
70 u.getByIdChain.chain = chain;
71 chain->ref();
72 }
73
74 void initGetByIdSelfList(PolymorphicAccessStructureList* structureList, int listSize)
75 {
76 opcodeID = op_get_by_id_self_list;
77
78 u.getByIdProtoList.structureList = structureList;
79 u.getByIdProtoList.listSize = listSize;
80 }
81
82 void initGetByIdProtoList(PolymorphicAccessStructureList* structureList, int listSize)
83 {
84 opcodeID = op_get_by_id_proto_list;
85
86 u.getByIdProtoList.structureList = structureList;
87 u.getByIdProtoList.listSize = listSize;
88 }
89
90 // PutById*
91
92 void initPutByIdTransition(Structure* previousStructure, Structure* structure, StructureChain* chain)
93 {
94 opcodeID = op_put_by_id_transition;
95
96 u.putByIdTransition.previousStructure = previousStructure;
97 previousStructure->ref();
98
99 u.putByIdTransition.structure = structure;
100 structure->ref();
101
102 u.putByIdTransition.chain = chain;
103 chain->ref();
104 }
105
106 void initPutByIdReplace(Structure* baseObjectStructure)
107 {
108 opcodeID = op_put_by_id_replace;
109
110 u.putByIdReplace.baseObjectStructure = baseObjectStructure;
111 baseObjectStructure->ref();
112 }
113
114 void deref();
115
116 OpcodeID opcodeID;
117 union {
118 struct {
119 Structure* baseObjectStructure;
120 } getByIdSelf;
121 struct {
122 Structure* baseObjectStructure;
123 Structure* prototypeStructure;
124 } getByIdProto;
125 struct {
126 Structure* baseObjectStructure;
127 StructureChain* chain;
128 } getByIdChain;
129 struct {
130 PolymorphicAccessStructureList* structureList;
131 int listSize;
132 } getByIdSelfList;
133 struct {
134 PolymorphicAccessStructureList* structureList;
135 int listSize;
136 } getByIdProtoList;
137 struct {
138 Structure* previousStructure;
139 Structure* structure;
140 StructureChain* chain;
141 } putByIdTransition;
142 struct {
143 Structure* baseObjectStructure;
144 } putByIdReplace;
145 } u;
146
147 CodeLocationLabel stubRoutine;
148 CodeLocationCall callReturnLocation;
149 CodeLocationLabel hotPathBegin;
150 };
151
152 } // namespace JSC
153
154 #endif
155
156 #endif // StructureStubInfo_h