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
This commit is contained in:
Ian Lance Taylor 2019-05-10 19:41:55 +00:00
parent c735deb4fa
commit 4f3952228a
3 changed files with 32 additions and 1 deletions

View File

@ -1,4 +1,4 @@
b5e4ba88a2e7f3c34e9183f43370c38ea639c393
76ab85364745e445498fe53f9ca8e37b49650779
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View File

@ -15423,6 +15423,15 @@ Receive_expression::do_get_backend(Translate_context* 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.
void
@ -15432,6 +15441,16 @@ Receive_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
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.
Receive_expression*
@ -16783,6 +16802,8 @@ Expression::import_expression(Import_expression* imp, Location loc)
// This handles integers, floats and complex constants.
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")
|| (imp->version() < EXPORT_FORMAT_V3
&& imp->match_c_string("nil")))

View File

@ -3982,6 +3982,9 @@ class Receive_expression : public Expression
channel()
{ return this->channel_; }
static Expression*
do_import(Import_expression*, Location);
protected:
int
do_traverse(Traverse* traverse)
@ -4010,6 +4013,10 @@ class Receive_expression : public Expression
return Expression::make_receive(this->channel_->copy(), this->location());
}
int
do_inlining_cost() const
{ return 1; }
bool
do_must_eval_in_order() const
{ return true; }
@ -4017,6 +4024,9 @@ class Receive_expression : public Expression
Bexpression*
do_get_backend(Translate_context*);
void
do_export(Export_function_body*) const;
void
do_dump_expression(Ast_dump_context*) const;