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

Method genMethodInterfaceProxy

bind/genjava.go:1255–1312  ·  view source on GitHub ↗
(oName string, m *types.Func)

Source from the content-addressed store, hash-verified

1253}
1254
1255func (g *JavaGen) genMethodInterfaceProxy(oName string, m *types.Func) {
1256 if !g.isSigSupported(m.Type()) {
1257 g.Printf("// skipped method %s with unsupported parameter or return types\n\n", oName)
1258 return
1259 }
1260 sig := m.Type().(*types.Signature)
1261 params := sig.Params()
1262 res := sig.Results()
1263 g.genInterfaceMethodSignature(m, oName, false, g.paramName)
1264 g.Indent()
1265 g.Printf("JNIEnv *env = go_seq_push_local_frame(%d);\n", params.Len())
1266 g.Printf("jobject o = go_seq_from_refnum(env, refnum, proxy_class_%s_%s, proxy_class_%s_%s_cons);\n", g.pkgPrefix, oName, g.pkgPrefix, oName)
1267 for i := 0; i < params.Len(); i++ {
1268 pn := g.paramName(params, i)
1269 g.genCToJava("_"+pn, pn, params.At(i).Type(), modeTransient)
1270 }
1271 if res.Len() > 0 && !isErrorType(res.At(0).Type()) {
1272 t := res.At(0).Type()
1273 g.Printf("%s res = (*env)->Call%sMethod(env, o, ", g.jniType(t), g.jniCallType(t))
1274 } else {
1275 g.Printf("(*env)->CallVoidMethod(env, o, ")
1276 }
1277 g.Printf("mid_%s_%s", oName, m.Name())
1278 for i := 0; i < params.Len(); i++ {
1279 g.Printf(", _%s", g.paramName(params, i))
1280 }
1281 g.Printf(");\n")
1282 var retName string
1283 if res.Len() > 0 {
1284 t := res.At(0).Type()
1285 if res.Len() == 2 || isErrorType(t) {
1286 g.Printf("jobject exc = go_seq_get_exception(env);\n")
1287 errType := types.Universe.Lookup("error").Type()
1288 g.genJavaToC("exc", errType, modeRetained)
1289 retName = "_exc"
1290 }
1291 if !isErrorType(t) {
1292 if res.Len() == 2 {
1293 g.genCRetClear("res", t, "exc")
1294 }
1295 g.genJavaToC("res", t, modeRetained)
1296 retName = "_res"
1297 }
1298
1299 if res.Len() > 1 {
1300 g.Printf("cproxy%s_%s_%s_return sres = {\n", g.pkgPrefix, oName, m.Name())
1301 g.Printf(" _res, _exc\n")
1302 g.Printf("};\n")
1303 retName = "sres"
1304 }
1305 }
1306 g.Printf("go_seq_pop_local_frame(env);\n")
1307 if retName != "" {
1308 g.Printf("return %s;\n", retName)
1309 }
1310 g.Outdent()
1311 g.Printf("}\n\n")
1312}

Callers 1

GenCMethod · 0.95

Calls 14

paramNameMethod · 0.95
genCToJavaMethod · 0.95
jniTypeMethod · 0.95
jniCallTypeMethod · 0.95
genJavaToCMethod · 0.95
genCRetClearMethod · 0.95
isErrorTypeFunction · 0.85
isSigSupportedMethod · 0.80
TypeMethod · 0.80
PrintfMethod · 0.80
IndentMethod · 0.80

Tested by

no test coverage detected