defer func() {
	if err := recover(); err != nil {
		// log error
		log.Errorf("execute interceptor before invoke error, instrument name: %s, interceptor name: %s, function ID: %s, error: %v, stack: %s",
		    "{{.InstrumentName}}", "{{.InterceptorDefineName}}", "{{.FuncID}}", err, tracing.DebugStack())
	}
}()
invocation = &operator.realInvocation{}
{{if .Recvs -}}
invocation.callerInstance = *recv_0	// for caller if exist
{{- end}}
invocation.args = make([]interface{}, {{len .Parameters}})
{{- range $index, $value := .Parameters}}
invocation.args[{{$index}}] = *param_{{$index}}
{{- end}}
invocation.changeArgCallback = func(index int, value interface{}) {
    {{range $index, $value := .Parameters -}}
    {{ if ne $index 0}} else {{end}}if index == {{$index}} {
        res := value.({{$value.PackagedTypeName}})
        *param_{{$index}} = res
        invocation.args[{{$index}}] = res
        return
    }
    {{- end}}
    panic("cannot found the argument index")
}

{{- range $index, $value := .Results }}
var def_res_{{$index}} {{$value.PackagedTypeName}}
{{- end}}
// real invoke
if err := {{.InterceptorVarName}}.BeforeInvoke(invocation); err != nil {
	// using go2sky log error
	log.Warnf("execute interceptor before invoke error, instrument name: %s, interceptor name: %s, function ID: %s, error: %v",
    		    "{{.InstrumentName}}", "{{.InterceptorDefineName}}", "{{.FuncID}}", err)

	return {{ range $index, $value := .Results -}}
def_res_{{$index}},
{{- end}}invocation, false
}
if (invocation.isContinue) {
    {{- range $index, $value := .Results }}
    if invocation.returnValues[{{$index}}] != nil {
        def_res_{{$index}} = (invocation.returnValues[{{$index}}]).({{$value.PackagedTypeName}})
    }
    {{- end}}
	return {{ range $index, $value := .Results -}}
    def_res_{{$index}},
{{- end}}invocation, true
}
return {{ range $index, $value := .Results -}}
def_res_{{$index}},
{{- end}}invocation, false