compiler: add '$' to names in expression export data
For inlined function bodies we're going to need to refer to variables, so change the existing export data to add a '$' to names that look like identifiers: true, false, nil, convert. While we're here drop an unnecessary space character after operators. Reviewed-on: https://go-review.googlesource.com/c/150067 From-SVN: r266529
This commit is contained in:
parent
010211394d
commit
80d7d30d24
4 changed files with 51 additions and 24 deletions
|
@ -1,4 +1,4 @@
|
|||
6e0974fc6c9aa6ef19f72fbb5698e4b3734a4220
|
||||
ce81aad0e3d53215e2c0f1f060c7fd6219e6fb23
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
|
|
@ -1610,7 +1610,7 @@ class Boolean_expression : public Expression
|
|||
|
||||
void
|
||||
do_export(Export_function_body* efb) const
|
||||
{ efb->write_c_string(this->val_ ? "true" : "false"); }
|
||||
{ efb->write_c_string(this->val_ ? "$true" : "$false"); }
|
||||
|
||||
void
|
||||
do_dump_expression(Ast_dump_context* ast_dump_context) const
|
||||
|
@ -1651,6 +1651,8 @@ Boolean_expression::do_determine_type(const Type_context* context)
|
|||
Expression*
|
||||
Boolean_expression::do_import(Import_expression* imp, Location loc)
|
||||
{
|
||||
if (imp->version() >= EXPORT_FORMAT_V3)
|
||||
imp->require_c_string("$");
|
||||
if (imp->peek_char() == 't')
|
||||
{
|
||||
imp->require_c_string("true");
|
||||
|
@ -3162,7 +3164,7 @@ class Nil_expression : public Expression
|
|||
|
||||
void
|
||||
do_export(Export_function_body* efb) const
|
||||
{ efb->write_c_string("nil"); }
|
||||
{ efb->write_c_string("$nil"); }
|
||||
|
||||
void
|
||||
do_dump_expression(Ast_dump_context* ast_dump_context) const
|
||||
|
@ -3174,6 +3176,8 @@ class Nil_expression : public Expression
|
|||
Expression*
|
||||
Nil_expression::do_import(Import_expression* imp, Location loc)
|
||||
{
|
||||
if (imp->version() >= EXPORT_FORMAT_V3)
|
||||
imp->require_c_string("$");
|
||||
imp->require_c_string("nil");
|
||||
return Expression::make_nil(loc);
|
||||
}
|
||||
|
@ -3613,7 +3617,7 @@ Type_conversion_expression::do_get_backend(Translate_context* context)
|
|||
void
|
||||
Type_conversion_expression::do_export(Export_function_body* efb) const
|
||||
{
|
||||
efb->write_c_string("convert(");
|
||||
efb->write_c_string("$convert(");
|
||||
efb->write_type(this->type_);
|
||||
efb->write_c_string(", ");
|
||||
this->expr_->export_expression(efb);
|
||||
|
@ -3625,7 +3629,7 @@ Type_conversion_expression::do_export(Export_function_body* efb) const
|
|||
Expression*
|
||||
Type_conversion_expression::do_import(Import_expression* imp, Location loc)
|
||||
{
|
||||
imp->require_c_string("convert(");
|
||||
imp->require_c_string("$convert(");
|
||||
Type* type = imp->read_type();
|
||||
imp->require_c_string(", ");
|
||||
Expression* val = Expression::import_expression(imp, loc);
|
||||
|
@ -4612,16 +4616,16 @@ Unary_expression::do_export(Export_function_body* efb) const
|
|||
switch (this->op_)
|
||||
{
|
||||
case OPERATOR_PLUS:
|
||||
efb->write_c_string("+ ");
|
||||
efb->write_c_string("+");
|
||||
break;
|
||||
case OPERATOR_MINUS:
|
||||
efb->write_c_string("- ");
|
||||
efb->write_c_string("-");
|
||||
break;
|
||||
case OPERATOR_NOT:
|
||||
efb->write_c_string("! ");
|
||||
efb->write_c_string("!");
|
||||
break;
|
||||
case OPERATOR_XOR:
|
||||
efb->write_c_string("^ ");
|
||||
efb->write_c_string("^");
|
||||
break;
|
||||
case OPERATOR_AND:
|
||||
case OPERATOR_MULT:
|
||||
|
@ -4654,7 +4658,8 @@ Unary_expression::do_import(Import_expression* imp, Location loc)
|
|||
default:
|
||||
go_unreachable();
|
||||
}
|
||||
imp->require_c_string(" ");
|
||||
if (imp->version() < EXPORT_FORMAT_V3)
|
||||
imp->require_c_string(" ");
|
||||
Expression* expr = Expression::import_expression(imp, loc);
|
||||
return Expression::make_unary(op, expr, loc);
|
||||
}
|
||||
|
@ -12959,7 +12964,7 @@ Struct_construction_expression::do_get_backend(Translate_context* context)
|
|||
void
|
||||
Struct_construction_expression::do_export(Export_function_body* efb) const
|
||||
{
|
||||
efb->write_c_string("convert(");
|
||||
efb->write_c_string("$convert(");
|
||||
efb->write_type(this->type_);
|
||||
for (Expression_list::const_iterator pv = this->vals()->begin();
|
||||
pv != this->vals()->end();
|
||||
|
@ -13192,7 +13197,7 @@ Array_construction_expression::get_constructor(Translate_context* context,
|
|||
void
|
||||
Array_construction_expression::do_export(Export_function_body* efb) const
|
||||
{
|
||||
efb->write_c_string("convert(");
|
||||
efb->write_c_string("$convert(");
|
||||
efb->write_type(this->type_);
|
||||
if (this->vals() != NULL)
|
||||
{
|
||||
|
@ -13709,7 +13714,7 @@ Map_construction_expression::do_get_backend(Translate_context* context)
|
|||
void
|
||||
Map_construction_expression::do_export(Export_function_body* efb) const
|
||||
{
|
||||
efb->write_c_string("convert(");
|
||||
efb->write_c_string("$convert(");
|
||||
efb->write_type(this->type_);
|
||||
for (Expression_list::const_iterator pv = this->vals_->begin();
|
||||
pv != this->vals_->end();
|
||||
|
@ -16141,14 +16146,15 @@ Expression*
|
|||
Expression::import_expression(Import_expression* imp, Location loc)
|
||||
{
|
||||
int c = imp->peek_char();
|
||||
if (imp->match_c_string("- ")
|
||||
|| imp->match_c_string("! ")
|
||||
|| imp->match_c_string("^ "))
|
||||
if (c == '+' || c == '-' || c == '!' || c == '^')
|
||||
return Unary_expression::do_import(imp, loc);
|
||||
else if (c == '(')
|
||||
return Binary_expression::do_import(imp, loc);
|
||||
else if (imp->match_c_string("true")
|
||||
|| imp->match_c_string("false"))
|
||||
else if (imp->match_c_string("$true")
|
||||
|| imp->match_c_string("$false")
|
||||
|| (imp->version() < EXPORT_FORMAT_V3
|
||||
&& (imp->match_c_string("true")
|
||||
|| imp->match_c_string("false"))))
|
||||
return Boolean_expression::do_import(imp, loc);
|
||||
else if (c == '"')
|
||||
return String_expression::do_import(imp, loc);
|
||||
|
@ -16157,9 +16163,13 @@ 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("nil"))
|
||||
else if (imp->match_c_string("$nil")
|
||||
|| (imp->version() < EXPORT_FORMAT_V3
|
||||
&& imp->match_c_string("nil")))
|
||||
return Nil_expression::do_import(imp, loc);
|
||||
else if (imp->match_c_string("convert"))
|
||||
else if (imp->match_c_string("$convert")
|
||||
|| (imp->version() < EXPORT_FORMAT_V3
|
||||
&& imp->match_c_string("convert")))
|
||||
return Type_conversion_expression::do_import(imp, loc);
|
||||
else
|
||||
{
|
||||
|
|
|
@ -71,6 +71,10 @@ class Import_expression
|
|||
// Read a type.
|
||||
virtual Type*
|
||||
read_type() = 0;
|
||||
|
||||
// Return the version number of the export data we're reading.
|
||||
virtual Export_data_version
|
||||
version() const = 0;
|
||||
};
|
||||
|
||||
// This class manages importing Go declarations.
|
||||
|
@ -253,6 +257,10 @@ class Import : public Import_expression
|
|||
advance(size_t skip)
|
||||
{ this->stream_->advance(skip); }
|
||||
|
||||
// Return the version number of the export data we're reading.
|
||||
Export_data_version
|
||||
version() const { return this->version_; }
|
||||
|
||||
// Skip a semicolon if using an older version.
|
||||
void
|
||||
require_semicolon_if_old_version()
|
||||
|
@ -381,10 +389,6 @@ class Import : public Import_expression
|
|||
return true;
|
||||
}
|
||||
|
||||
// Return the version number of the export data we're reading.
|
||||
Export_data_version
|
||||
version() const { return this->version_; }
|
||||
|
||||
// The general IR.
|
||||
Gogo* gogo_;
|
||||
// The stream from which to read import data.
|
||||
|
@ -638,6 +642,10 @@ class Import_function_body : public Import_expression
|
|||
Type*
|
||||
read_type();
|
||||
|
||||
Export_data_version
|
||||
version() const
|
||||
{ return this->imp_->version(); }
|
||||
|
||||
// Implement Import_expression.
|
||||
Import_function_body*
|
||||
ifb()
|
||||
|
|
|
@ -282,6 +282,15 @@ func (p *parser) parseConversion(pkg *types.Package) (val constant.Value, typ ty
|
|||
// ConstValue = string | "false" | "true" | ["-"] (int ["'"] | FloatOrComplex) | Conversion .
|
||||
// FloatOrComplex = float ["i" | ("+"|"-") float "i"] .
|
||||
func (p *parser) parseConstValue(pkg *types.Package) (val constant.Value, typ types.Type) {
|
||||
// v3 changed to $false, $true, $convert, to avoid confusion
|
||||
// with variable names in inline function bodies.
|
||||
if p.tok == '$' {
|
||||
p.next()
|
||||
if p.tok != scanner.Ident {
|
||||
p.errorf("expected identifer after '$', got %s (%q)", scanner.TokenString(p.tok), p.lit)
|
||||
}
|
||||
}
|
||||
|
||||
switch p.tok {
|
||||
case scanner.String:
|
||||
str := p.parseString()
|
||||
|
|
Loading…
Add table
Reference in a new issue