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
36namespace 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 {
55        StructureStubInfo(AccessType accessType)
56            : accessType(accessType)
57            , seen(false)
58        {
59        }
60
61        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
68        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
76        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
84        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
92        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
102        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
111        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
121        bool seenOnce()
122        {
123            return seen;
124        }
125
126        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