compiler, reflect: Handle package path like gc compiler.

From-SVN: r188482
This commit is contained in:
Ian Lance Taylor 2012-06-12 20:33:22 +00:00
parent b29e01b77b
commit 9690ac05c9
5 changed files with 47 additions and 13 deletions

View File

@ -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;
}

View File

@ -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)

View File

@ -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,
},
{

View File

@ -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 &#39;f&#39; looking for beginning of object key string */null in numbers)'>`,
`<button onclick='alert(1/ /* json: error calling MarshalJSON for type *template.badMarshaler: invalid character &#39;f&#39; looking for beginning of object key string */null in numbers)'>`,
},
{
"jsMarshaler",

View File

@ -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()
}