GCC Code Coverage Report


Directory: ./
File: src/utilities/metadata.cpp
Date: 2023-04-27 00:55:30
Exec Total Coverage
Lines: 84 84 100.0%
Functions: 9 9 100.0%
Branches: 6 6 100.0%

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