bind: generate reverse functions the same way as methods
This CL restructures function generation to match the way methods are generated, to avoid two different code paths for a coming CL. Change-Id: I5a4f15e51ea5df101f9aa419ed4170ab36506418 Reviewed-on: https://go-review.googlesource.com/35185 Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
parent
100a59ffc1
commit
1aa9ad5c48
@ -231,11 +231,16 @@ func (g *ClassGen) GenH() {
|
||||
func (g *ClassGen) GenC() {
|
||||
g.Printf(classesCHeader)
|
||||
for _, cls := range g.classes {
|
||||
g.genC(cls)
|
||||
g.Printf("static jclass class_%s;\n", cls.JNIName)
|
||||
if _, ok := g.supers[cls.Name]; ok {
|
||||
g.Printf("static jclass sclass_%s;\n", cls.JNIName)
|
||||
}
|
||||
for _, f := range cls.Funcs {
|
||||
if !f.Public || !g.isFuncSupported(f) {
|
||||
continue
|
||||
}
|
||||
g.Printf("static jmethodID m_s_%s_%s;\n", cls.JNIName, f.JNIName)
|
||||
}
|
||||
for _, f := range cls.AllMethods {
|
||||
if g.isFuncSupported(f) {
|
||||
g.Printf("static jmethodID m_%s_%s;\n", cls.JNIName, f.JNIName)
|
||||
@ -244,6 +249,7 @@ func (g *ClassGen) GenC() {
|
||||
}
|
||||
}
|
||||
}
|
||||
g.genC(cls)
|
||||
}
|
||||
g.Printf("\n")
|
||||
g.Printf("void init_proxies() {\n")
|
||||
@ -257,6 +263,17 @@ func (g *ClassGen) GenC() {
|
||||
g.Printf("sclass_%s = (*env)->GetSuperclass(env, clazz);\n", cls.JNIName)
|
||||
g.Printf("sclass_%s = (*env)->NewGlobalRef(env, sclass_%s);\n", cls.JNIName, cls.JNIName)
|
||||
}
|
||||
for _, f := range cls.Funcs {
|
||||
if !f.Public || !g.isFuncSupported(f) {
|
||||
continue
|
||||
}
|
||||
g.Printf("m_s_%s_%s = ", cls.JNIName, f.JNIName)
|
||||
if f.Constructor {
|
||||
g.Printf("go_seq_get_method_id(clazz, \"<init>\", %q);\n", f.Desc)
|
||||
} else {
|
||||
g.Printf("go_seq_get_static_method_id(clazz, %q, %q);\n", f.Name, f.Desc)
|
||||
}
|
||||
}
|
||||
for _, f := range cls.AllMethods {
|
||||
if g.isFuncSupported(f) {
|
||||
g.Printf("m_%s_%s = go_seq_get_method_id(clazz, %q, %q);\n", cls.JNIName, f.JNIName, f.Name, f.Desc)
|
||||
@ -387,7 +404,7 @@ func (g *ClassGen) genC(cls *java.Class) {
|
||||
} else {
|
||||
g.Printf("(*env)->CallStaticVoidMethod(env")
|
||||
}
|
||||
g.Printf(", clazz, m")
|
||||
g.Printf(", class_%s, m_s_%s_%s", cls.JNIName, cls.JNIName, f.JNIName)
|
||||
for i := range f.Params {
|
||||
g.Printf(", _a%d", i)
|
||||
}
|
||||
@ -442,9 +459,12 @@ func (g *ClassGen) genCFuncDecl(jniName string, f *java.Func) {
|
||||
// Return only the exception, if any
|
||||
g.Printf("jint")
|
||||
}
|
||||
g.Printf(" cproxy_s_%s_%s(jclass clazz, jmethodID m", jniName, f.JNIName)
|
||||
g.Printf(" cproxy_s_%s_%s(", jniName, f.JNIName)
|
||||
for i, a := range f.Params {
|
||||
g.Printf(", %s a%d", a.CType(), i)
|
||||
if i > 0 {
|
||||
g.Printf(", ")
|
||||
}
|
||||
g.Printf("%s a%d", a.CType(), i)
|
||||
}
|
||||
g.Printf(")")
|
||||
}
|
||||
@ -464,42 +484,9 @@ func (g *ClassGen) genGo(cls *java.Class) {
|
||||
if !f.Public || !g.isFuncSupported(f) {
|
||||
continue
|
||||
}
|
||||
g.Printf("{\n")
|
||||
g.Indent()
|
||||
name := f.Name
|
||||
if f.Constructor {
|
||||
name = "<init>"
|
||||
}
|
||||
g.Printf("fn := C.CString(%q)\n", name)
|
||||
g.Printf("fd := C.CString(%q)\n", f.Desc)
|
||||
if f.Constructor {
|
||||
g.Printf("m := C.go_seq_get_method_id(clazz, fn, fd)\n")
|
||||
} else {
|
||||
g.Printf("m := C.go_seq_get_static_method_id(clazz, fn, fd)\n")
|
||||
}
|
||||
g.Printf("C.free(unsafe.Pointer(fn))\n")
|
||||
g.Printf("C.free(unsafe.Pointer(fd))\n")
|
||||
g.Printf("if m != nil {\n")
|
||||
g.Indent()
|
||||
g.Printf("%s.%s = func", cls.PkgName, f.GoName)
|
||||
g.genFuncDecl(false, f)
|
||||
g.Printf(" {\n")
|
||||
g.Indent()
|
||||
for i, a := range f.Params {
|
||||
g.genWrite(fmt.Sprintf("a%d", i), a, modeTransient)
|
||||
}
|
||||
g.Printf("res := C.cproxy_s_%s_%s(clazz, m", cls.JNIName, f.JNIName)
|
||||
for i := range f.Params {
|
||||
g.Printf(", _a%d", i)
|
||||
}
|
||||
g.Printf(")\n")
|
||||
g.genFuncRet(f)
|
||||
g.Outdent()
|
||||
g.Printf("}\n")
|
||||
g.Outdent()
|
||||
g.Printf("}\n")
|
||||
g.Outdent()
|
||||
g.Printf("}\n")
|
||||
g.genFuncBody(cls, f, "cproxy_s", true)
|
||||
}
|
||||
g.Printf("%s.Cast = func(v interface{}) Java.%s {\n", cls.PkgName, goClsName(cls.Name))
|
||||
g.Indent()
|
||||
@ -522,7 +509,7 @@ func (g *ClassGen) genGo(cls *java.Class) {
|
||||
}
|
||||
g.Printf("func (p *proxy_class_%s) %s", cls.JNIName, f.GoName)
|
||||
g.genFuncDecl(false, f)
|
||||
g.genFuncBody(cls, f, "cproxy")
|
||||
g.genFuncBody(cls, f, "cproxy", false)
|
||||
}
|
||||
if cls.Throwable {
|
||||
g.Printf("func (p *proxy_class_%s) Error() string {\n", cls.JNIName)
|
||||
@ -540,20 +527,26 @@ func (g *ClassGen) genGo(cls *java.Class) {
|
||||
}
|
||||
g.Printf("func (p *super_%s) %s", cls.JNIName, f.GoName)
|
||||
g.genFuncDecl(false, f)
|
||||
g.genFuncBody(cls, f, "csuper")
|
||||
g.genFuncBody(cls, f, "csuper", false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (g *ClassGen) genFuncBody(cls *java.Class, f *java.Func, prefix string) {
|
||||
func (g *ClassGen) genFuncBody(cls *java.Class, f *java.Func, prefix string, static bool) {
|
||||
g.Printf(" {\n")
|
||||
g.Indent()
|
||||
for i, a := range f.Params {
|
||||
g.genWrite(fmt.Sprintf("a%d", i), a, modeTransient)
|
||||
}
|
||||
g.Printf("res := C.%s_%s_%s(C.jint(p.Bind_proxy_refnum__())", prefix, cls.JNIName, f.JNIName)
|
||||
g.Printf("res := C.%s_%s_%s(", prefix, cls.JNIName, f.JNIName)
|
||||
if !static {
|
||||
g.Printf("C.jint(p.Bind_proxy_refnum__())")
|
||||
}
|
||||
for i := range f.Params {
|
||||
g.Printf(", _a%d", i)
|
||||
if !static || i > 0 {
|
||||
g.Printf(", ")
|
||||
}
|
||||
g.Printf("_a%d", i)
|
||||
}
|
||||
g.Printf(")\n")
|
||||
g.genFuncRet(f)
|
||||
|
108
bind/testdata/classes.go.golden
vendored
108
bind/testdata/classes.go.golden
vendored
@ -662,42 +662,34 @@ func init_java_util_Spliterators() {
|
||||
return
|
||||
}
|
||||
class_java_util_Spliterators = clazz
|
||||
{
|
||||
fn := C.CString("iterator")
|
||||
fd := C.CString("(Ljava/util/Spliterator$OfInt;)Ljava/util/PrimitiveIterator$OfInt;")
|
||||
m := C.go_seq_get_static_method_id(clazz, fn, fd)
|
||||
C.free(unsafe.Pointer(fn))
|
||||
C.free(unsafe.Pointer(fd))
|
||||
if m != nil {
|
||||
Spliterators.Iterator_Ljava_util_Spliterator_00024OfInt_2 = func(a0 Java.Java_util_Spliterator_OfInt) Java.Java_util_PrimitiveIterator_OfInt {
|
||||
var _a0 C.jint = _seq.NullRefNum
|
||||
if a0 != nil {
|
||||
_a0 = C.jint(_seq.ToRefNum(a0))
|
||||
}
|
||||
res := C.cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2(clazz, m, _a0)
|
||||
var _res Java.Java_util_PrimitiveIterator_OfInt
|
||||
_res_ref := _seq.FromRefNum(int32(res.res))
|
||||
if _res_ref != nil {
|
||||
if res.res < 0 { // go object
|
||||
_res = _res_ref.Get().(Java.Java_util_PrimitiveIterator_OfInt)
|
||||
} else { // foreign object
|
||||
_res = (*proxy_class_java_util_PrimitiveIterator_OfInt)(_res_ref)
|
||||
}
|
||||
}
|
||||
var _exc error
|
||||
_exc_ref := _seq.FromRefNum(int32(res.exc))
|
||||
if _exc_ref != nil {
|
||||
if res.exc < 0 { // go object
|
||||
_exc = _exc_ref.Get().(error)
|
||||
} else { // foreign object
|
||||
_exc = (*proxy_error)(_exc_ref)
|
||||
}
|
||||
}
|
||||
if (_exc != nil) { panic(_exc) }
|
||||
return _res
|
||||
Spliterators.Iterator_Ljava_util_Spliterator_00024OfInt_2 = func(a0 Java.Java_util_Spliterator_OfInt) Java.Java_util_PrimitiveIterator_OfInt {
|
||||
var _a0 C.jint = _seq.NullRefNum
|
||||
if a0 != nil {
|
||||
_a0 = C.jint(_seq.ToRefNum(a0))
|
||||
}
|
||||
res := C.cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2(_a0)
|
||||
var _res Java.Java_util_PrimitiveIterator_OfInt
|
||||
_res_ref := _seq.FromRefNum(int32(res.res))
|
||||
if _res_ref != nil {
|
||||
if res.res < 0 { // go object
|
||||
_res = _res_ref.Get().(Java.Java_util_PrimitiveIterator_OfInt)
|
||||
} else { // foreign object
|
||||
_res = (*proxy_class_java_util_PrimitiveIterator_OfInt)(_res_ref)
|
||||
}
|
||||
}
|
||||
var _exc error
|
||||
_exc_ref := _seq.FromRefNum(int32(res.exc))
|
||||
if _exc_ref != nil {
|
||||
if res.exc < 0 { // go object
|
||||
_exc = _exc_ref.Get().(error)
|
||||
} else { // foreign object
|
||||
_exc = (*proxy_error)(_exc_ref)
|
||||
}
|
||||
}
|
||||
if (_exc != nil) { panic(_exc) }
|
||||
return _res
|
||||
}
|
||||
|
||||
Spliterators.Cast = func(v interface{}) Java.Java_util_Spliterators {
|
||||
t := reflect.TypeOf((*proxy_class_java_util_Spliterators)(nil))
|
||||
cv := reflect.ValueOf(v).Convert(t).Interface().(*proxy_class_java_util_Spliterators)
|
||||
@ -723,38 +715,30 @@ func init_java_lang_System() {
|
||||
return
|
||||
}
|
||||
class_java_lang_System = clazz
|
||||
{
|
||||
fn := C.CString("console")
|
||||
fd := C.CString("()Ljava/io/Console;")
|
||||
m := C.go_seq_get_static_method_id(clazz, fn, fd)
|
||||
C.free(unsafe.Pointer(fn))
|
||||
C.free(unsafe.Pointer(fd))
|
||||
if m != nil {
|
||||
System.Console = func() Java.Java_io_Console {
|
||||
res := C.cproxy_s_java_lang_System_console(clazz, m)
|
||||
var _res Java.Java_io_Console
|
||||
_res_ref := _seq.FromRefNum(int32(res.res))
|
||||
if _res_ref != nil {
|
||||
if res.res < 0 { // go object
|
||||
_res = _res_ref.Get().(Java.Java_io_Console)
|
||||
} else { // foreign object
|
||||
_res = (*proxy_class_java_io_Console)(_res_ref)
|
||||
}
|
||||
}
|
||||
var _exc error
|
||||
_exc_ref := _seq.FromRefNum(int32(res.exc))
|
||||
if _exc_ref != nil {
|
||||
if res.exc < 0 { // go object
|
||||
_exc = _exc_ref.Get().(error)
|
||||
} else { // foreign object
|
||||
_exc = (*proxy_error)(_exc_ref)
|
||||
}
|
||||
}
|
||||
if (_exc != nil) { panic(_exc) }
|
||||
return _res
|
||||
System.Console = func() Java.Java_io_Console {
|
||||
res := C.cproxy_s_java_lang_System_console()
|
||||
var _res Java.Java_io_Console
|
||||
_res_ref := _seq.FromRefNum(int32(res.res))
|
||||
if _res_ref != nil {
|
||||
if res.res < 0 { // go object
|
||||
_res = _res_ref.Get().(Java.Java_io_Console)
|
||||
} else { // foreign object
|
||||
_res = (*proxy_class_java_io_Console)(_res_ref)
|
||||
}
|
||||
}
|
||||
var _exc error
|
||||
_exc_ref := _seq.FromRefNum(int32(res.exc))
|
||||
if _exc_ref != nil {
|
||||
if res.exc < 0 { // go object
|
||||
_exc = _exc_ref.Get().(error)
|
||||
} else { // foreign object
|
||||
_exc = (*proxy_error)(_exc_ref)
|
||||
}
|
||||
}
|
||||
if (_exc != nil) { panic(_exc) }
|
||||
return _res
|
||||
}
|
||||
|
||||
System.Cast = func(v interface{}) Java.Java_lang_System {
|
||||
t := reflect.TypeOf((*proxy_class_java_lang_System)(nil))
|
||||
cv := reflect.ValueOf(v).Convert(t).Interface().(*proxy_class_java_lang_System)
|
||||
|
38
bind/testdata/classes.java.c.golden
vendored
38
bind/testdata/classes.java.c.golden
vendored
@ -13,25 +13,12 @@ static jmethodID m_java_util_concurrent_Future_get__;
|
||||
static jmethodID m_java_util_concurrent_Future_get__JLjava_util_concurrent_TimeUnit_2;
|
||||
static jclass class_java_lang_Object;
|
||||
static jclass class_java_util_concurrent_TimeUnit;
|
||||
ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2(jclass clazz, jmethodID m, jint a0) {
|
||||
static jclass class_java_util_Spliterators;
|
||||
static jmethodID m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2;
|
||||
ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2(jint a0) {
|
||||
JNIEnv *env = go_seq_push_local_frame(1);
|
||||
jobject _a0 = go_seq_from_refnum(env, a0, NULL, NULL);
|
||||
jobject res = (*env)->CallStaticObjectMethod(env, clazz, m, _a0);
|
||||
jobject _exc = go_seq_get_exception(env);
|
||||
int32_t _exc_ref = go_seq_to_refnum(env, _exc);
|
||||
if (_exc != NULL) {
|
||||
res = NULL;
|
||||
}
|
||||
jint _res = go_seq_to_refnum(env, res);
|
||||
go_seq_pop_local_frame(env);
|
||||
ret_jint __res = {_res, _exc_ref};
|
||||
return __res;
|
||||
}
|
||||
|
||||
static jclass class_java_util_Spliterators;
|
||||
ret_jint cproxy_s_java_lang_System_console(jclass clazz, jmethodID m) {
|
||||
JNIEnv *env = go_seq_push_local_frame(0);
|
||||
jobject res = (*env)->CallStaticObjectMethod(env, clazz, m);
|
||||
jobject res = (*env)->CallStaticObjectMethod(env, class_java_util_Spliterators, m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2, _a0);
|
||||
jobject _exc = go_seq_get_exception(env);
|
||||
int32_t _exc_ref = go_seq_to_refnum(env, _exc);
|
||||
if (_exc != NULL) {
|
||||
@ -44,6 +31,21 @@ ret_jint cproxy_s_java_lang_System_console(jclass clazz, jmethodID m) {
|
||||
}
|
||||
|
||||
static jclass class_java_lang_System;
|
||||
static jmethodID m_s_java_lang_System_console;
|
||||
ret_jint cproxy_s_java_lang_System_console() {
|
||||
JNIEnv *env = go_seq_push_local_frame(0);
|
||||
jobject res = (*env)->CallStaticObjectMethod(env, class_java_lang_System, m_s_java_lang_System_console);
|
||||
jobject _exc = go_seq_get_exception(env);
|
||||
int32_t _exc_ref = go_seq_to_refnum(env, _exc);
|
||||
if (_exc != NULL) {
|
||||
res = NULL;
|
||||
}
|
||||
jint _res = go_seq_to_refnum(env, res);
|
||||
go_seq_pop_local_frame(env);
|
||||
ret_jint __res = {_res, _exc_ref};
|
||||
return __res;
|
||||
}
|
||||
|
||||
static jclass class_java_Future;
|
||||
static jclass sclass_java_Future;
|
||||
static jmethodID m_java_Future_get__;
|
||||
@ -84,8 +86,10 @@ void init_proxies() {
|
||||
class_java_util_concurrent_TimeUnit = (*env)->NewGlobalRef(env, clazz);
|
||||
clazz = (*env)->FindClass(env, "java/util/Spliterators");
|
||||
class_java_util_Spliterators = (*env)->NewGlobalRef(env, clazz);
|
||||
m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2 = go_seq_get_static_method_id(clazz, "iterator", "(Ljava/util/Spliterator$OfInt;)Ljava/util/PrimitiveIterator$OfInt;");
|
||||
clazz = (*env)->FindClass(env, "java/lang/System");
|
||||
class_java_lang_System = (*env)->NewGlobalRef(env, clazz);
|
||||
m_s_java_lang_System_console = go_seq_get_static_method_id(clazz, "console", "()Ljava/io/Console;");
|
||||
clazz = (*env)->FindClass(env, "java/Future");
|
||||
class_java_Future = (*env)->NewGlobalRef(env, clazz);
|
||||
sclass_java_Future = (*env)->GetSuperclass(env, clazz);
|
||||
|
4
bind/testdata/classes.java.h.golden
vendored
4
bind/testdata/classes.java.h.golden
vendored
@ -59,8 +59,8 @@ extern ret_jint csuper_java_InputStream_read__(jint this);
|
||||
extern jint cproxy_java_Runnable_run(jint this);
|
||||
extern jint csuper_java_Runnable_run(jint this);
|
||||
extern jint cproxy_java_io_Console_flush(jint this);
|
||||
extern ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2(jclass clazz, jmethodID m, jint a0);
|
||||
extern ret_jint cproxy_s_java_lang_System_console(jclass clazz, jmethodID m);
|
||||
extern ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2(jint a0);
|
||||
extern ret_jint cproxy_s_java_lang_System_console();
|
||||
// JNI function headers for the Go <=> Java bridge.
|
||||
// gobind -lang=java classes
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user