| 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 |