2 * Copyright (C) 2008 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #include "Structure.h"
34 #include <wtf/VectorTraits.h>
36 #define POLYMORPHIC_LIST_CACHE_SIZE 4
44 // Structure used by op_get_by_id_self_list and op_get_by_id_proto_list instruction to hold data off the main opcode stream.
45 struct PolymorphicAccessStructureList
{
46 struct PolymorphicStubInfo
{
52 StructureChain
* chain
;
55 void set(void* _stubRoutine
, Structure
* _base
)
57 stubRoutine
= _stubRoutine
;
63 void set(void* _stubRoutine
, Structure
* _base
, Structure
* _proto
)
65 stubRoutine
= _stubRoutine
;
71 void set(void* _stubRoutine
, Structure
* _base
, StructureChain
* _chain
)
73 stubRoutine
= _stubRoutine
;
78 } list
[POLYMORPHIC_LIST_CACHE_SIZE
];
80 PolymorphicAccessStructureList(void* stubRoutine
, Structure
* firstBase
)
82 list
[0].set(stubRoutine
, firstBase
);
85 PolymorphicAccessStructureList(void* stubRoutine
, Structure
* firstBase
, Structure
* firstProto
)
87 list
[0].set(stubRoutine
, firstBase
, firstProto
);
90 PolymorphicAccessStructureList(void* stubRoutine
, Structure
* firstBase
, StructureChain
* firstChain
)
92 list
[0].set(stubRoutine
, firstBase
, firstChain
);
95 void derefStructures(int count
)
97 for (int i
= 0; i
< count
; ++i
) {
98 PolymorphicStubInfo
& info
= list
[i
];
105 info
.u
.chain
->deref();
107 info
.u
.proto
->deref();
114 Instruction(Opcode opcode
)
116 #if !HAVE(COMPUTED_GOTO)
117 // We have to initialize one of the pointer members to ensure that
118 // the entire struct is initialized, when opcode is not a pointer.
124 Instruction(int operand
)
126 // We have to initialize one of the pointer members to ensure that
127 // the entire struct is initialized in 64-bit.
132 Instruction(Structure
* structure
) { u
.structure
= structure
; }
133 Instruction(StructureChain
* structureChain
) { u
.structureChain
= structureChain
; }
134 Instruction(JSCell
* jsCell
) { u
.jsCell
= jsCell
; }
135 Instruction(PolymorphicAccessStructureList
* polymorphicStructures
) { u
.polymorphicStructures
= polymorphicStructures
; }
140 Structure
* structure
;
141 StructureChain
* structureChain
;
143 PolymorphicAccessStructureList
* polymorphicStructures
;
151 template<> struct VectorTraits
<JSC::Instruction
> : VectorTraitsBase
<true, JSC::Instruction
> { };
155 #endif // Instruction_h