proc: remove inversion of return variables from returnBreakpointInfo
It was never true that return variables were in the inverse order. Instead in Go1.11 return variables are saved in debug_info in an arbitrary order and inverting them just happened to work for this specific example. This bug was fixed in Go 1.12, regardless we should attempt to rearrange return variables anyway.
This commit is contained in:
parent
7f53117ea9
commit
f8c0c37f30
@ -425,12 +425,6 @@ func (rbpi *returnBreakpointInfo) Collect(thread Thread) []*Variable {
|
||||
return (v.Flags & VariableReturnArgument) != 0
|
||||
})
|
||||
|
||||
// Go saves the return variables in the opposite order that the user
|
||||
// specifies them so here we reverse the slice to make it easier to
|
||||
// understand.
|
||||
for i := 0; i < len(vars)/2; i++ {
|
||||
vars[i], vars[len(vars)-i-1] = vars[len(vars)-i-1], vars[i]
|
||||
}
|
||||
return vars
|
||||
}
|
||||
|
||||
|
@ -3920,23 +3920,39 @@ func TestStepOutReturn(t *testing.T) {
|
||||
t.Fatalf("wrong number of return values %v", ret)
|
||||
}
|
||||
|
||||
if ret[0].Name != "str" {
|
||||
t.Fatalf("(str) bad return value name %s", ret[0].Name)
|
||||
stridx := 0
|
||||
numidx := 1
|
||||
|
||||
if !goversion.VersionAfterOrEqual(runtime.Version(), 1, 12) {
|
||||
// in 1.11 and earlier the order of return values in DWARF is
|
||||
// unspecified, in 1.11 and later it follows the order of definition
|
||||
// specified by the user
|
||||
for i := range ret {
|
||||
if ret[i].Name == "str" {
|
||||
stridx = i
|
||||
numidx = 1 - i
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if ret[0].Kind != reflect.String {
|
||||
t.Fatalf("(str) bad return value kind %v", ret[0].Kind)
|
||||
|
||||
if ret[stridx].Name != "str" {
|
||||
t.Fatalf("(str) bad return value name %s", ret[stridx].Name)
|
||||
}
|
||||
if s := constant.StringVal(ret[0].Value); s != "return 47" {
|
||||
if ret[stridx].Kind != reflect.String {
|
||||
t.Fatalf("(str) bad return value kind %v", ret[stridx].Kind)
|
||||
}
|
||||
if s := constant.StringVal(ret[stridx].Value); s != "return 47" {
|
||||
t.Fatalf("(str) bad return value %q", s)
|
||||
}
|
||||
|
||||
if ret[1].Name != "num" {
|
||||
t.Fatalf("(num) bad return value name %s", ret[1].Name)
|
||||
if ret[numidx].Name != "num" {
|
||||
t.Fatalf("(num) bad return value name %s", ret[numidx].Name)
|
||||
}
|
||||
if ret[1].Kind != reflect.Int {
|
||||
t.Fatalf("(num) bad return value kind %v", ret[1].Kind)
|
||||
if ret[numidx].Kind != reflect.Int {
|
||||
t.Fatalf("(num) bad return value kind %v", ret[numidx].Kind)
|
||||
}
|
||||
if n, _ := constant.Int64Val(ret[1].Value); n != 48 {
|
||||
if n, _ := constant.Int64Val(ret[numidx].Value); n != 48 {
|
||||
t.Fatalf("(num) bad return value %d", n)
|
||||
}
|
||||
})
|
||||
|
@ -1450,24 +1450,40 @@ func TestClientServer_StepOutReturn(t *testing.T) {
|
||||
t.Fatalf("wrong number of return values %v", ret)
|
||||
}
|
||||
|
||||
if ret[0].Name != "str" {
|
||||
t.Fatalf("(str) bad return value name %s", ret[0].Name)
|
||||
}
|
||||
if ret[0].Kind != reflect.String {
|
||||
t.Fatalf("(str) bad return value kind %v", ret[0].Kind)
|
||||
}
|
||||
if ret[0].Value != "return 47" {
|
||||
t.Fatalf("(str) bad return value %q", ret[0].Value)
|
||||
stridx := 0
|
||||
numidx := 1
|
||||
|
||||
if !goversion.VersionAfterOrEqual(runtime.Version(), 1, 12) {
|
||||
// in 1.11 and earlier the order of return values in DWARF is
|
||||
// unspecified, in 1.11 and later it follows the order of definition
|
||||
// specified by the user
|
||||
for i := range ret {
|
||||
if ret[i].Name == "str" {
|
||||
stridx = i
|
||||
numidx = 1 - i
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ret[1].Name != "num" {
|
||||
t.Fatalf("(num) bad return value name %s", ret[1].Name)
|
||||
if ret[stridx].Name != "str" {
|
||||
t.Fatalf("(str) bad return value name %s", ret[stridx].Name)
|
||||
}
|
||||
if ret[1].Kind != reflect.Int {
|
||||
t.Fatalf("(num) bad return value kind %v", ret[1].Kind)
|
||||
if ret[stridx].Kind != reflect.String {
|
||||
t.Fatalf("(str) bad return value kind %v", ret[stridx].Kind)
|
||||
}
|
||||
if ret[1].Value != "48" {
|
||||
t.Fatalf("(num) bad return value %s", ret[1].Value)
|
||||
if ret[stridx].Value != "return 47" {
|
||||
t.Fatalf("(str) bad return value %q", ret[stridx].Value)
|
||||
}
|
||||
|
||||
if ret[numidx].Name != "num" {
|
||||
t.Fatalf("(num) bad return value name %s", ret[numidx].Name)
|
||||
}
|
||||
if ret[numidx].Kind != reflect.Int {
|
||||
t.Fatalf("(num) bad return value kind %v", ret[numidx].Kind)
|
||||
}
|
||||
if ret[numidx].Value != "48" {
|
||||
t.Fatalf("(num) bad return value %s", ret[numidx].Value)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user