Commit 37ed4c32 by Ian Lance Taylor

compiler: don't read known type, simplify Import::finalize_methods

    
    With the current export format, if we already know the type, we don't
    have to read and parse the definition.
    
    We only use the finalizer in Import::finalize_methods, so make it a
    local variable.  To match Finalize_methods::type, only put struct
    types into real_for_named.
    
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/197700

From-SVN: r276188
parent 51c3b7c6
27d1f3031197428b5745d09c167f982d638b8776 9112ea664ed9ee5f108158a913812adaf03edf6e
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.
...@@ -290,16 +290,10 @@ Import::Import(Stream* stream, Location location) ...@@ -290,16 +290,10 @@ Import::Import(Stream* stream, Location location)
: gogo_(NULL), stream_(stream), location_(location), package_(NULL), : gogo_(NULL), stream_(stream), location_(location), package_(NULL),
add_to_globals_(false), packages_(), type_data_(), type_pos_(0), add_to_globals_(false), packages_(), type_data_(), type_pos_(0),
type_offsets_(), builtin_types_((- SMALLEST_BUILTIN_CODE) + 1), type_offsets_(), builtin_types_((- SMALLEST_BUILTIN_CODE) + 1),
types_(), finalizer_(NULL), version_(EXPORT_FORMAT_UNKNOWN) types_(), version_(EXPORT_FORMAT_UNKNOWN)
{ {
} }
Import::~Import()
{
if (this->finalizer_ != NULL)
delete this->finalizer_;
}
// Import the data in the associated stream. // Import the data in the associated stream.
Package* Package*
...@@ -692,16 +686,22 @@ Import::read_types() ...@@ -692,16 +686,22 @@ Import::read_types()
void void
Import::finalize_methods() Import::finalize_methods()
{ {
if (this->finalizer_ == NULL) Finalize_methods finalizer(this->gogo_);
this->finalizer_ = new Finalize_methods(gogo_);
Unordered_set(Type*) real_for_named; Unordered_set(Type*) real_for_named;
for (size_t i = 1; i < this->types_.size(); i++) for (size_t i = 1; i < this->types_.size(); i++)
{ {
Type* type = this->types_[i]; Type* type = this->types_[i];
if (type != NULL && type->named_type() != NULL) if (type != NULL && type->named_type() != NULL)
{ {
this->finalizer_->type(type); finalizer.type(type);
real_for_named.insert(type->named_type()->real_type());
// If the real type is a struct type, we don't want to
// finalize its methods. For a named type defined as a
// struct type, we only want to finalize the methods of the
// named type. This is like Finalize_methods::type.
Type* real_type = type->named_type()->real_type();
if (real_type->struct_type() != NULL)
real_for_named.insert(real_type);
} }
} }
for (size_t i = 1; i < this->types_.size(); i++) for (size_t i = 1; i < this->types_.size(); i++)
...@@ -710,7 +710,7 @@ Import::finalize_methods() ...@@ -710,7 +710,7 @@ Import::finalize_methods()
if (type != NULL if (type != NULL
&& type->named_type() == NULL && type->named_type() == NULL
&& real_for_named.find(type) == real_for_named.end()) && real_for_named.find(type) == real_for_named.end())
this->finalizer_->type(type); finalizer.type(type);
} }
} }
...@@ -1105,12 +1105,12 @@ Import::read_named_type(int index) ...@@ -1105,12 +1105,12 @@ Import::read_named_type(int index)
type = this->types_[index]; type = this->types_[index];
else else
{ {
type = this->read_type();
if (no->is_type_declaration()) if (no->is_type_declaration())
{ {
// We can define the type now. // We can define the type now.
type = this->read_type();
no = package->add_type(type_name, type, this->location_); no = package->add_type(type_name, type, this->location_);
Named_type* ntype = no->type_value(); Named_type* ntype = no->type_value();
...@@ -1127,14 +1127,18 @@ Import::read_named_type(int index) ...@@ -1127,14 +1127,18 @@ Import::read_named_type(int index)
} }
else if (no->is_type()) else if (no->is_type())
{ {
// We have seen this type before. FIXME: it would be a good // We have seen this type before.
// idea to check that the two imported types are identical,
// but we have not finalized the methods yet, which means
// that we can not reliably compare interface types.
type = no->type_value(); type = no->type_value();
// Don't change the visibility of the existing type. // Don't change the visibility of the existing type.
// For older export versions, we need to skip the type
// definition in the stream.
if (this->version_ < EXPORT_FORMAT_V3)
this->read_type();
} }
else
go_unreachable();
this->types_[index] = type; this->types_[index] = type;
......
...@@ -208,8 +208,6 @@ class Import : public Import_expression ...@@ -208,8 +208,6 @@ class Import : public Import_expression
// Constructor. // Constructor.
Import(Stream*, Location); Import(Stream*, Location);
virtual ~Import();
// Register the builtin types. // Register the builtin types.
void void
register_builtin_types(Gogo*); register_builtin_types(Gogo*);
...@@ -450,8 +448,6 @@ class Import : public Import_expression ...@@ -450,8 +448,6 @@ class Import : public Import_expression
std::vector<Named_type*> builtin_types_; std::vector<Named_type*> builtin_types_;
// Mapping from exported type codes to Type structures. // Mapping from exported type codes to Type structures.
std::vector<Type*> types_; std::vector<Type*> types_;
// Helper for finalizing methods.
Finalize_methods* finalizer_;
// Version of export data we're reading. // Version of export data we're reading.
Export_data_version version_; Export_data_version version_;
}; };
......
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