(o *types.Func, sName string, jm *java.Func, isjava bool)
| 1184 | } |
| 1185 | |
| 1186 | func (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 |
no test coverage detected