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:
aarzilli 2018-11-10 18:35:37 +01:00 committed by Derek Parker
parent 7f53117ea9
commit f8c0c37f30
3 changed files with 56 additions and 30 deletions

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