(oName string, m *types.Func)
| 1253 | } |
| 1254 | |
| 1255 | func (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 | } |
no test coverage detected