diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-06-12 20:33:22 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-06-12 20:33:22 +0000 |
commit | b3e2a6c9a7ee815324c4902eb65f75152989ad61 (patch) | |
tree | 33b14dcd566e3f484c612221423ad78d80bfe383 | |
parent | c0521a10c50156c94b2e80b7e5ce40763dde66e8 (diff) | |
download | ppe42-gcc-b3e2a6c9a7ee815324c4902eb65f75152989ad61.tar.gz ppe42-gcc-b3e2a6c9a7ee815324c4902eb65f75152989ad61.zip |
compiler, reflect: Handle package path like gc compiler.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188482 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/go/gofrontend/gogo.cc | 11 | ||||
-rw-r--r-- | gcc/go/gofrontend/types.cc | 21 | ||||
-rw-r--r-- | libgo/go/encoding/xml/marshal_test.go | 2 | ||||
-rw-r--r-- | libgo/go/html/template/escape_test.go | 2 | ||||
-rw-r--r-- | libgo/go/reflect/type.go | 24 |
5 files changed, 47 insertions, 13 deletions
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index 80ffe240c7f..6e9b8c124aa 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -339,9 +339,14 @@ Gogo::set_package_name(const std::string& package_name, // symbol names. if (!this->pkgpath_set_) { - if (!this->prefix_from_option_) - this->prefix_ = "go"; - this->pkgpath_ = this->prefix_ + '.' + package_name; + if (!this->prefix_from_option_ && package_name == "main") + this->pkgpath_ = package_name; + else + { + if (!this->prefix_from_option_) + this->prefix_ = "go"; + this->pkgpath_ = this->prefix_ + '.' + package_name; + } this->pkgpath_set_ = true; } diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index c2e5ed8b9ed..ff6b5bddbd2 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -8337,14 +8337,23 @@ Named_type::do_reflection(Gogo* gogo, std::string* ret) const { // We handle -fgo-prefix and -fgo-pkgpath differently here for // compatibility with how the compiler worked before - // -fgo-pkgpath was introduced. + // -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 quote the + // package path, so that the reflect methods can discard it. const Package* package = this->named_object_->package(); if (gogo->pkgpath_from_option()) - ret->append(package != NULL ? package->pkgpath() : gogo->pkgpath()); - else - ret->append(package != NULL - ? package->package_name() - : gogo->package_name()); + { + ret->push_back('"'); + ret->append(package != NULL + ? package->pkgpath_symbol() + : gogo->pkgpath_symbol()); + ret->push_back('"'); + } + ret->append(package != NULL + ? package->package_name() + : gogo->package_name()); ret->push_back('.'); } if (this->in_function_ != NULL) diff --git a/libgo/go/encoding/xml/marshal_test.go b/libgo/go/encoding/xml/marshal_test.go index 6f0ecfc233b..b6978a1e65b 100644 --- a/libgo/go/encoding/xml/marshal_test.go +++ b/libgo/go/encoding/xml/marshal_test.go @@ -726,7 +726,7 @@ var marshalErrorTests = []struct { }, { Value: map[*Ship]bool{nil: false}, - Err: "xml: unsupported type: map[*encoding/xml.Ship]bool", + Err: "xml: unsupported type: map[*xml.Ship]bool", Kind: reflect.Map, }, { diff --git a/libgo/go/html/template/escape_test.go b/libgo/go/html/template/escape_test.go index 6670be9a195..ce12c1795c2 100644 --- a/libgo/go/html/template/escape_test.go +++ b/libgo/go/html/template/escape_test.go @@ -226,7 +226,7 @@ func TestEscape(t *testing.T) { { "badMarshaler", `<button onclick='alert(1/{{.B}}in numbers)'>`, - `<button onclick='alert(1/ /* json: error calling MarshalJSON for type *html/template.badMarshaler: invalid character 'f' looking for beginning of object key string */null in numbers)'>`, + `<button onclick='alert(1/ /* json: error calling MarshalJSON for type *template.badMarshaler: invalid character 'f' looking for beginning of object key string */null in numbers)'>`, }, { "jsMarshaler", diff --git a/libgo/go/reflect/type.go b/libgo/go/reflect/type.go index 4999824c919..a264ef1e082 100644 --- a/libgo/go/reflect/type.go +++ b/libgo/go/reflect/type.go @@ -83,6 +83,9 @@ type Type interface { // compare the Types directly. String() string + // Used internally by gccgo--the string retaining quoting. + rawString() string + // Kind returns the specific kind of this type. Kind() Kind @@ -432,7 +435,24 @@ func (t *commonType) toType() Type { return canonicalize(t) } -func (t *commonType) String() string { return *t.string } +func (t *commonType) rawString() string { return *t.string } + +func (t *commonType) String() string { + // For gccgo, strip out quoted strings. + s := *t.string + var q bool + r := make([]byte, len(s)) + j := 0 + for i := 0; i < len(s); i++ { + if s[i] == '"' { + q = !q + } else if !q { + r[j] = s[i] + j++ + } + } + return string(r[:j]) +} func (t *commonType) Size() uintptr { return t.size } @@ -942,7 +962,7 @@ func canonicalize(t Type) Type { u := t.uncommon() var s string if u == nil || u.PkgPath() == "" { - s = t.String() + s = t.rawString() } else { s = u.PkgPath() + "." + u.Name() } |