compiler, reflect: Handle package path like gc compiler.
From-SVN: r188482
This commit is contained in:
parent
b29e01b77b
commit
9690ac05c9
5 changed files with 47 additions and 13 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
{
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue