summaryrefslogtreecommitdiff
path: root/src/ast/provided_module.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast/provided_module.cpp')
-rw-r--r--src/ast/provided_module.cpp49
1 files changed, 33 insertions, 16 deletions
diff --git a/src/ast/provided_module.cpp b/src/ast/provided_module.cpp
index f8e53bdf..460b7494 100644
--- a/src/ast/provided_module.cpp
+++ b/src/ast/provided_module.cpp
@@ -2,7 +2,11 @@
*/
#include "ast.hpp"
+void AST_InitProvidedModule_Impls();
+
AST::Module g_compiler_module;
+AST::Path g_copy_marker_path;
+AST::Path g_sized_marker_path;
void AST_InitProvidedModule()
{
@@ -12,31 +16,44 @@ void AST_InitProvidedModule()
AST::StructItem("", TypeRef(TypeRef::TagUnsizedArray(), TypeRef(CORETYPE_U8)), false),
}));
- AST::Path copy_marker_path({AST::PathNode("marker"),AST::PathNode("Copy")});
+ // TODO: Defer this until AFTER
+ AST_InitProvidedModule_Impls();
+}
+
+void AST_InitProvidedModule_Impls()
+{
+ if( !g_copy_marker_path.is_valid() ) {
+ g_copy_marker_path = AST::Path( {AST::PathNode("marker"),AST::PathNode("Copy")} );
+ }
+
+ if( !g_sized_marker_path.is_valid() ) {
+ g_sized_marker_path = AST::Path( {AST::PathNode("marker"),AST::PathNode("Sized")} );
+ }
+
#define impl(trait, type) \
g_compiler_module.add_impl(AST::Impl(AST::MetaItems(), AST::TypeParams(), type, trait))
- impl(copy_marker_path, TypeRef(CORETYPE_U8));
- impl(copy_marker_path, TypeRef(CORETYPE_U16));
- impl(copy_marker_path, TypeRef(CORETYPE_U32));
- impl(copy_marker_path, TypeRef(CORETYPE_U64));
- impl(copy_marker_path, TypeRef(CORETYPE_UINT));
- impl(copy_marker_path, TypeRef(CORETYPE_I8));
- impl(copy_marker_path, TypeRef(CORETYPE_I16));
- impl(copy_marker_path, TypeRef(CORETYPE_I32));
- impl(copy_marker_path, TypeRef(CORETYPE_I64));
- impl(copy_marker_path, TypeRef(CORETYPE_INT));
- impl(copy_marker_path, TypeRef(CORETYPE_F32));
- impl(copy_marker_path, TypeRef(CORETYPE_F64));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_U8));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_U16));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_U32));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_U64));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_UINT));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_I8));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_I16));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_I32));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_I64));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_INT));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_F32));
+ impl(g_copy_marker_path, TypeRef(CORETYPE_F64));
// A hacky default impl of 'Sized', with a negative impl on [T]
- AST::Path sized_marker_path({AST::PathNode("marker"),AST::PathNode("Sized")});
- impl(sized_marker_path, TypeRef());
+ impl(g_sized_marker_path, TypeRef());
+
{
AST::TypeParams tps;
tps.add_ty_param( AST::TypeParam("T") );
g_compiler_module.add_neg_impl(AST::ImplDef(
AST::MetaItems(), ::std::move(tps),
- sized_marker_path,
+ g_sized_marker_path,
TypeRef(TypeRef::TagUnsizedArray(), TypeRef(TypeRef::TagArg(), "T"))
));
}