compiler: export type for string and bool constants
Also consolidate the identical code for constant type export into a pair of static methods. Fixes golang/go#35739 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/262437
This commit is contained in:
parent
b7beab8282
commit
4f4f649d66
@ -1,4 +1,4 @@
|
||||
b73a8f17dfe8d7c7ecc9ccd0317be5abe71c5509
|
||||
94808b9af5cd9b9102ae9680a0e5f124c6793815
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
@ -1823,6 +1823,31 @@ Expression::make_unknown_reference(Named_object* no, Location location)
|
||||
return new Unknown_expression(no, location);
|
||||
}
|
||||
|
||||
// Start exporting a type conversion for a constant, if needed. This
|
||||
// returns whether we need to export a closing parenthesis.
|
||||
|
||||
bool
|
||||
Expression::export_constant_type(Export_function_body* efb, Type* type)
|
||||
{
|
||||
if (type == NULL
|
||||
|| type->is_abstract()
|
||||
|| type == efb->type_context())
|
||||
return false;
|
||||
efb->write_c_string("$convert(");
|
||||
efb->write_type(type);
|
||||
efb->write_c_string(", ");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Finish a type conversion for a constant.
|
||||
|
||||
void
|
||||
Expression::finish_export_constant_type(Export_function_body* efb, bool needed)
|
||||
{
|
||||
if (needed)
|
||||
efb->write_c_string(")");
|
||||
}
|
||||
|
||||
// A boolean expression.
|
||||
|
||||
class Boolean_expression : public Expression
|
||||
@ -1878,8 +1903,7 @@ class Boolean_expression : public Expression
|
||||
{ return 1; }
|
||||
|
||||
void
|
||||
do_export(Export_function_body* efb) const
|
||||
{ efb->write_c_string(this->val_ ? "$true" : "$false"); }
|
||||
do_export(Export_function_body* efb) const;
|
||||
|
||||
void
|
||||
do_dump_expression(Ast_dump_context* ast_dump_context) const
|
||||
@ -1926,6 +1950,16 @@ Boolean_expression::do_determine_type(const Type_context* context)
|
||||
this->type_ = Type::lookup_bool_type();
|
||||
}
|
||||
|
||||
// Export a boolean constant.
|
||||
|
||||
void
|
||||
Boolean_expression::do_export(Export_function_body* efb) const
|
||||
{
|
||||
bool exported_type = Expression::export_constant_type(efb, this->type_);
|
||||
efb->write_c_string(this->val_ ? "$true" : "$false");
|
||||
Expression::finish_export_constant_type(efb, exported_type);
|
||||
}
|
||||
|
||||
// Import a boolean constant.
|
||||
|
||||
Expression*
|
||||
@ -2055,7 +2089,9 @@ String_expression::export_string(String_dump* exp,
|
||||
void
|
||||
String_expression::do_export(Export_function_body* efb) const
|
||||
{
|
||||
bool exported_type = Expression::export_constant_type(efb, this->type_);
|
||||
String_expression::export_string(efb, this);
|
||||
Expression::finish_export_constant_type(efb, exported_type);
|
||||
}
|
||||
|
||||
// Import a string expression.
|
||||
@ -2547,16 +2583,7 @@ Integer_expression::export_integer(String_dump* exp, const mpz_t val)
|
||||
void
|
||||
Integer_expression::do_export(Export_function_body* efb) const
|
||||
{
|
||||
bool added_type = false;
|
||||
if (this->type_ != NULL
|
||||
&& !this->type_->is_abstract()
|
||||
&& this->type_ != efb->type_context())
|
||||
{
|
||||
efb->write_c_string("$convert(");
|
||||
efb->write_type(this->type_);
|
||||
efb->write_c_string(", ");
|
||||
added_type = true;
|
||||
}
|
||||
bool exported_type = Expression::export_constant_type(efb, this->type_);
|
||||
|
||||
Integer_expression::export_integer(efb, this->val_);
|
||||
if (this->is_character_constant_)
|
||||
@ -2564,8 +2591,7 @@ Integer_expression::do_export(Export_function_body* efb) const
|
||||
// A trailing space lets us reliably identify the end of the number.
|
||||
efb->write_c_string(" ");
|
||||
|
||||
if (added_type)
|
||||
efb->write_c_string(")");
|
||||
Expression::finish_export_constant_type(efb, exported_type);
|
||||
}
|
||||
|
||||
// Import an integer, floating point, or complex value. This handles
|
||||
@ -2953,23 +2979,13 @@ Float_expression::export_float(String_dump *exp, const mpfr_t val)
|
||||
void
|
||||
Float_expression::do_export(Export_function_body* efb) const
|
||||
{
|
||||
bool added_type = false;
|
||||
if (this->type_ != NULL
|
||||
&& !this->type_->is_abstract()
|
||||
&& this->type_ != efb->type_context())
|
||||
{
|
||||
efb->write_c_string("$convert(");
|
||||
efb->write_type(this->type_);
|
||||
efb->write_c_string(", ");
|
||||
added_type = true;
|
||||
}
|
||||
bool exported_type = Expression::export_constant_type(efb, this->type_);
|
||||
|
||||
Float_expression::export_float(efb, this->val_);
|
||||
// A trailing space lets us reliably identify the end of the number.
|
||||
efb->write_c_string(" ");
|
||||
|
||||
if (added_type)
|
||||
efb->write_c_string(")");
|
||||
Expression::finish_export_constant_type(efb, exported_type);
|
||||
}
|
||||
|
||||
// Dump a floating point number to the dump file.
|
||||
@ -3184,23 +3200,13 @@ Complex_expression::export_complex(String_dump* exp, const mpc_t val)
|
||||
void
|
||||
Complex_expression::do_export(Export_function_body* efb) const
|
||||
{
|
||||
bool added_type = false;
|
||||
if (this->type_ != NULL
|
||||
&& !this->type_->is_abstract()
|
||||
&& this->type_ != efb->type_context())
|
||||
{
|
||||
efb->write_c_string("$convert(");
|
||||
efb->write_type(this->type_);
|
||||
efb->write_c_string(", ");
|
||||
added_type = true;
|
||||
}
|
||||
bool exported_type = Expression::export_constant_type(efb, this->type_);
|
||||
|
||||
Complex_expression::export_complex(efb, this->val_);
|
||||
// A trailing space lets us reliably identify the end of the number.
|
||||
efb->write_c_string(" ");
|
||||
|
||||
if (added_type)
|
||||
efb->write_c_string(")");
|
||||
Expression::finish_export_constant_type(efb, exported_type);
|
||||
}
|
||||
|
||||
// Dump a complex expression to the dump file.
|
||||
|
@ -1237,6 +1237,14 @@ class Expression
|
||||
virtual void
|
||||
do_dump_expression(Ast_dump_context*) const = 0;
|
||||
|
||||
// Start exporting a type conversion for a constant, if needed.
|
||||
static bool
|
||||
export_constant_type(Export_function_body*, Type*);
|
||||
|
||||
// Finish exporting a type conversion for a constant.
|
||||
static void
|
||||
finish_export_constant_type(Export_function_body*, bool);
|
||||
|
||||
// Varargs lowering creates a slice object (unnamed compiler temp)
|
||||
// to contain the variable length collection of values. The enum
|
||||
// below tells the lowering routine whether it can mark that temp
|
||||
|
Loading…
Reference in New Issue
Block a user