Line | Branch | Exec | Source |
---|---|---|---|
1 | #include "lexer/lexer.h" | ||
2 | // #include "parser/module.h" | ||
3 | |||
4 | #include "ast/nodes.h" | ||
5 | #include "builtin/operators.h" | ||
6 | #include "parser/parser.h" | ||
7 | #include "sema/sema.h" | ||
8 | |||
9 | #include "allocator.h" | ||
10 | #include "metadata.h" | ||
11 | |||
12 | namespace lython { | ||
13 | |||
14 | #ifdef __linux__ | ||
15 | // Shared Pointer & Hash tables do not actually allocate T | ||
16 | // but a struct that includes T and other data | ||
17 | // So we rename that mangled struct name by that type T it manages | ||
18 | // Those details are implementation specific to GCC | ||
19 | template <typename T> | ||
20 | using SharedPtrInternal = | ||
21 | std::_Sp_counted_ptr_inplace<T, lython::Allocator<T, device::CPU>, std::__default_lock_policy>; | ||
22 | template <typename T, bool cache> | ||
23 | using HashNodeInternal = std::__detail::_Hash_node<T, cache>; | ||
24 | #elif !BUILD_WEBASSEMBLY && !__clang__ | ||
25 | template <typename T> | ||
26 | using SharedPtrInternal = std::shared_ptr<T>; | ||
27 | |||
28 | template <typename T, bool cache> | ||
29 | using HashNodeInternal = std::_List_node<T, void* __ptr64>; | ||
30 | |||
31 | template <typename T, bool cache> | ||
32 | using ListIterator = std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<T>>>; | ||
33 | #endif | ||
34 | |||
35 | template <typename T> | ||
36 | using UniquePtrInternal = std::unique_ptr<T>; | ||
37 | |||
38 | void _metadata_init_names_windows(); | ||
39 | void _metadata_init_names_unix(); | ||
40 | void _metadata_init_names_gcc(); | ||
41 | void _metadata_init_names_clang(); | ||
42 | void _metadata_init_names_js(); | ||
43 | |||
44 | bool _metadata_init_names() { | ||
45 | 12 | _metadata_init_names_windows(); | |
46 | 12 | _metadata_init_names_unix(); | |
47 | 12 | _metadata_init_names_js(); | |
48 | 12 | _metadata_init_names_gcc(); | |
49 | 12 | _metadata_init_names_clang(); | |
50 | |||
51 | 12 | meta::override_typename<char>("char"); | |
52 | 12 | meta::override_typename<int>("int"); | |
53 | 12 | meta::override_typename<lython::String>("String"); | |
54 | 12 | meta::override_typename<lython::StringRef>("StringRef"); | |
55 | 12 | meta::override_typename<lython::StringDatabase::StringEntry>("StringDatabase::StringEntry"); | |
56 | |||
57 | 12 | meta::override_typename<lython::Node*>("Node*"); | |
58 | 12 | meta::override_typename<lython::GCObject*>("GCObject*"); | |
59 | 12 | meta::override_typename<lython::ExprNode*>("ExprNode*"); | |
60 | 12 | meta::override_typename<lython::StmtNode*>("StmtNode*"); | |
61 | 12 | meta::override_typename<lython::ConstantValue>("ConstantValue"); | |
62 | 12 | meta::override_typename<lython::BinOp::NativeBinaryOp>("NativeBinaryOperation"); | |
63 | |||
64 | 12 | meta::override_typename<UniquePtrInternal<lython::SemaException>>("SemaException"); | |
65 | 12 | meta::override_typename<UniquePtrInternal<lython::ParsingException>>("ParsingException"); | |
66 | |||
67 | 12 | meta::override_typename<lython::Comprehension>("Comprehension"); | |
68 | 12 | meta::override_typename<lython::Alias>("Alias"); | |
69 | 12 | meta::override_typename<lython::WithItem>("WithItem"); | |
70 | 12 | meta::override_typename<lython::ExceptHandler>("ExceptHandler"); | |
71 | 12 | meta::override_typename<lython::Arg>("Arg"); | |
72 | 12 | meta::override_typename<lython::CmpOperator>("CmpOperator"); | |
73 | 12 | meta::override_typename<lython::Keyword>("Keyword"); | |
74 | 12 | meta::override_typename<lython::MatchCase>("MatchCase"); | |
75 | 12 | meta::override_typename<lython::Pattern*>("Pattern*"); | |
76 | 12 | meta::override_typename<lython::BindingEntry>("BindingEntry"); | |
77 | 12 | meta::override_typename<Array<StmtNode*>>("Array<StmtNode*>"); | |
78 | 12 | meta::override_typename<ExprContext>("ExprContext"); | |
79 | 12 | meta::override_typename<ClassDef::Attr>("ClassDef::Attr"); | |
80 | 12 | meta::override_typename<ParsingContext>("ParsingContext"); | |
81 | 12 | meta::override_typename<SemaContext>("SemaContext"); | |
82 | 12 | meta::override_typename<Decorator>("Decorator"); | |
83 | 12 | meta::override_typename<Token>("Token"); | |
84 | 12 | meta::override_typename<ParsingError>("ParsingError"); | |
85 | |||
86 | #define REGISTER_TYPE(type) \ | ||
87 | meta::override_typename<lython::type>(#type); \ | ||
88 | meta::override_typename<lython::type*>(#type "*"); | ||
89 | |||
90 | #define X(name, _) | ||
91 | #define SECTION(name) | ||
92 | #define EXPR(name, _) REGISTER_TYPE(name) | ||
93 | #define STMT(name, _) REGISTER_TYPE(name) | ||
94 | #define MOD(name, _) REGISTER_TYPE(name) | ||
95 | #define MATCH(name, _) REGISTER_TYPE(name) | ||
96 | |||
97 | 12 | NODEKIND_ENUM(X, SECTION, EXPR, STMT, MOD, MATCH) | |
98 | |||
99 | #undef X | ||
100 | #undef SECTION | ||
101 | #undef EXPR | ||
102 | #undef STMT | ||
103 | #undef MOD | ||
104 | #undef MATCH | ||
105 | |||
106 | #if __linux__ || (!BUILD_WEBASSEMBLY && !__clang__) | ||
107 | meta::override_typename< | ||
108 | 12 | HashNodeInternal<std::pair<const StringRef, lython::ClassDef::Attr>, false>>( | |
109 | "Pair[Ref, Classdef::Attr]"); | ||
110 | |||
111 | 12 | meta::override_typename<HashNodeInternal<std::pair<const String, lython::OpConfig>, false>>( | |
112 | "Pair[String, OpConfig]"); | ||
113 | |||
114 | 12 | meta::override_typename<HashNodeInternal<std::pair<const String, lython::TokenType>, false>>( | |
115 | "Pair[String, TokenType]"); | ||
116 | |||
117 | 12 | meta::override_typename<HashNodeInternal<std::pair<const String, TokenType>, true>>( | |
118 | "Pair[String, TokenType]"); | ||
119 | |||
120 | 12 | meta::override_typename<HashNodeInternal<std::pair<const String, OpConfig>, true>>( | |
121 | "Pair[String, OpConfig]"); | ||
122 | |||
123 | 12 | meta::override_typename<HashNodeInternal<std::pair<const StringRef, bool>, true>>( | |
124 | "Pair[String, bool]"); | ||
125 | |||
126 | 12 | meta::override_typename<HashNodeInternal<std::pair<const StringRef, lython::ExprNode*>, true>>( | |
127 | "Pair[String, ExprNode*]"); | ||
128 | |||
129 | meta::override_typename< | ||
130 | 12 | HashNodeInternal<std::pair<const StringRef, lython::BinOp::NativeBinaryOp>, true>>( | |
131 | "Pair[String, NativeBinaryOp]"); | ||
132 | |||
133 | meta::override_typename< | ||
134 | 12 | HashNodeInternal<std::pair<const StringRef, lython::UnaryOp::NativeUnaryOp>, true>>( | |
135 | "Pair[String, NativeUnaryOp]"); | ||
136 | |||
137 | // String Database | ||
138 | 12 | meta::override_typename<Array<StringDatabase::StringEntry>*>("Array[StringEntry]*"); | |
139 | |||
140 | // StringDatabase | ||
141 | 12 | meta::override_typename<HashNodeInternal<std::pair<const StringView, std::size_t>, true>>( | |
142 | "Pair[StringView, size_t]"); | ||
143 | |||
144 | 12 | meta::override_typename<HashNodeInternal<std::pair<const StringRef, lython::ExprNode*>, false>>( | |
145 | "Pair[StringRef, ExprNode*]"); | ||
146 | |||
147 | meta::override_typename< | ||
148 | 12 | HashNodeInternal<std::pair<const StringRef, lython::BinOp::NativeBinaryOp>, false>>( | |
149 | "Pair[StringRef, NativeBinaryOp]"); | ||
150 | |||
151 | meta::override_typename< | ||
152 | 12 | HashNodeInternal<std::pair<const StringRef, lython::UnaryOp::NativeUnaryOp>, false>>( | |
153 | "Pair[StringRef, NativeUnaryOp]"); | ||
154 | |||
155 | 12 | meta::override_typename<HashNodeInternal<std::pair<const StringRef, bool>, false>>( | |
156 | "Pair[StringRef, bool]"); | ||
157 | |||
158 | // module | ||
159 | 12 | meta::override_typename<HashNodeInternal<std::pair<const String, int>, true>>( | |
160 | "Pair[String, Index]"); | ||
161 | |||
162 | // module precedence_table | ||
163 | 12 | meta::override_typename<HashNodeInternal<std::pair<const String, std::tuple<int, bool>>, true>>( | |
164 | "Pair[String, Tuple[int, bool]]"); | ||
165 | |||
166 | // Keyword to string | ||
167 | 12 | meta::override_typename<HashNodeInternal<std::pair<const int, String>, false>>( | |
168 | "Pair[int, String]"); | ||
169 | |||
170 | // Set Keyword | ||
171 | 12 | meta::override_typename<HashNodeInternal<char, false>>("Set[char]"); | |
172 | #endif | ||
173 | |||
174 | #define INIT_METADATA(name, typname) meta::type_name<name>(); | ||
175 | |||
176 | 12 | TYPES_METADATA(INIT_METADATA) | |
177 | |||
178 | 12 | return true; | |
179 | } | ||
180 | |||
181 | void _metadata_init_names_gcc() {} | ||
182 | void _metadata_init_names_clang() {} | ||
183 | |||
184 | void _metadata_init_names_windows() { | ||
185 | #if (!defined __linux__) && (!BUILD_WEBASSEMBLY && !__clang__) | ||
186 | meta::override_typename< | ||
187 | ListIterator<std::pair<const StringRef, lython::ClassDef::Attr>, false>>( | ||
188 | "Iterator[Pair[Ref, Classdef::Attr]]"); | ||
189 | |||
190 | meta::override_typename<ListIterator<std::pair<const int, String>, false>>( | ||
191 | "Iterator[Pair[int, String]]"); | ||
192 | |||
193 | meta::override_typename<ListIterator<std::pair<const std::string_view, std::size_t>, false>>( | ||
194 | "Iterator[Pair[StringView, size_t]]"); | ||
195 | |||
196 | meta::override_typename<ListIterator<std::pair<const String, OpConfig>, false>>( | ||
197 | "Iterator[Pair[String, OpConfig]]"); | ||
198 | |||
199 | meta::override_typename<ListIterator<std::pair<const String, TokenType>, false>>( | ||
200 | "Iterator[Pair[String, TokenType]]"); | ||
201 | |||
202 | meta::override_typename< | ||
203 | ListIterator<std::pair<const StringRef, lython::BinOp::NativeBinaryOp>, false>>( | ||
204 | "Iterator[Pair[StringRef, NativeBinaryOp]]"); | ||
205 | |||
206 | meta::override_typename< | ||
207 | ListIterator<std::pair<const StringRef, lython::UnaryOp::NativeUnaryOp>, false>>( | ||
208 | "Iterator[Pair[StringRef, NativeUnaryOp]]"); | ||
209 | |||
210 | meta::override_typename<ListIterator<std::pair<const StringRef, lython::ExprNode*>, false>>( | ||
211 | "Iterator[Pair[StringRef, ExprNode*]]"); | ||
212 | |||
213 | meta::override_typename<ListIterator<std::pair<const StringRef, bool>, false>>( | ||
214 | "Iterator[Pair[StringRef, bool]]"); | ||
215 | |||
216 | meta::override_typename< | ||
217 | std::_List_node<Array<StringDatabase::StringEntry>, | ||
218 | typename std::allocator_traits< | ||
219 | std::allocator<Array<StringDatabase::StringEntry>>>::void_pointer>>( | ||
220 | "ListNode[Array[StringEntry]]"); | ||
221 | #endif | ||
222 | 12 | } | |
223 | void _metadata_init_names_unix() { | ||
224 | #ifdef __linux__ | ||
225 | 12 | meta::override_typename<std::_List_node<Array<StringDatabase::StringEntry>>>( | |
226 | "ListNode[StringEntry]"); | ||
227 | #endif | ||
228 | 12 | } | |
229 | void _metadata_init_names_js() {} | ||
230 | |||
231 | void track_static() { | ||
232 | // Record the allocation count on startup | ||
233 | // so we can try to ignore static variables | ||
234 | // this will only work if `metadata_init_names` is called | ||
235 | // after the static variables got initialized | ||
236 | 12 | auto& stat = meta::stats(); | |
237 |
2/2✓ Branch 4 taken 2463 times.
✓ Branch 5 taken 12 times.
|
2475 | for (auto& s: stat) { |
238 | 2463 | s.startup_count = 0; | |
239 | // s.allocated - s.deallocated; | ||
240 | } | ||
241 | 12 | } | |
242 | |||
243 | void metadata_init_names() { static bool _ = _metadata_init_names(); } | ||
244 | |||
245 | void register_globals() { | ||
246 | { | ||
247 | 12 | metadata_init_names(); | |
248 | |||
249 | // Static globals | ||
250 | { | ||
251 | 12 | StringDatabase::instance(); | |
252 | 12 | default_precedence(); | |
253 | 12 | keywords(); | |
254 | 12 | keyword_as_string(); | |
255 | 12 | native_binary_operators(); | |
256 | 12 | native_bool_operators(); | |
257 | 12 | native_unary_operators(); | |
258 | 12 | native_cmp_operators(); | |
259 |
1/1✓ Branch 1 taken 12 times.
|
12 | operator_magic_name(BinaryOperator::Add); |
260 |
1/1✓ Branch 1 taken 12 times.
|
12 | operator_magic_name(BoolOperator::And); |
261 |
1/1✓ Branch 1 taken 12 times.
|
12 | operator_magic_name(UnaryOperator::Invert); |
262 |
1/1✓ Branch 1 taken 12 times.
|
12 | operator_magic_name(CmpOperator::Eq); |
263 | |||
264 | 12 | None(); | |
265 | 12 | True(); | |
266 | 12 | False(); | |
267 | |||
268 | 12 | strip_defaults(); | |
269 | } | ||
270 | |||
271 | // -- | ||
272 | 12 | track_static(); | |
273 | } | ||
274 | 12 | } | |
275 | |||
276 | } // namespace lython | ||
277 |