summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ast/ast.cpp10
-rw-r--r--src/ast/ast.hpp20
-rw-r--r--src/ast/pattern.hpp54
-rw-r--r--src/include/serialise.hpp2
-rw-r--r--src/include/tagged_enum.hpp22
5 files changed, 48 insertions, 60 deletions
diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp
index 3eb646e5..48517095 100644
--- a/src/ast/ast.cpp
+++ b/src/ast/ast.cpp
@@ -287,11 +287,7 @@ void Crate::load_extern_crate(::std::string name)
m_extern_crates.insert( make_pair(::std::move(name), ::std::move(ret)) );
}
-SERIALISE_TYPE(Crate::, "AST_Crate", {
- s << m_load_std;
- s << m_extern_crates;
- s << m_root_module;
-},{
+SERIALISE_TYPE_A(Crate::, "AST_Crate", {
s.item(m_load_std);
s.item(m_extern_crates);
s.item(m_root_module);
@@ -441,7 +437,7 @@ void Module::add_macro_import(const Crate& crate, ::std::string modname, ::std::
void Module::iterate_functions(fcn_visitor_t *visitor, const Crate& crate)
{
- for( auto fcn_item : this->m_functions )
+ for( auto& fcn_item : this->m_functions )
{
visitor(crate, *this, fcn_item.data);
}
@@ -493,6 +489,7 @@ SERIALISE_TYPE(Static::, "AST_Static", {
case Function::CLASS_REFMETHOD: s << "REFMETHOD"; break;
case Function::CLASS_MUTMETHOD: s << "MUTMETHOD"; break;
case Function::CLASS_VALMETHOD: s << "VALMETHOD"; break;
+ case Function::CLASS_MUTVALMETHOD: s << "MUTVALMETHOD"; break;
}
return s;
}
@@ -504,6 +501,7 @@ void operator>>(::Deserialiser& s, Function::Class& fc)
else if(n == "REFMETHOD") fc = Function::CLASS_REFMETHOD;
else if(n == "MUTMETHOD") fc = Function::CLASS_MUTMETHOD;
else if(n == "VALMETHOD") fc = Function::CLASS_VALMETHOD;
+ else if(n == "MUTVALMETHOD") fc = Function::CLASS_MUTVALMETHOD;
else
throw ::std::runtime_error("Deserialise Function::Class");
}
diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp
index b38e9953..8274f22f 100644
--- a/src/ast/ast.hpp
+++ b/src/ast/ast.hpp
@@ -128,9 +128,11 @@ struct ItemNS
ItemNS():
is_pub(false)
{}
- ItemNS(::std::string&& name, T&& data, bool is_pub):
- name( move(name) ),
- data( move(data) ),
+ ItemNS(ItemNS&&) = default;
+ ItemNS(const ItemNS&) = default;
+ ItemNS(::std::string name, T data, bool is_pub):
+ name( ::std::move(name) ),
+ data( ::std::move(data) ),
is_pub( is_pub )
{
}
@@ -148,8 +150,10 @@ struct Item:
Item():
ItemNS<T>()
{}
- Item(::std::string&& name, T&& data, bool is_pub):
- ItemNS<T>( move(name), move(data), is_pub )
+ Item(Item&&) = default;
+ Item(const Item&) = default;
+ Item(::std::string name, T data, bool is_pub):
+ ItemNS<T>( ::std::move(name), ::std::move(data), is_pub )
{}
SERIALISE_TYPE_A(, "Item", {
s.item(this->name);
@@ -297,9 +301,11 @@ public:
Function():
m_fcn_class(CLASS_UNBOUND)
{}
+ Function(const Function&) = delete;
+ Function(Function&&) = default;
Function(TypeParams params, Class fcn_class, TypeRef ret_type, Arglist args):
m_fcn_class(fcn_class),
- m_params(params),
+ m_params( move(params) ),
m_rettype( move(ret_type) ),
m_args( move(args) )
{
@@ -348,7 +354,7 @@ public:
m_types.push_back( Item<TypeRef>(move(name), move(type), true) );
}
void add_function(::std::string name, Function fcn) {
- m_functions.push_back( Item<Function>(move(name), move(fcn), true) );
+ m_functions.push_back( Item<Function>(::std::move(name), ::std::move(fcn), true) );
}
SERIALISABLE_PROTOTYPES();
diff --git a/src/ast/pattern.hpp b/src/ast/pattern.hpp
index a9a944fb..fde31201 100644
--- a/src/ast/pattern.hpp
+++ b/src/ast/pattern.hpp
@@ -30,51 +30,19 @@ private:
BindType m_class;
::std::string m_binding;
Path m_path;
- unique_ptr<ExprNode> m_node;
- unique_ptr<ExprNode> m_node2; // ONLY used for range values
::std::vector<Pattern> m_sub_patterns;
TAGGED_ENUM(Data, Any,
(Any, () ),
+ (MaybeBind, () ),
(Ref, (bool mut; unique_ptr<ExprNode> sub;) ),
(Value, (unique_ptr<ExprNode> start; unique_ptr<ExprNode> end;) ),
(Tuple, (::std::vector<Pattern> sub_patterns;) ),
(StructTuple, (Path path; ::std::vector<Pattern> sub_patterns;) ),
(Struct, (Path path; ::std::vector< ::std::pair< ::std::string,Pattern> > sub_patterns;) )
- );
+ ) m_data;
public:
- Pattern(Pattern&& o) noexcept:
- m_class(o.m_class),
- m_binding( move(o.m_binding) ),
- m_path( move(o.m_path) ),
- m_node( move(o.m_node) ),
- m_sub_patterns( move(o.m_sub_patterns) )
- { }
-
- Pattern(const Pattern& o):
- m_class(o.m_class),
- m_binding(o.m_binding),
- m_path(o.m_path),
- m_node(nullptr),
- m_sub_patterns(o.m_sub_patterns)
- {
- if( o.m_node.get() ) {
- DEBUG("Cloning " << o);
- throw ::std::runtime_error(FMT("Cloning pattern with node : " << o));
- }
- }
-
- Pattern& operator=(Pattern o)
- {
- m_class = o.m_class,
- m_binding = move(o.m_binding);
- m_path = move(o.m_path);
- m_node = move(o.m_node);
- m_sub_patterns = move(o.m_sub_patterns);
- return *this;
- }
-
Pattern():
m_class(ANY)
{}
@@ -101,8 +69,7 @@ public:
struct TagValue {};
Pattern(TagValue, unique_ptr<ExprNode> node, unique_ptr<ExprNode> node2 = 0):
m_class(VALUE),
- m_node( ::std::move(node) ),
- m_node2( ::std::move(node2) )
+ m_data( Data::make_Value({ ::std::move(node), ::std::move(node2) }) )
{}
@@ -132,13 +99,22 @@ public:
m_binding = name;
}
- ::std::unique_ptr<ExprNode> take_node() { assert(m_class == VALUE); m_class = ANY; return ::std::move(m_node); }
+ ::std::unique_ptr<ExprNode> take_node() {
+ assert(m_class == VALUE);
+ m_class = ANY;
+ assert(m_data.is_Value());
+ return ::std::move(m_data.unwrap_Value().start);
+ }
// Accessors
const ::std::string& binding() const { return m_binding; }
BindType type() const { return m_class; }
- ExprNode& node() { return *m_node; }
- const ExprNode& node() const { return *m_node; }
+ ExprNode& node() {
+ return *m_data.as_Value().start;
+ }
+ const ExprNode& node() const {
+ return *m_data.as_Value().start;
+ }
Path& path() { return m_path; }
const Path& path() const { return m_path; }
::std::vector<Pattern>& sub_patterns() { return m_sub_patterns; }
diff --git a/src/include/serialise.hpp b/src/include/serialise.hpp
index 07812899..4b482f9b 100644
--- a/src/include/serialise.hpp
+++ b/src/include/serialise.hpp
@@ -173,7 +173,7 @@ public:
while(count--) {
::std::pair<T1,T2> e;
item(e);
- v.insert( e );
+ v.insert( ::std::move(e) );
}
end_array();
}
diff --git a/src/include/tagged_enum.hpp b/src/include/tagged_enum.hpp
index 07bd5881..2ef1b034 100644
--- a/src/include/tagged_enum.hpp
+++ b/src/include/tagged_enum.hpp
@@ -19,6 +19,7 @@
#define TE_CONS4(a, ...) TE_CONS a TE_CONS3(__VA_ARGS__)
#define TE_CONS5(a, ...) TE_CONS a TE_CONS4(__VA_ARGS__)
#define TE_CONS6(a, ...) TE_CONS a TE_CONS5(__VA_ARGS__)
+#define TE_CONS7(a, ...) TE_CONS a TE_CONS6(__VA_ARGS__)
// Sizes of structures
#define TE_SO(name, _) sizeof(TE_DATANAME(name))
@@ -28,6 +29,7 @@
#define MAXS4(a, b, c, d) MAX2(MAXS2(a, b), MAXS2(c, d))
#define MAXS5(a, b, c, d, e) MAX2(MAXS3(a, b, c), MAXS2(d, e))
#define MAXS6(a, b, c, d, e, f) MAX2(MAXS3(a, b, c), MAXS3(d, e, f))
+#define MAXS7(a, b, c, d, e, f, g) MAX2(MAXS3(a, b, c), MAXS4(d, e, f, g))
// Type definitions
#define TE_EXP(...) __VA_ARGS__
@@ -37,6 +39,7 @@
#define TE_TYPEDEF4(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF3(__VA_ARGS__)
#define TE_TYPEDEF5(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF4(__VA_ARGS__)
#define TE_TYPEDEF6(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF5(__VA_ARGS__)
+#define TE_TYPEDEF7(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF6(__VA_ARGS__)
#define TE_TAG(name, _) name,
#define TE_TAG2(_1,_2) TE_TAG _1 TE_TAG _2
@@ -44,6 +47,7 @@
#define TE_TAG4(_1,...) TE_TAG _1 TE_TAG3(__VA_ARGS__)
#define TE_TAG5(_1,...) TE_TAG _1 TE_TAG4(__VA_ARGS__)
#define TE_TAG6(_1,...) TE_TAG _1 TE_TAG5(__VA_ARGS__)
+#define TE_TAG7(_1,...) TE_TAG _1 TE_TAG6(__VA_ARGS__)
#define TE_DEST_CASE(tag, _) case tag: as_##tag().~TE_DATANAME(tag)(); break;
#define TE_DEST_CASE2(_1,_2) TE_DEST_CASE _1 TE_DEST_CASE _2
@@ -51,6 +55,7 @@
#define TE_DEST_CASE4(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE3(__VA_ARGS__)
#define TE_DEST_CASE5(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE4(__VA_ARGS__)
#define TE_DEST_CASE6(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE5(__VA_ARGS__)
+#define TE_DEST_CASE7(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE6(__VA_ARGS__)
#define TE_MOVE_CASE(tag, _) case tag: new(m_data) TE_DATANAME(tag)(x.unwrap_##tag()); break;
#define TE_MOVE_CASE2(_1,_2) TE_MOVE_CASE _1 TE_MOVE_CASE _2
@@ -58,16 +63,17 @@
#define TE_MOVE_CASE4(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE3(__VA_ARGS__)
#define TE_MOVE_CASE5(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE4(__VA_ARGS__)
#define TE_MOVE_CASE6(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE5(__VA_ARGS__)
+#define TE_MOVE_CASE7(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE6(__VA_ARGS__)
// Macro to obtain a numbered macro for argument counts
-#define TE_GM(SUF,_1,_2,_3,_4,_5,_6,COUNT,...) SUF##COUNT
+#define TE_GM(SUF,_1,_2,_3,_4,_5,_6,_7,COUNT,...) SUF##COUNT
-#define MAXS(...) TE_GM(MAXS ,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
-#define TE_TYPEDEFS(...) TE_GM(TE_TYPEDEF ,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
-#define TE_TAGS(...) TE_GM(TE_TAG ,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
-#define TE_DEST_CASES(...) TE_GM(TE_DEST_CASE,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
-#define TE_MOVE_CASES(...) TE_GM(TE_MOVE_CASE,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
-#define TE_CONSS(...) TE_GM(TE_CONS ,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
+#define MAXS(...) TE_GM(MAXS ,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
+#define TE_TYPEDEFS(...) TE_GM(TE_TYPEDEF ,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
+#define TE_TAGS(...) TE_GM(TE_TAG ,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
+#define TE_DEST_CASES(...) TE_GM(TE_DEST_CASE,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
+#define TE_MOVE_CASES(...) TE_GM(TE_MOVE_CASE,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
+#define TE_CONSS(...) TE_GM(TE_CONS ,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
#define TAGGED_ENUM(_name, _def, ...) \
class _name { \
@@ -79,7 +85,9 @@ class _name { \
char m_data[MAXS(__VA_ARGS__)]; \
public:\
_name(): m_tag(_def) {}\
+ _name(const _name&) = delete; \
_name(_name&& x): m_tag(x.m_tag) { x.m_tag = _def; switch(m_tag) { TE_MOVE_CASES(__VA_ARGS__) } } \
+ _name& operator =(_name&& x) { this->~_name(); m_tag = x.m_tag; x.m_tag = _def; switch(m_tag) { TE_MOVE_CASES(__VA_ARGS__) }; return *this; } \
~_name() { switch(m_tag) { TE_DEST_CASES(__VA_ARGS__) } } \
TE_CONSS(__VA_ARGS__) \
}