Commit 4f395222 by Ian Lance Taylor

compiler: permit inlining receive expressions

    
    This does not permit any new inlinable functions in the standard library.
    
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/176637

From-SVN: r271074
parent c735deb4
b5e4ba88a2e7f3c34e9183f43370c38ea639c393 76ab85364745e445498fe53f9ca8e37b49650779
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -15423,6 +15423,15 @@ Receive_expression::do_get_backend(Translate_context* context) ...@@ -15423,6 +15423,15 @@ Receive_expression::do_get_backend(Translate_context* context)
return Expression::make_compound(recv, recv_ref, loc)->get_backend(context); return Expression::make_compound(recv, recv_ref, loc)->get_backend(context);
} }
// Export a receive expression.
void
Receive_expression::do_export(Export_function_body* efb) const
{
efb->write_c_string("<-");
this->channel_->export_expression(efb);
}
// Dump ast representation for a receive expression. // Dump ast representation for a receive expression.
void void
...@@ -15432,6 +15441,16 @@ Receive_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const ...@@ -15432,6 +15441,16 @@ Receive_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
ast_dump_context->dump_expression(channel_); ast_dump_context->dump_expression(channel_);
} }
// Import a receive expression.
Expression*
Receive_expression::do_import(Import_expression* imp, Location loc)
{
imp->require_c_string("<-");
Expression* expr = Expression::import_expression(imp, loc);
return Expression::make_receive(expr, loc);
}
// Make a receive expression. // Make a receive expression.
Receive_expression* Receive_expression*
...@@ -16783,6 +16802,8 @@ Expression::import_expression(Import_expression* imp, Location loc) ...@@ -16783,6 +16802,8 @@ Expression::import_expression(Import_expression* imp, Location loc)
// This handles integers, floats and complex constants. // This handles integers, floats and complex constants.
return Integer_expression::do_import(imp, loc); return Integer_expression::do_import(imp, loc);
} }
else if (imp->match_c_string("<-"))
return Receive_expression::do_import(imp, loc);
else if (imp->match_c_string("$nil") else if (imp->match_c_string("$nil")
|| (imp->version() < EXPORT_FORMAT_V3 || (imp->version() < EXPORT_FORMAT_V3
&& imp->match_c_string("nil"))) && imp->match_c_string("nil")))
......
...@@ -3982,6 +3982,9 @@ class Receive_expression : public Expression ...@@ -3982,6 +3982,9 @@ class Receive_expression : public Expression
channel() channel()
{ return this->channel_; } { return this->channel_; }
static Expression*
do_import(Import_expression*, Location);
protected: protected:
int int
do_traverse(Traverse* traverse) do_traverse(Traverse* traverse)
...@@ -4010,6 +4013,10 @@ class Receive_expression : public Expression ...@@ -4010,6 +4013,10 @@ class Receive_expression : public Expression
return Expression::make_receive(this->channel_->copy(), this->location()); return Expression::make_receive(this->channel_->copy(), this->location());
} }
int
do_inlining_cost() const
{ return 1; }
bool bool
do_must_eval_in_order() const do_must_eval_in_order() const
{ return true; } { return true; }
...@@ -4018,6 +4025,9 @@ class Receive_expression : public Expression ...@@ -4018,6 +4025,9 @@ class Receive_expression : public Expression
do_get_backend(Translate_context*); do_get_backend(Translate_context*);
void void
do_export(Export_function_body*) const;
void
do_dump_expression(Ast_dump_context*) const; do_dump_expression(Ast_dump_context*) const;
private: private:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment