2
0
mirror of synced 2025-02-23 14:58:12 +00:00

bind: skip unsupported functions in function sets

Change-Id: Ibac8f11503ff088600e75c16edab7d20d8128157
Reviewed-on: https://go-review.googlesource.com/35332
Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
Elias Naur 2017-01-18 00:10:03 +01:00
parent ab8d69d0ab
commit a0f998b2d8
2 changed files with 19 additions and 8 deletions

View File

@ -585,7 +585,12 @@ func (g *ClassGen) genFuncBody(cls *java.Class, fs *java.FuncSet, prefix string,
minp := maxp
// sort the function variants into argument sizes.
buckets := make(map[int][]*java.Func)
numF := 0
for _, f := range fs.Funcs {
if !g.isFuncSupported(f) {
continue
}
numF++
n := len(f.Params)
if n < minp {
minp = n
@ -596,7 +601,7 @@ func (g *ClassGen) genFuncBody(cls *java.Class, fs *java.FuncSet, prefix string,
}
g.Printf(" {\n")
g.Indent()
if fs.Variadic {
if len(buckets) != 1 {
// Switch over the number of arguments.
g.Printf("switch %d + len(a%d) {\n", minp, minp)
}
@ -605,7 +610,7 @@ func (g *ClassGen) genFuncBody(cls *java.Class, fs *java.FuncSet, prefix string,
if len(funcs) == 0 {
continue
}
if fs.Variadic {
if len(buckets) != 1 {
g.Printf("case %d:\n", i)
g.Indent()
}
@ -651,7 +656,7 @@ func (g *ClassGen) genFuncBody(cls *java.Class, fs *java.FuncSet, prefix string,
g.Printf("__a%d", i)
}
g.Printf(")\n")
g.genFuncRet(fs, f)
g.genFuncRet(fs, f, numF > 1)
if len(preds) > 0 {
g.Outdent()
g.Printf("}\n")
@ -661,21 +666,21 @@ func (g *ClassGen) genFuncBody(cls *java.Class, fs *java.FuncSet, prefix string,
g.Printf("}\n")
}
}
if fs.Variadic {
if len(buckets) != 1 {
g.Outdent()
}
}
if fs.Variadic {
if len(buckets) != 1 {
g.Printf("}\n")
}
if fs.Variadic || len(fs.Funcs) > 1 {
if numF > 1 {
g.Printf("panic(\"no overloaded method found for %s.%s that matched the arguments\")\n", cls.Name, fs.Name)
}
g.Outdent()
g.Printf("}\n\n")
}
func (g *ClassGen) genFuncRet(fs *java.FuncSet, f *java.Func) {
func (g *ClassGen) genFuncRet(fs *java.FuncSet, f *java.Func, mustReturn bool) {
if f.Ret != nil {
g.genRead("_res", "res.res", f.Ret, modeRetained)
g.genRefRead("_exc", "res.exc", "error", "proxy_error", true)
@ -692,7 +697,7 @@ func (g *ClassGen) genFuncRet(fs *java.FuncSet, f *java.Func) {
// signature does. Use nil as a placeholder return value.
g.Printf("return nil\n")
}
} else if fs.Variadic || len(fs.Funcs) > 1 {
} else if mustReturn {
// If there are overloaded variants, return here to avoid the fallback
// panic generated in genFuncBody.
g.Printf("return\n")

View File

@ -16,6 +16,7 @@ import (
"Java/java/lang/Object"
"Java/java/lang/Runnable"
"Java/java/net"
"Java/java/nio"
"Java/java/util"
"Java/java/util/concurrent"
gopkg "Java/javapkg"
@ -192,3 +193,8 @@ func CastRunnable(o lang.Object) lang.Runnable {
// works.
func NameClashingPackages(_ net.Socket, _ xnet.SocketFactory) {
}
func testReferenceToUnsupportedParameters() {
var ib nio.IntBuffer
ib.Put(nil)
}