| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- package functions
- import (
- "honnef.co/go/tools/ssa"
- )
- func filterDebug(instr []ssa.Instruction) []ssa.Instruction {
- var out []ssa.Instruction
- for _, ins := range instr {
- if _, ok := ins.(*ssa.DebugRef); !ok {
- out = append(out, ins)
- }
- }
- return out
- }
- // IsStub reports whether a function is a stub. A function is
- // considered a stub if it has no instructions or exactly one
- // instruction, which must be either returning only constant values or
- // a panic.
- func IsStub(fn *ssa.Function) bool {
- if len(fn.Blocks) == 0 {
- return true
- }
- if len(fn.Blocks) > 1 {
- return false
- }
- instrs := filterDebug(fn.Blocks[0].Instrs)
- if len(instrs) != 1 {
- return false
- }
- switch instrs[0].(type) {
- case *ssa.Return:
- // Since this is the only instruction, the return value must
- // be a constant. We consider all constants as stubs, not just
- // the zero value. This does not, unfortunately, cover zero
- // initialised structs, as these cause additional
- // instructions.
- return true
- case *ssa.Panic:
- return true
- default:
- return false
- }
- }
|