diff options
-rw-r--r-- | gcc/go/gofrontend/types.cc | 50 | ||||
-rw-r--r-- | libgo/go/reflect/type.go | 8 | ||||
-rw-r--r-- | libgo/runtime/go-typedesc-equal.c | 11 |
3 files changed, 20 insertions, 49 deletions
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index e93c681..7a7a103 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -2253,22 +2253,7 @@ Type::uncommon_type_constructor(Gogo* gogo, Type* uncommon_type, const std::string& pkgpath(package == NULL ? gogo->pkgpath() : package->pkgpath()); - n.assign(pkgpath); - unsigned int index; - const Named_object* in_function = name->in_function(&index); - if (in_function != NULL) - { - n.append(1, '.'); - n.append(Gogo::unpack_hidden_name(in_function->name())); - if (index > 0) - { - char buf[30]; - snprintf(buf, sizeof buf, "%u", index); - n.append(1, '.'); - n.append(buf); - } - } - s = Expression::make_string(n, bloc); + s = Expression::make_string(pkgpath, bloc); vals->push_back(Expression::make_unary(OPERATOR_AND, s, bloc)); } } @@ -9102,22 +9087,17 @@ Named_type::do_reflection(Gogo* gogo, std::string* ret) const } if (!this->is_builtin()) { - // We handle -fgo-prefix and -fgo-pkgpath differently here for - // compatibility with how the compiler worked before - // -fgo-pkgpath was introduced. When -fgo-pkgpath is specified, - // we use it to make a unique reflection string, so that the - // type canonicalization in the reflect package will work. In - // order to be compatible with the gc compiler, we put tabs into - // the package path, so that the reflect methods can discard it. + // When -fgo-pkgpath or -fgo-prefix is specified, we use it to + // make a unique reflection string, so that the type + // canonicalization in the reflect package will work. In order + // to be compatible with the gc compiler, we put tabs into the + // package path, so that the reflect methods can discard it. const Package* package = this->named_object_->package(); - if (gogo->pkgpath_from_option()) - { - ret->push_back('\t'); - ret->append(package != NULL - ? package->pkgpath_symbol() - : gogo->pkgpath_symbol()); - ret->push_back('\t'); - } + ret->push_back('\t'); + ret->append(package != NULL + ? package->pkgpath_symbol() + : gogo->pkgpath_symbol()); + ret->push_back('\t'); ret->append(package != NULL ? package->package_name() : gogo->package_name()); @@ -9126,6 +9106,14 @@ Named_type::do_reflection(Gogo* gogo, std::string* ret) const if (this->in_function_ != NULL) { ret->push_back('\t'); + const Typed_identifier* rcvr = + this->in_function_->func_value()->type()->receiver(); + if (rcvr != NULL) + { + Named_type* rcvr_type = rcvr->type()->deref()->named_type(); + ret->append(Gogo::unpack_hidden_name(rcvr_type->name())); + ret->push_back('.'); + } ret->append(Gogo::unpack_hidden_name(this->in_function_->name())); ret->push_back('$'); if (this->in_function_index_ > 0) diff --git a/libgo/go/reflect/type.go b/libgo/go/reflect/type.go index 5cbf7e5..7f0c6a8 100644 --- a/libgo/go/reflect/type.go +++ b/libgo/go/reflect/type.go @@ -1940,13 +1940,7 @@ func canonicalize(t Type) Type { if t == nil { return nil } - u := t.uncommon() - var s string - if u == nil || u.PkgPath() == "" { - s = t.rawString() - } else { - s = u.PkgPath() + "." + u.Name() - } + s := t.rawString() canonicalTypeLock.RLock() if r, ok := canonicalType[s]; ok { canonicalTypeLock.RUnlock() diff --git a/libgo/runtime/go-typedesc-equal.c b/libgo/runtime/go-typedesc-equal.c index f8474fc..90079f2 100644 --- a/libgo/runtime/go-typedesc-equal.c +++ b/libgo/runtime/go-typedesc-equal.c @@ -24,16 +24,5 @@ __go_type_descriptors_equal (const struct __go_type_descriptor *td1, return 0; if (td1->__code != td2->__code || td1->__hash != td2->__hash) return 0; - if (td1->__uncommon != NULL && td1->__uncommon->__name != NULL) - { - if (td2->__uncommon == NULL || td2->__uncommon->__name == NULL) - return 0; - return (__go_ptr_strings_equal (td1->__uncommon->__name, - td2->__uncommon->__name) - && __go_ptr_strings_equal (td1->__uncommon->__pkg_path, - td2->__uncommon->__pkg_path)); - } - if (td2->__uncommon != NULL && td2->__uncommon->__name != NULL) - return 0; return __go_ptr_strings_equal (td1->__reflection, td2->__reflection); } |