Commit 221b3e6c by Ian Lance Taylor

escape: Add escape notes to export data.

    
    Reviewed-on: https://go-review.googlesource.com/22375

From-SVN: r238266
parent 1a58b548
c8fdad389ce6f439a02fb654d231053b47ff4e02 5ea5c078829ae83bccb598772fff7c1a04e23e65
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.
...@@ -436,6 +436,21 @@ Export::write_type(const Type* type) ...@@ -436,6 +436,21 @@ Export::write_type(const Type* type)
this->type_refs_[type] = index; this->type_refs_[type] = index;
} }
// Export escape note.
void
Export::write_escape(std::string* note)
{
if (note != NULL && *note != "esc:0x0")
{
this->write_c_string(" ");
char buf[50];
go_assert(note->find("esc:") != std::string::npos);
snprintf(buf, sizeof buf, "<%s>", note->c_str());
this->write_c_string(buf);
}
}
// Add the builtin types to the export table. // Add the builtin types to the export table.
void void
......
...@@ -161,6 +161,11 @@ class Export : public String_dump ...@@ -161,6 +161,11 @@ class Export : public String_dump
void void
write_type(const Type*); write_type(const Type*);
// Write the escape note to the export stream. If NOTE is NULL, write
// nothing.
void
write_escape(std::string* note);
private: private:
Export(const Export&); Export(const Export&);
Export& operator=(const Export&); Export& operator=(const Export&);
......
...@@ -4794,6 +4794,7 @@ Function::export_func_with_type(Export* exp, const std::string& name, ...@@ -4794,6 +4794,7 @@ Function::export_func_with_type(Export* exp, const std::string& name,
exp->write_c_string("("); exp->write_c_string("(");
const Typed_identifier* receiver = fntype->receiver(); const Typed_identifier* receiver = fntype->receiver();
exp->write_name(receiver->name()); exp->write_name(receiver->name());
exp->write_escape(receiver->note());
exp->write_c_string(" "); exp->write_c_string(" ");
exp->write_type(receiver->type()); exp->write_type(receiver->type());
exp->write_c_string(") "); exp->write_c_string(") ");
...@@ -4817,6 +4818,7 @@ Function::export_func_with_type(Export* exp, const std::string& name, ...@@ -4817,6 +4818,7 @@ Function::export_func_with_type(Export* exp, const std::string& name,
else else
exp->write_c_string(", "); exp->write_c_string(", ");
exp->write_name(p->name()); exp->write_name(p->name());
exp->write_escape(p->note());
exp->write_c_string(" "); exp->write_c_string(" ");
if (!is_varargs || p + 1 != parameters->end()) if (!is_varargs || p + 1 != parameters->end())
exp->write_type(p->type()); exp->write_type(p->type());
...@@ -4850,6 +4852,7 @@ Function::export_func_with_type(Export* exp, const std::string& name, ...@@ -4850,6 +4852,7 @@ Function::export_func_with_type(Export* exp, const std::string& name,
else else
exp->write_c_string(", "); exp->write_c_string(", ");
exp->write_name(p->name()); exp->write_name(p->name());
exp->write_escape(p->note());
exp->write_c_string(" "); exp->write_c_string(" ");
exp->write_type(p->type()); exp->write_type(p->type());
} }
...@@ -4875,9 +4878,11 @@ Function::import_func(Import* imp, std::string* pname, ...@@ -4875,9 +4878,11 @@ Function::import_func(Import* imp, std::string* pname,
{ {
imp->require_c_string("("); imp->require_c_string("(");
std::string name = imp->read_name(); std::string name = imp->read_name();
std::string escape_note = imp->read_escape();
imp->require_c_string(" "); imp->require_c_string(" ");
Type* rtype = imp->read_type(); Type* rtype = imp->read_type();
*preceiver = new Typed_identifier(name, rtype, imp->location()); *preceiver = new Typed_identifier(name, rtype, imp->location());
(*preceiver)->set_note(escape_note);
imp->require_c_string(") "); imp->require_c_string(") ");
} }
...@@ -4894,6 +4899,7 @@ Function::import_func(Import* imp, std::string* pname, ...@@ -4894,6 +4899,7 @@ Function::import_func(Import* imp, std::string* pname,
while (true) while (true)
{ {
std::string name = imp->read_name(); std::string name = imp->read_name();
std::string escape_note = imp->read_escape();
imp->require_c_string(" "); imp->require_c_string(" ");
if (imp->match_c_string("...")) if (imp->match_c_string("..."))
...@@ -4905,8 +4911,9 @@ Function::import_func(Import* imp, std::string* pname, ...@@ -4905,8 +4911,9 @@ Function::import_func(Import* imp, std::string* pname,
Type* ptype = imp->read_type(); Type* ptype = imp->read_type();
if (*is_varargs) if (*is_varargs)
ptype = Type::make_array_type(ptype, NULL); ptype = Type::make_array_type(ptype, NULL);
parameters->push_back(Typed_identifier(name, ptype, Typed_identifier t = Typed_identifier(name, ptype, imp->location());
imp->location())); t.set_note(escape_note);
parameters->push_back(t);
if (imp->peek_char() != ',') if (imp->peek_char() != ',')
break; break;
go_assert(!*is_varargs); go_assert(!*is_varargs);
...@@ -4934,10 +4941,13 @@ Function::import_func(Import* imp, std::string* pname, ...@@ -4934,10 +4941,13 @@ Function::import_func(Import* imp, std::string* pname,
while (true) while (true)
{ {
std::string name = imp->read_name(); std::string name = imp->read_name();
std::string note = imp->read_escape();
imp->require_c_string(" "); imp->require_c_string(" ");
Type* rtype = imp->read_type(); Type* rtype = imp->read_type();
results->push_back(Typed_identifier(name, rtype, Typed_identifier t = Typed_identifier(name, rtype,
imp->location())); imp->location());
t.set_note(note);
results->push_back(t);
if (imp->peek_char() != ',') if (imp->peek_char() != ',')
break; break;
imp->require_c_string(", "); imp->require_c_string(", ");
......
...@@ -762,6 +762,42 @@ Import::read_type() ...@@ -762,6 +762,42 @@ Import::read_type()
return type; return type;
} }
// Read an escape note.
std::string
Import::read_escape()
{
if (this->match_c_string(" <esc:"))
{
Stream* stream = this->stream_;
this->require_c_string(" <esc:");
std::string escape = "esc:";
int c;
while (true)
{
c = stream->get_char();
if (c != 'x' && !ISXDIGIT(c))
break;
escape += c;
}
if (c != '>')
{
error_at(this->location(),
"error in import data at %d: expect %< %> or %<>%>, got %c",
stream->pos(), c);
stream->set_saw_error();
stream->advance(1);
escape = Escape_note::make_tag(Node::ESCAPE_UNKNOWN);
}
return escape;
}
else
return Escape_note::make_tag(Node::ESCAPE_UNKNOWN);
}
// Register the builtin types. // Register the builtin types.
void void
......
...@@ -197,6 +197,10 @@ class Import ...@@ -197,6 +197,10 @@ class Import
Type* Type*
read_type(); read_type();
// Read an escape note.
std::string
read_escape();
private: private:
static Stream* static Stream*
try_package_in_directory(const std::string&, Location); try_package_in_directory(const std::string&, Location);
......
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