diff options
author | John Hodge <tpg@mutabah.net> | 2016-09-01 11:29:22 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-09-01 11:29:22 +0800 |
commit | def3719f94f1bed17b6018975b9919c46ca43f16 (patch) | |
tree | 0e568393a12ca17828d5d442074217c81a6bd0ee /src | |
parent | 09b5d7303ddc4638e2f2ba2a9037cb329784aacd (diff) | |
download | mrust-def3719f94f1bed17b6018975b9919c46ca43f16.tar.gz |
Expand - Support box operator (untested)
Diffstat (limited to 'src')
-rw-r--r-- | src/common.hpp | 8 | ||||
-rw-r--r-- | src/expand/mod.cpp | 69 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 8 | ||||
-rw-r--r-- | src/hir/from_ast_expr.cpp | 2 | ||||
-rw-r--r-- | src/main.cpp | 4 |
5 files changed, 86 insertions, 5 deletions
diff --git a/src/common.hpp b/src/common.hpp index bea299bf..35113670 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -34,6 +34,14 @@ template<typename T> rv.push_back( mv$(v) ); return rv; } +template<typename T> +::std::vector<T> make_vec2(T v1, T v2) { + ::std::vector<T> rv; + rv.reserve(2); + rv.push_back( mv$(v1) ); + rv.push_back( mv$(v2) ); + return rv; +} enum Ordering { diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index dad84423..7f2dc06a 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -494,7 +494,7 @@ struct CExpandExpr: } void visit(::AST::ExprNode_UniOp& node) override { this->visit_nodelete(node, node.m_value); - // - Desugar question mark operator before resolve? + // - Desugar question mark operator before resolve so it can create names if( node.m_type == ::AST::ExprNode_UniOp::QMARK ) { auto core_crate = (crate.m_load_std == ::AST::Crate::LOAD_NONE ? "" : "core"); auto path_Ok = ::AST::Path(core_crate, {::AST::PathNode("result"), ::AST::PathNode("Result"), ::AST::PathNode("Ok")}); @@ -537,6 +537,73 @@ struct CExpandExpr: replacement.reset(new ::AST::ExprNode_Match( mv$(node.m_value), mv$(arms) )); } + else if( node.m_type == ::AST::ExprNode_UniOp::BOX ) + { + // TODO: Should this be a desugar, or a HIR/MIR operation? + // - The only avaliable language item is `exchange_malloc` + // TODO: These should be language items (but are not) + auto core_crate = (crate.m_load_std == ::AST::Crate::LOAD_NONE ? "" : "core"); + auto path_Place = ::AST::Path(core_crate, {::AST::PathNode("ops"), ::AST::PathNode("Place")}); + auto path_BoxPlace = ::AST::Path(core_crate, {::AST::PathNode("ops"), ::AST::PathNode("BoxPlace")}); + auto path_Boxed = ::AST::Path(core_crate, {::AST::PathNode("ops"), ::AST::PathNode("Boxed")}); + auto path_ptr_write= ::AST::Path(core_crate, {::AST::PathNode("intrinsics"), ::AST::PathNode("move_val_init")}); + ::std::vector< ::AST::ExprNodeP> nodes; + // `let mut place = BoxPlace::make_place();` + nodes.push_back(::AST::ExprNodeP(new ::AST::ExprNode_LetBinding( + ::AST::Pattern(AST::Pattern::TagBind(), "place#box", ::AST::PatternBinding::Type::MOVE, true), + ::TypeRef(), + ::AST::ExprNodeP(new ::AST::ExprNode_CallPath( + ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), ::AST::Path(path_BoxPlace), {::AST::PathNode("make_place")}), + {} + )) + ))); + // `let raw_place = Place::pointer(&mut place);` + nodes.push_back(::AST::ExprNodeP(new ::AST::ExprNode_LetBinding( + ::AST::Pattern(AST::Pattern::TagBind(), "raw_place#box", ::AST::PatternBinding::Type::MOVE, false), + ::TypeRef(), + ::AST::ExprNodeP(new ::AST::ExprNode_CallPath( + ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), ::AST::Path(path_Place), {::AST::PathNode("pointer")}), + ::make_vec1( + ::AST::ExprNodeP(new ::AST::ExprNode_UniOp(::AST::ExprNode_UniOp::REFMUT, + ::AST::ExprNodeP(new ::AST::ExprNode_NamedValue( ::AST::Path("place#box") )) + )) + ) + )) + ))); + // `let value = EXPR;` + nodes.push_back(::AST::ExprNodeP(new ::AST::ExprNode_LetBinding( + ::AST::Pattern(AST::Pattern::TagBind(), "value#box", ::AST::PatternBinding::Type::MOVE, false), + ::TypeRef(), + mv$( node.m_value ) + ))); + // `unsafe {` + { + ::std::vector< ::AST::ExprNodeP> nodes_unsafe; + // `::std::ptr::write(raw_place, value);` + nodes_unsafe.push_back(::AST::ExprNodeP(new ::AST::ExprNode_CallPath( + ::AST::Path(path_ptr_write), + ::make_vec2( + ::AST::ExprNodeP(new ::AST::ExprNode_NamedValue( ::AST::Path("raw_place#box") )), + ::AST::ExprNodeP(new ::AST::ExprNode_NamedValue( ::AST::Path("value#box") )) + ) + ))); + // `Boxed::finalize(place)` + nodes_unsafe.push_back(::AST::ExprNodeP(new ::AST::ExprNode_CallPath( + ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), ::AST::Path(path_Boxed), {::AST::PathNode("finalize")}), + ::make_vec1( + ::AST::ExprNodeP(new ::AST::ExprNode_NamedValue( ::AST::Path("place#box") )) + ) + ))); + // `}` + for(auto& n : nodes_unsafe) + n->set_pos( node.get_pos() ); + nodes.push_back(::AST::ExprNodeP(new ::AST::ExprNode_Block( mv$(nodes_unsafe), nullptr ))); + dynamic_cast< ::AST::ExprNode_Block&>(*nodes.back()).m_is_unsafe = true; + } + for(auto& n : nodes) + n->set_pos( node.get_pos() ); + replacement.reset(new ::AST::ExprNode_Block( mv$(nodes), nullptr )); + } } }; diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp index 359d6ed9..930c549f 100644 --- a/src/hir/from_ast.cpp +++ b/src/hir/from_ast.cpp @@ -200,6 +200,7 @@ BUG(pat.span(), "Encountered StructTuple pattern not pointing to a enum variant or a struct - " << e.path); ), (EnumVar, + assert( pb.enum_ ); const auto& var = pb.enum_->variants()[pb.idx].m_data; unsigned int field_count = var.as_Tuple().m_sub_types.size(); ::std::vector<HIR::Pattern> sub_patterns; @@ -239,6 +240,7 @@ }; ), (Struct, + assert( pb.struct_ ); unsigned int field_count = pb.struct_->m_data.as_Tuple().ents.size(); ::std::vector<HIR::Pattern> sub_patterns; @@ -674,7 +676,11 @@ ::HIR::TypeRef::Data::Data_TraitObject v; for(const auto& t : e.traits) { - if( t.binding().as_Trait().trait_->is_marker() ) { + const auto& tb = t.binding().as_Trait(); + if( tb.trait_ && tb.trait_->is_marker() ) { + v.m_markers.push_back( LowerHIR_GenericPath(ty.span(), t) ); + } + else if( tb.hir && tb.hir->m_is_marker ) { v.m_markers.push_back( LowerHIR_GenericPath(ty.span(), t) ); } else { diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp index f8d3fd69..a2d0be99 100644 --- a/src/hir/from_ast_expr.cpp +++ b/src/hir/from_ast_expr.cpp @@ -188,7 +188,7 @@ struct LowerHIR_ExprNode_Visitor: switch(v.m_type) { case ::AST::ExprNode_UniOp::BOX: - TODO(v.get_pos(), "Desugar box"); + BUG(v.get_pos(), "Encounterd box operator (should have been expanded in AST)"); break; case ::AST::ExprNode_UniOp::QMARK: BUG(v.get_pos(), "Encounterd question mark operator (should have been expanded in AST)"); diff --git a/src/main.cpp b/src/main.cpp index 6361a3b0..6d056fd4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -35,8 +35,8 @@ void init_debug_list() g_debug_disable_map.insert( "Expand" );
g_debug_disable_map.insert( "Resolve Use" );
- //g_debug_disable_map.insert( "Resolve Index" );
- //g_debug_disable_map.insert( "Resolve Absolute" );
+ g_debug_disable_map.insert( "Resolve Index" );
+ g_debug_disable_map.insert( "Resolve Absolute" );
g_debug_disable_map.insert( "HIR Lower" );
|