Commit 08e10724 by Ian Lance Taylor

compiler: tweaks for importing inline function bodies

    
    Track whether we've seen an error when importing a function; we will
    use error tracking to avoid knock-on errors.
    
    Stop importing identifiers at a ')'.
    
    Provide a way to adjust the indentation level while importing.
    
    Reviewed-on: https://go-review.googlesource.com/c/150072

From-SVN: r266536
parent c718ff41
267d91b41571329e71a88f56df46444b305482da b013405f2c66596c47cb9be493c798db1087c0f0
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.
...@@ -1225,7 +1225,7 @@ Import::read_identifier() ...@@ -1225,7 +1225,7 @@ Import::read_identifier()
while (true) while (true)
{ {
c = stream->peek_char(); c = stream->peek_char();
if (c == -1 || c == ' ' || c == '\n' || c == ';') if (c == -1 || c == ' ' || c == '\n' || c == ';' || c == ')')
break; break;
ret += c; ret += c;
stream->advance(1); stream->advance(1);
...@@ -1450,7 +1450,7 @@ Import_function_body::read_identifier() ...@@ -1450,7 +1450,7 @@ Import_function_body::read_identifier()
for (size_t i = start; i < this->body_.length(); i++) for (size_t i = start; i < this->body_.length(); i++)
{ {
int c = static_cast<unsigned char>(this->body_[i]); int c = static_cast<unsigned char>(this->body_[i]);
if (c == ' ' || c == '\n' || c == ';') if (c == ' ' || c == '\n' || c == ';' || c == ')')
{ {
this->off_ = i; this->off_ = i;
return this->body_.substr(start, i - start); return this->body_.substr(start, i - start);
......
...@@ -554,7 +554,7 @@ class Import_function_body : public Import_expression ...@@ -554,7 +554,7 @@ class Import_function_body : public Import_expression
const std::string& body, size_t off, Block* block, const std::string& body, size_t off, Block* block,
int indent) int indent)
: gogo_(gogo), imp_(imp), named_object_(named_object), body_(body), : gogo_(gogo), imp_(imp), named_object_(named_object), body_(body),
off_(off), block_(block), indent_(indent) off_(off), block_(block), indent_(indent), saw_error_(false)
{ } { }
// The IR. // The IR.
...@@ -597,6 +597,16 @@ class Import_function_body : public Import_expression ...@@ -597,6 +597,16 @@ class Import_function_body : public Import_expression
indent() const indent() const
{ return this->indent_; } { return this->indent_; }
// Increment the indentation level.
void
increment_indent()
{ ++this->indent_; }
// Decrement the indentation level.
void
decrement_indent()
{ --this->indent_; }
// The name of the function we are parsing. // The name of the function we are parsing.
const std::string& const std::string&
name() const; name() const;
...@@ -652,6 +662,16 @@ class Import_function_body : public Import_expression ...@@ -652,6 +662,16 @@ class Import_function_body : public Import_expression
ifb() ifb()
{ return this; } { return this; }
// Return whether we have seen an error.
bool
saw_error() const
{ return this->saw_error_; }
// Record that we have seen an error.
void
set_saw_error()
{ this->saw_error_ = true; }
private: private:
// The IR. // The IR.
Gogo* gogo_; Gogo* gogo_;
......
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