From: William F. <wsf...@us...> - 2006-10-11 22:39:57
|
Update of /cvsroot/swig/SWIG/Source/Modules In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv12679/Source/Modules Modified Files: java.cxx Log Message: Fix #1238798 - Directors using unsigned long long or any other type marshalled across the JNI boundary using a Java class (where the jni typemap contains jobject). Index: java.cxx =================================================================== RCS file: /cvsroot/swig/SWIG/Source/Modules/java.cxx,v retrieving revision 1.127 retrieving revision 1.128 diff -C2 -d -r1.127 -r1.128 *** java.cxx 4 Oct 2006 17:34:07 -0000 1.127 --- java.cxx 11 Oct 2006 22:39:54 -0000 1.128 *************** *** 3093,3096 **** --- 3093,3116 ---- } + String *cdesc = NULL; + SwigType *covariant = Getattr(n,"covariant"); + SwigType *adjustedreturntype = covariant ? covariant : returntype; + Parm *adjustedreturntypeparm = NewParmFromNode(adjustedreturntype, empty_str, n); + + if ((tm = Swig_typemap_lookup_new("directorin", adjustedreturntypeparm, "", 0)) + && (cdesc = Getattr(adjustedreturntypeparm, "tmap:directorin:descriptor"))) { + + // Note that in the case of polymorphic (covariant) return types, the + // method's return type is changed to be the base of the C++ return + // type + String *jnidesc_canon = canonicalizeJNIDescriptor(cdesc, adjustedreturntypeparm); + Append(classret_desc, jnidesc_canon); + Delete(jnidesc_canon); + } else { + Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, + "No or improper directorin typemap defined for %s\n", SwigType_str(returntype,0)); + output_director = false; + } + /* Get the JNI field descriptor for this return type, add the JNI field descriptor to jniret_desc */ *************** *** 3099,3103 **** if ((c_ret_type = Swig_typemap_lookup_new("jni", retpm, "", 0))) { - String *jdesc; Parm *tp = NewParmFromNode(c_ret_type, empty_str, n); --- 3119,3122 ---- *************** *** 3108,3116 **** } if ((tm = Swig_typemap_lookup_new("directorin", tp, "", 0)) && (jdesc = Getattr(tp, "tmap:directorin:descriptor"))) { - String *jnidesc_canon; ! jnidesc_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jniret_desc, jnidesc_canon); Delete(jnidesc_canon); --- 3127,3139 ---- } + String *jdesc = NULL; if ((tm = Swig_typemap_lookup_new("directorin", tp, "", 0)) && (jdesc = Getattr(tp, "tmap:directorin:descriptor"))) { ! // Objects marshalled passing a Java class across JNI boundary use jobject - the nouse flag indicates this ! // We need the specific Java class name instead of the generic 'Ljava/lang/Object;' ! if (GetFlag(tp, "tmap:directorin:nouse")) ! jdesc = cdesc; ! String *jnidesc_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jniret_desc, jnidesc_canon); Delete(jnidesc_canon); *************** *** 3128,3153 **** } - String *jdesc; - - SwigType *covariant = Getattr(n,"covariant"); - SwigType *adjustedreturntype = covariant ? covariant : returntype; - Parm *adjustedreturntypeparm = NewParmFromNode(adjustedreturntype, empty_str, n); - - if ((tm = Swig_typemap_lookup_new("directorin", adjustedreturntypeparm, "", 0)) - && (jdesc = Getattr(adjustedreturntypeparm, "tmap:directorin:descriptor"))) { - String *jnidesc_canon; - - // Note that in the case of polymorphic (covariant) return types, the - // method's return type is changed to be the base of the C++ return - // type - jnidesc_canon = canonicalizeJNIDescriptor(jdesc, adjustedreturntypeparm); - Append(classret_desc, jnidesc_canon); - Delete(jnidesc_canon); - } else { - Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, - "No or improper directorin typemap defined for %s\n", SwigType_str(returntype,0)); - output_director = false; - } - Delete(adjustedreturntypeparm); Delete(retpm); --- 3151,3154 ---- *************** *** 3223,3229 **** if ((tm = Swig_typemap_lookup_new("directorin", tp, "", 0)) && (jdesc = Getattr(tp, "tmap:directorin:descriptor"))) { ! String *jni_canon; ! ! jni_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jnidesc, jni_canon); Delete(jni_canon); --- 3224,3228 ---- if ((tm = Swig_typemap_lookup_new("directorin", tp, "", 0)) && (jdesc = Getattr(tp, "tmap:directorin:descriptor"))) { ! String *jni_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jnidesc, jni_canon); Delete(jni_canon); *************** *** 3274,3280 **** && (tm = Getattr(p, "tmap:directorin")) && (cdesc = Getattr(p, "tmap:directorin:descriptor"))) { - String *jni_canon; ! jni_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jnidesc, jni_canon); Delete(jni_canon); --- 3273,3282 ---- && (tm = Getattr(p, "tmap:directorin")) && (cdesc = Getattr(p, "tmap:directorin:descriptor"))) { ! // Objects marshalled by passing a Java class across the JNI boundary use jobject as the JNI type - ! // the nouse flag indicates this. We need the specific Java class name instead of the generic 'Ljava/lang/Object;' ! if (GetFlag(tp, "tmap:directorin:nouse")) ! jdesc = cdesc; ! String *jni_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jnidesc, jni_canon); Delete(jni_canon); |