diff --git a/bind/testdata/java.go b/bind/testdata/java.go index 997e3ee..6e06b4e 100644 --- a/bind/testdata/java.go +++ b/bind/testdata/java.go @@ -11,6 +11,7 @@ import ( type ( F lang.Float + L lang.Long O lang.Object R lang.Runnable S Character.Subset // Inner class diff --git a/bind/testdata/java.go.golden b/bind/testdata/java.go.golden index b8b61d7..5e5baa2 100644 --- a/bind/testdata/java.go.golden +++ b/bind/testdata/java.go.golden @@ -32,11 +32,35 @@ import "Java" const _ = Java.Dummy type Float Java.Java_lang_Float +type Long Java.Java_lang_Long type Object Java.Java_lang_Object type Runnable Java.Java_lang_Runnable type Character Java.Java_lang_Character // File is generated by gobind. Do not edit. +package Long + +import "Java" + +const _ = Java.Dummy + +const ( + MIN_VALUE = -9223372036854775808 + MAX_VALUE = 9223372036854775807 + SIZE = 64 + BYTES = 8 +) + +var ( + // Cast takes a proxy for a Java object and converts it to a java.lang.Long proxy. + // Cast panics if the argument is not a proxy or if the underlying object does + // not extend or implement java.lang.Long. + Cast func(v interface{}) Java.Java_lang_Long + +) + +// File is generated by gobind. Do not edit. + package Object import "Java" @@ -176,6 +200,10 @@ type Java_lang_Float interface { ToString() string } +type Java_lang_Long interface { + ToString() string +} + type Java_lang_Object interface { ToString() string } @@ -209,6 +237,7 @@ import ( ) import "Java/java/lang/Float" +import "Java/java/lang/Long" import "Java/java/lang/Object" import "Java/java/lang/Runnable" import "Java/java/lang/Character" @@ -230,6 +259,7 @@ const _ = Java.Dummy func initClasses() { C.init_proxies() init_java_lang_Float() + init_java_lang_Long() init_java_lang_Object() init_java_lang_Runnable() init_java_lang_Character() @@ -277,6 +307,47 @@ func (p *proxy_class_java_lang_Float) ToString() string { return _res } +var class_java_lang_Long C.jclass + +func init_java_lang_Long() { + cls := C.CString("java/lang/Long") + clazz := C.go_seq_find_class(cls) + C.free(unsafe.Pointer(cls)) + if clazz == nil { + return + } + class_java_lang_Long = clazz + Long.Cast = func(v interface{}) Java.Java_lang_Long { + t := reflect.TypeOf((*proxy_class_java_lang_Long)(nil)) + cv := reflect.ValueOf(v).Convert(t).Interface().(*proxy_class_java_lang_Long) + ref := C.jint(_seq.ToRefNum(cv)) + if C.go_seq_isinstanceof(ref, class_java_lang_Long) != 1 { + panic(fmt.Errorf("%T is not an instance of %s", v, "java.lang.Long")) + } + return cv + } +} + +type proxy_class_java_lang_Long _seq.Ref + +func (p *proxy_class_java_lang_Long) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() } + +func (p *proxy_class_java_lang_Long) ToString() string { + res := C.cproxy_java_lang_Long_toString(C.jint(p.Bind_proxy_refnum__())) + _res := decodeString(res.res) + 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 +} + var class_java_lang_Object C.jclass func init_java_lang_Object() { @@ -467,6 +538,25 @@ func (p *proxyjava_F) ToString() string { return _res } +//export proxyjava_L_ToString +func proxyjava_L_ToString(refnum C.int32_t) C.nstring { + ref := _seq.FromRefNum(int32(refnum)) + v := ref.Get().(java.L) + res_0 := v.ToString() + _res_0 := encodeString(res_0) + return _res_0 +} + +type proxyjava_L _seq.Ref + +func (p *proxyjava_L) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() } + +func (p *proxyjava_L) ToString() string { + res := C.cproxyjava_L_ToString(C.int32_t(p.Bind_proxy_refnum__())) + _res := decodeString(res) + return _res +} + //export proxyjava_O_ToString func proxyjava_O_ToString(refnum C.int32_t) C.nstring { ref := _seq.FromRefNum(int32(refnum)) diff --git a/bind/testdata/java.java.c.golden b/bind/testdata/java.java.c.golden index b1fbd2b..980a4dd 100644 --- a/bind/testdata/java.java.c.golden +++ b/bind/testdata/java.java.c.golden @@ -6,6 +6,8 @@ static jclass class_java_lang_Float; static jmethodID m_java_lang_Float_toString; +static jclass class_java_lang_Long; +static jmethodID m_java_lang_Long_toString; static jclass class_java_lang_Object; static jmethodID m_java_lang_Object_toString; static jclass class_java_lang_Runnable; @@ -15,11 +17,14 @@ static jclass class_java_lang_Character_Subset; static jmethodID m_java_lang_Character_Subset_toString; void init_proxies() { - JNIEnv *env = go_seq_push_local_frame(5); + JNIEnv *env = go_seq_push_local_frame(6); jclass clazz; clazz = (*env)->FindClass(env, "java/lang/Float"); class_java_lang_Float = (*env)->NewGlobalRef(env, clazz); m_java_lang_Float_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;"); + clazz = (*env)->FindClass(env, "java/lang/Long"); + class_java_lang_Long = (*env)->NewGlobalRef(env, clazz); + m_java_lang_Long_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;"); clazz = (*env)->FindClass(env, "java/lang/Object"); class_java_lang_Object = (*env)->NewGlobalRef(env, clazz); m_java_lang_Object_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;"); @@ -50,6 +55,22 @@ ret_nstring cproxy_java_lang_Float_toString(jint this) { return __res; } +ret_nstring cproxy_java_lang_Long_toString(jint this) { + JNIEnv *env = go_seq_push_local_frame(1); + // Must be a Java object + jobject _this = go_seq_from_refnum(env, this, NULL, NULL); + jstring res = (*env)->CallObjectMethod(env, _this, m_java_lang_Long_toString); + jobject _exc = go_seq_get_exception(env); + int32_t _exc_ref = go_seq_to_refnum(env, _exc); + if (_exc != NULL) { + res = NULL; + } + nstring _res = go_seq_from_java_string(env, res); + go_seq_pop_local_frame(env); + ret_nstring __res = {_res, _exc_ref}; + return __res; +} + ret_nstring cproxy_java_lang_Object_toString(jint this) { JNIEnv *env = go_seq_push_local_frame(1); // Must be a Java object @@ -112,6 +133,9 @@ ret_nstring cproxy_java_lang_Character_Subset_toString(jint this) { jclass proxy_class_java_F; jmethodID proxy_class_java_F_cons; static jmethodID mid_F_ToString; +jclass proxy_class_java_L; +jmethodID proxy_class_java_L_cons; +static jmethodID mid_L_ToString; jclass proxy_class_java_O; jmethodID proxy_class_java_O_cons; static jmethodID mid_O_ToString; @@ -130,6 +154,12 @@ Java_java_Java__1init(JNIEnv *env, jclass _unused) { clazz = (*env)->FindClass(env, "java/F"); mid_F_ToString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;"); + clazz = (*env)->FindClass(env, "java/Java$proxyL"); + proxy_class_java_L = (*env)->NewGlobalRef(env, clazz); + proxy_class_java_L_cons = (*env)->GetMethodID(env, clazz, "", "(Lgo/Seq$Ref;)V"); + clazz = (*env)->FindClass(env, "java/L"); + mid_L_ToString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;"); + clazz = (*env)->FindClass(env, "java/Java$proxyO"); proxy_class_java_O = (*env)->NewGlobalRef(env, clazz); proxy_class_java_O_cons = (*env)->GetMethodID(env, clazz, "", "(Lgo/Seq$Ref;)V"); @@ -166,6 +196,23 @@ nstring cproxyjava_F_ToString(int32_t refnum) { return _res; } +JNIEXPORT jstring JNICALL +Java_java_Java_00024proxyL_toString(JNIEnv* env, jobject __this__) { + int32_t o = go_seq_to_refnum_go(env, __this__); + nstring r0 = proxyjava_L_ToString(o); + jstring _r0 = go_seq_to_java_string(env, r0); + return _r0; +} + +nstring cproxyjava_L_ToString(int32_t refnum) { + JNIEnv *env = go_seq_push_local_frame(0); + jobject o = go_seq_from_refnum(env, refnum, proxy_class_java_L, proxy_class_java_L_cons); + jstring res = (*env)->CallObjectMethod(env, o, mid_L_ToString); + nstring _res = go_seq_from_java_string(env, res); + go_seq_pop_local_frame(env); + return _res; +} + JNIEXPORT jstring JNICALL Java_java_Java_00024proxyO_toString(JNIEnv* env, jobject __this__) { int32_t o = go_seq_to_refnum_go(env, __this__); diff --git a/bind/testdata/java.java.golden b/bind/testdata/java.java.golden index dd5fd21..22a2ec5 100644 --- a/bind/testdata/java.java.golden +++ b/bind/testdata/java.java.golden @@ -11,6 +11,19 @@ public interface F extends R { } +// Java class java.L is a proxy for talking to a Go program. +// gobind -lang=java java +// +// File is generated by gobind. Do not edit. +package java; + +import go.Seq; + +public interface L extends R { + public String toString(); + +} + // Java class java.O is a proxy for talking to a Go program. // gobind -lang=java java // @@ -83,6 +96,19 @@ public abstract class Java { public native String toString(); } + private static final class proxyL implements Seq.Proxy, L { + private final Seq.Ref ref; + + @Override public final int incRefnum() { + int refnum = ref.refnum; + Seq.incGoRef(refnum); + return refnum; + } + + proxyL(Seq.Ref ref) { this.ref = ref; } + + public native String toString(); + } private static final class proxyO implements Seq.Proxy, O { private final Seq.Ref ref; diff --git a/bind/testdata/java.java.h.golden b/bind/testdata/java.java.h.golden index 0cc218e..3d9671a 100644 --- a/bind/testdata/java.java.h.golden +++ b/bind/testdata/java.java.h.golden @@ -47,6 +47,7 @@ typedef struct ret_nbyteslice { } ret_nbyteslice; extern ret_nstring cproxy_java_lang_Float_toString(jint this); +extern ret_nstring cproxy_java_lang_Long_toString(jint this); extern ret_nstring cproxy_java_lang_Object_toString(jint this); extern ret_nstring cproxy_java_lang_Character_toString(jint this); extern ret_nstring cproxy_java_lang_Character_Subset_toString(jint this); @@ -65,6 +66,11 @@ extern jmethodID proxy_class_java_F_cons; nstring cproxyjava_F_ToString(int32_t refnum); +extern jclass proxy_class_java_L; +extern jmethodID proxy_class_java_L_cons; + +nstring cproxyjava_L_ToString(int32_t refnum); + extern jclass proxy_class_java_O; extern jmethodID proxy_class_java_O_cons; diff --git a/internal/importers/java/java.go b/internal/importers/java/java.go index 8a4cdef..8cbc6ae 100644 --- a/internal/importers/java/java.go +++ b/internal/importers/java/java.go @@ -1103,7 +1103,7 @@ func (j *Importer) fillAllMethods(cls *Class) { } func (j *Importer) parseJavaValue(v string) (string, bool) { - v = strings.TrimRight(v, "df") + v = strings.TrimRight(v, "ldf") switch v { case "", "NaN", "Infinity", "-Infinity": return "", false