MCPcopy Create free account
hub / github.com/golang/mobile / genJNIFuncBody

Method genJNIFuncBody

bind/genjava.go:1186–1242  ·  view source on GitHub ↗
(o *types.Func, sName string, jm *java.Func, isjava bool)

Source from the content-addressed store, hash-verified

1184}
1185
1186func (g *JavaGen) genJNIFuncBody(o *types.Func, sName string, jm *java.Func, isjava bool) {
1187 sig := o.Type().(*types.Signature)
1188 res := sig.Results()
1189 if sName != "" {
1190 g.Printf("int32_t o = go_seq_to_refnum_go(env, __this__);\n")
1191 }
1192 params := sig.Params()
1193 first := 0
1194 if isjava && params.Len() > 0 && params.At(0).Name() == "this" {
1195 // Start after the implicit this argument.
1196 first = 1
1197 g.Printf("int32_t _%s = go_seq_to_refnum(env, __this__);\n", g.paramName(params, 0))
1198 }
1199 for i := first; i < params.Len(); i++ {
1200 name := g.paramName(params, i)
1201 g.genJavaToC(name, params.At(i).Type(), modeTransient)
1202 }
1203 resPrefix := ""
1204 if res.Len() > 0 {
1205 if res.Len() == 1 {
1206 g.Printf("%s r0 = ", g.cgoType(res.At(0).Type()))
1207 } else {
1208 resPrefix = "res."
1209 g.Printf("struct proxy%s_%s_%s_return res = ", g.pkgPrefix, sName, o.Name())
1210 }
1211 }
1212 g.Printf("proxy%s_%s_%s(", g.pkgPrefix, sName, o.Name())
1213 if sName != "" {
1214 g.Printf("o")
1215 }
1216 // Pass all arguments, including the implicit this argument.
1217 for i := 0; i < params.Len(); i++ {
1218 if i > 0 || sName != "" {
1219 g.Printf(", ")
1220 }
1221 g.Printf("_%s", g.paramName(params, i))
1222 }
1223 g.Printf(");\n")
1224 for i := first; i < params.Len(); i++ {
1225 g.genRelease(g.paramName(params, i), params.At(i).Type(), modeTransient)
1226 }
1227 for i := 0; i < res.Len(); i++ {
1228 tn := fmt.Sprintf("_r%d", i)
1229 t := res.At(i).Type()
1230 g.genCToJava(tn, fmt.Sprintf("%sr%d", resPrefix, i), t, modeRetained)
1231 }
1232 // Go backwards so that any exception is thrown before
1233 // the return.
1234 for i := res.Len() - 1; i >= 0; i-- {
1235 t := res.At(i).Type()
1236 if !isErrorType(t) {
1237 g.Printf("return _r%d;\n", i)
1238 } else {
1239 g.Printf("go_seq_maybe_throw_exception(env, _r%d);\n", i)
1240 }
1241 }
1242}
1243

Callers 1

genJNIFuncMethod · 0.95

Calls 9

paramNameMethod · 0.95
genJavaToCMethod · 0.95
genReleaseMethod · 0.95
genCToJavaMethod · 0.95
isErrorTypeFunction · 0.85
TypeMethod · 0.80
PrintfMethod · 0.80
LenMethod · 0.45
cgoTypeMethod · 0.45

Tested by

no test coverage detected