]> git.saurik.com Git - apple/javascriptcore.git/blame - bytecode/StructureStubInfo.h
JavaScriptCore-521.tar.gz
[apple/javascriptcore.git] / bytecode / StructureStubInfo.h
CommitLineData
9dae56ea
A
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
33namespace JSC {
34
35#if ENABLE(JIT)
36 struct StructureStubInfo {
37 StructureStubInfo(OpcodeID opcodeID)
38 : opcodeID(opcodeID)
39 , stubRoutine(0)
40 , callReturnLocation(0)
41 , hotPathBegin(0)
42 {
43 }
44
45 void initGetByIdSelf(Structure* baseObjectStructure)
46 {
47 opcodeID = op_get_by_id_self;
48
49 u.getByIdSelf.baseObjectStructure = baseObjectStructure;
50 baseObjectStructure->ref();
51 }
52
53 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
64 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
75 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
83 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
93 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
107 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