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(Structure* baseObjectStructure) 62 { 63 accessType = access_get_by_id_self; 64 65 u.getByIdSelf.baseObjectStructure = baseObjectStructure; 66 baseObjectStructure->ref(); 67 } 68 initGetByIdProtoStructureStubInfo69 void initGetByIdProto(Structure* baseObjectStructure, Structure* prototypeStructure) 70 { 71 accessType = access_get_by_id_proto; 72 73 u.getByIdProto.baseObjectStructure = baseObjectStructure; 74 baseObjectStructure->ref(); 75 76 u.getByIdProto.prototypeStructure = prototypeStructure; 77 prototypeStructure->ref(); 78 } 79 initGetByIdChainStructureStubInfo80 void initGetByIdChain(Structure* baseObjectStructure, StructureChain* chain) 81 { 82 accessType = access_get_by_id_chain; 83 84 u.getByIdChain.baseObjectStructure = baseObjectStructure; 85 baseObjectStructure->ref(); 86 87 u.getByIdChain.chain = chain; 88 chain->ref(); 89 } 90 initGetByIdSelfListStructureStubInfo91 void initGetByIdSelfList(PolymorphicAccessStructureList* structureList, int listSize) 92 { 93 accessType = access_get_by_id_self_list; 94 95 u.getByIdProtoList.structureList = structureList; 96 u.getByIdProtoList.listSize = listSize; 97 } 98 initGetByIdProtoListStructureStubInfo99 void initGetByIdProtoList(PolymorphicAccessStructureList* structureList, int listSize) 100 { 101 accessType = access_get_by_id_proto_list; 102 103 u.getByIdProtoList.structureList = structureList; 104 u.getByIdProtoList.listSize = listSize; 105 } 106 107 // PutById* 108 initPutByIdTransitionStructureStubInfo109 void initPutByIdTransition(Structure* previousStructure, Structure* structure, StructureChain* chain) 110 { 111 accessType = access_put_by_id_transition; 112 113 u.putByIdTransition.previousStructure = previousStructure; 114 previousStructure->ref(); 115 116 u.putByIdTransition.structure = structure; 117 structure->ref(); 118 119 u.putByIdTransition.chain = chain; 120 chain->ref(); 121 } 122 initPutByIdReplaceStructureStubInfo123 void initPutByIdReplace(Structure* baseObjectStructure) 124 { 125 accessType = access_put_by_id_replace; 126 127 u.putByIdReplace.baseObjectStructure = baseObjectStructure; 128 baseObjectStructure->ref(); 129 } 130 131 void deref(); 132 seenOnceStructureStubInfo133 bool seenOnce() 134 { 135 return seen; 136 } 137 setSeenStructureStubInfo138 void setSeen() 139 { 140 seen = true; 141 } 142 143 int accessType : 31; 144 int seen : 1; 145 146 union { 147 struct { 148 Structure* baseObjectStructure; 149 } getByIdSelf; 150 struct { 151 Structure* baseObjectStructure; 152 Structure* prototypeStructure; 153 } getByIdProto; 154 struct { 155 Structure* baseObjectStructure; 156 StructureChain* chain; 157 } getByIdChain; 158 struct { 159 PolymorphicAccessStructureList* structureList; 160 int listSize; 161 } getByIdSelfList; 162 struct { 163 PolymorphicAccessStructureList* structureList; 164 int listSize; 165 } getByIdProtoList; 166 struct { 167 Structure* previousStructure; 168 Structure* structure; 169 StructureChain* chain; 170 } putByIdTransition; 171 struct { 172 Structure* baseObjectStructure; 173 } putByIdReplace; 174 } u; 175 176 CodeLocationLabel stubRoutine; 177 CodeLocationCall callReturnLocation; 178 CodeLocationLabel hotPathBegin; 179 }; 180 181 } // namespace JSC 182 183 #endif 184 185 #endif // StructureStubInfo_h 186