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
This commit is contained in:
parent
51c3b7c6ec
commit
37ed4c3269
|
@ -1,4 +1,4 @@
|
||||||
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)
|
||||||
: 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()
|
||||||
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()
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
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
|
||||||
// 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
|
||||||
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_;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue