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