Skip to content
This repository was archived by the owner on Jun 2, 2023. It is now read-only.

Commit 42c0f6f

Browse files
committed
fix: calledInFunc
1 parent e6a42df commit 42c0f6f

File tree

1 file changed

+43
-37
lines changed

1 file changed

+43
-37
lines changed

passes/bodyclose/bodyclose.go

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -139,46 +139,11 @@ func (r *runner) isopen(b *ssa.BasicBlock, i int) bool {
139139
f := c.Fn.(*ssa.Function)
140140
if r.noImportedNetHTTP(f) {
141141
// skip this
142-
continue
142+
return false
143143
}
144144
called := r.isClosureCalled(c)
145-
for _, b := range f.Blocks {
146-
for i, instr := range b.Instrs {
147-
switch instr := instr.(type) {
148-
case *ssa.UnOp:
149-
refs := *instr.Referrers()
150-
if len(refs) == 0 {
151-
return true
152-
}
153-
for _, r := range refs {
154-
if v, ok := r.(ssa.Value); ok {
155-
if ptr, ok := v.Type().(*types.Pointer); !ok || !isNamedType(ptr.Elem(), "io", "ReadCloser") {
156-
return true
157-
}
158-
vrefs := *v.Referrers()
159-
for _, vref := range vrefs {
160-
if vref, ok := vref.(*ssa.UnOp); ok {
161-
vrefs := *vref.Referrers()
162-
if len(vrefs) == 0 {
163-
return true
164-
}
165-
for _, vref := range vrefs {
166-
if c, ok := vref.(*ssa.Call); ok {
167-
if c.Call.Method.Name() == closeMethod {
168-
return !called
169-
}
170-
}
171-
}
172-
}
173-
}
174-
}
175145

176-
}
177-
default:
178-
return r.isopen(b, i) || !called
179-
}
180-
}
181-
}
146+
return r.calledInFunc(f, called)
182147
}
183148

184149
}
@@ -335,6 +300,47 @@ func (r *runner) noImportedNetHTTP(f *ssa.Function) (ret bool) {
335300
return true
336301
}
337302

303+
func (r *runner) calledInFunc(f *ssa.Function, called bool) bool {
304+
for _, b := range f.Blocks {
305+
for i, instr := range b.Instrs {
306+
switch instr := instr.(type) {
307+
case *ssa.UnOp:
308+
refs := *instr.Referrers()
309+
if len(refs) == 0 {
310+
return true
311+
}
312+
for _, r := range refs {
313+
if v, ok := r.(ssa.Value); ok {
314+
if ptr, ok := v.Type().(*types.Pointer); !ok || !isNamedType(ptr.Elem(), "io", "ReadCloser") {
315+
return true
316+
}
317+
vrefs := *v.Referrers()
318+
for _, vref := range vrefs {
319+
if vref, ok := vref.(*ssa.UnOp); ok {
320+
vrefs := *vref.Referrers()
321+
if len(vrefs) == 0 {
322+
return true
323+
}
324+
for _, vref := range vrefs {
325+
if c, ok := vref.(*ssa.Call); ok {
326+
if c.Call.Method.Name() == closeMethod {
327+
return !called
328+
}
329+
}
330+
}
331+
}
332+
}
333+
}
334+
335+
}
336+
default:
337+
return r.isopen(b, i) || !called
338+
}
339+
}
340+
}
341+
return false
342+
}
343+
338344
// isNamedType reports whether t is the named type path.name.
339345
func isNamedType(t types.Type, path, name string) bool {
340346
n, ok := t.(*types.Named)

0 commit comments

Comments
 (0)