in tool/instrument/trampoline.go [223:262]
func (rp *RuleProcessor) callOnExitHook(t *resource.InstFuncRule, traits []ParamTrait) error {
// The actual parameter list of hook function should be the same as the
// target function
if rp.exact {
util.Assert(len(traits) == len(rp.onExitHookFunc.Type.Params.List),
"mismatched param traits")
}
// Hook: func onExitFoo(ctx* CallContext, p*[]int)
// Trampoline: func OtelOnExitTrampoline_foo(ctx* CallContext, p *[]int)
var args []dst.Expr
for idx, field := range rp.onExitHookFunc.Type.Params.List {
if idx == 0 {
args = append(args, dst.NewIdent(TrampolineCallContextName))
if !rp.exact {
// Generic hook function, no need to process parameters
break
}
continue
}
trait := traits[idx]
for _, name := range field.Names { // syntax of n1,n2 type
if trait.IsVaradic {
arg := util.DereferenceOf(util.Ident(name.Name + "..."))
args = append(args, arg)
} else {
arg := util.DereferenceOf(dst.NewIdent(name.Name))
args = append(args, arg)
}
}
}
fnName := makeOnXName(t, false)
call := util.ExprStmt(util.CallTo(fnName, args))
iff := util.IfNotNilStmt(
dst.NewIdent(fnName),
util.Block(call),
nil,
)
insertAtEnd(rp.onExitHookFunc, iff)
return nil
}