445e15dacfc529d0c5da2171d234ff221b99c999
[WebKit-https.git] / Source / JavaScriptCore / ftl / FTLAbstractHeapRepository.h
1 /*
2  * Copyright (C) 2013 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 FTLAbstractHeapRepository_h
27 #define FTLAbstractHeapRepository_h
28
29 #include <wtf/Platform.h>
30
31 #if ENABLE(FTL_JIT)
32
33 #include "FTLAbstractHeap.h"
34
35 namespace JSC { namespace FTL {
36
37 #define FOR_EACH_ABSTRACT_HEAP(macro) \
38     macro(typedArrayProperties) \
39     macro(length)
40
41 #define FOR_EACH_ABSTRACT_FIELD(macro) \
42     macro(JSCell_structure, JSCell::structureOffset()) \
43     macro(JSObject_butterfly, JSObject::butterflyOffset()) \
44     macro(Butterfly_publicLength, Butterfly::offsetOfPublicLength()) \
45     macro(Structure_globalObject, Structure::globalObjectOffset()) \
46     macro(Structure_typeInfoFlags, Structure::typeInfoFlagsOffset())
47
48 #define FOR_EACH_INDEXED_ABSTRACT_HEAP(macro) \
49     macro(variables, sizeof(Register)) \
50     macro(indexedInt32Properties, sizeof(EncodedJSValue)) \
51     macro(indexedDoubleProperties, sizeof(double)) \
52     macro(indexedContiguousProperties, sizeof(EncodedJSValue)) \
53     macro(indexedArrayStorageProperties, sizeof(EncodedJSValue))
54     
55 #define FOR_EACH_NUMBERED_ABSTRACT_HEAP(macro) \
56     macro(properties)
57     
58 // This class is meant to be cacheable between compilations, but it doesn't have to be.
59 // Doing so saves on creation of nodes. But clearing it will save memory.
60
61 class AbstractHeapRepository {
62     WTF_MAKE_NONCOPYABLE(AbstractHeapRepository);
63 public:
64     AbstractHeapRepository();
65     ~AbstractHeapRepository();
66     
67     AbstractHeap root;
68     
69 #define ABSTRACT_HEAP_DECLARATION(name) AbstractHeap name;
70     FOR_EACH_ABSTRACT_HEAP(ABSTRACT_HEAP_DECLARATION)
71 #undef ABSTRACT_HEAP_DECLARATION
72
73 #define ABSTRACT_FIELD_DECLARATION(name, offset) AbstractField name;
74     FOR_EACH_ABSTRACT_FIELD(ABSTRACT_FIELD_DECLARATION)
75 #undef ABSTRACT_FIELD_DECLARATION
76     
77 #define INDEXED_ABSTRACT_HEAP_DECLARATION(name, size) IndexedAbstractHeap name;
78     FOR_EACH_INDEXED_ABSTRACT_HEAP(INDEXED_ABSTRACT_HEAP_DECLARATION)
79 #undef INDEXED_ABSTRACT_HEAP_DECLARATION
80     
81 #define NUMBERED_ABSTRACT_HEAP_DECLARATION(name) NumberedAbstractHeap name;
82     FOR_EACH_NUMBERED_ABSTRACT_HEAP(NUMBERED_ABSTRACT_HEAP_DECLARATION)
83 #undef NUMBERED_ABSTRACT_HEAP_DECLARATION
84
85     AbsoluteAbstractHeap absolute;
86
87 private:
88     friend class AbstractHeap;
89     
90     unsigned m_tbaaKind;
91 };
92
93 } } // namespace JSC::FTL
94
95 #endif // ENABLE(FTL_JIT)
96
97 #endif // FTLAbstractHeapRepository_h
98