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 33 namespace JSC { 34 35 #if ENABLE(JIT) 36 struct StructureStubInfo { StructureStubInfoStructureStubInfo37 StructureStubInfo(OpcodeID opcodeID) 38 : opcodeID(opcodeID) 39 , stubRoutine(0) 40 , callReturnLocation(0) 41 , hotPathBegin(0) 42 { 43 } 44 initGetByIdSelfStructureStubInfo45 void initGetByIdSelf(Structure* baseObjectStructure) 46 { 47 opcodeID = op_get_by_id_self; 48 49 u.getByIdSelf.baseObjectStructure = baseObjectStructure; 50 baseObjectStructure->ref(); 51 } 52 initGetByIdProtoStructureStubInfo53 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 initGetByIdChainStructureStubInfo64 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 initGetByIdSelfListStructureStubInfo75 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 initGetByIdProtoListStructureStubInfo83 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 initPutByIdTransitionStructureStubInfo93 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 initPutByIdReplaceStructureStubInfo107 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 157