compiler: permit inlining receive expressions
This does not permit any new inlinable functions in the standard library.
Change-Id: Iae19b3b061db862b9991074f8172e30070cd550f
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/176637
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/go/expressions.cc b/go/expressions.cc
index ed65852..54f6e52 100644
--- a/go/expressions.cc
+++ b/go/expressions.cc
@@ -15423,6 +15423,15 @@
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 @@
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 @@
// 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")))
diff --git a/go/expressions.h b/go/expressions.h
index 2cca824..9ed81f1 100644
--- a/go/expressions.h
+++ b/go/expressions.h
@@ -3982,6 +3982,9 @@
channel()
{ return this->channel_; }
+ static Expression*
+ do_import(Import_expression*, Location);
+
protected:
int
do_traverse(Traverse* traverse)
@@ -4010,6 +4013,10 @@
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; }
@@ -4018,6 +4025,9 @@
do_get_backend(Translate_context*);
void
+ do_export(Export_function_body*) const;
+
+ void
do_dump_expression(Ast_dump_context*) const;
private: