From: William F. <wsf...@us...> - 2004-11-30 20:32:14
|
Update of /cvsroot/swig/SWIG/Source/Modules In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26877/Source/Modules Modified Files: java.cxx Log Message: Director code mods: JNI field descriptors fix to use C++ type and correctly use the $javaclassname family of special variables. The real C++ type used everwhere in director code to fix numerous director bugs. Index: java.cxx =================================================================== RCS file: /cvsroot/swig/SWIG/Source/Modules/java.cxx,v retrieving revision 1.78 retrieving revision 1.79 diff -C2 -d -r1.78 -r1.79 *** java.cxx 28 Nov 2004 19:03:02 -0000 1.78 --- java.cxx 30 Nov 2004 20:31:51 -0000 1.79 *************** *** 2740,2807 **** /* --------------------------------------------------------------- - * Reduce and canonicalize the input type - * - * (scottm) There is probably a SWIG function to do this, but I - * haven't found it yet. - * (william) Rewriting this area based on substituteClassname() - * should work - using getProxyName() and getEnumName(). - * --------------------------------------------------------------- */ - - Node *canonicalizeType(Node *n, String *classtype) { - String *reduced_type = SwigType_typedef_resolve_all(classtype); - String *base_type; - - if (SwigType_isenum(reduced_type)) { - /* Enum handling code: Swig_typedef_resolve_all() will prefix an - * enumerated type with "enum ", leading to all kinds of headaches - * when above code is called. Need to call Swig_symbol_clookup - * with the unadorned enum name. - */ - base_type = classtype; - } else { - base_type = SwigType_base(reduced_type); - } - - Node *classnode = Swig_symbol_clookup(base_type, Getattr(n, "sym:symtab")); - - if (classnode != NULL) { - /* This takes care of the case when there are forward declared - * classes that Language::classHandler() hasn't encountered yet. - * - * Swig_symbol_clookup() will find <<a node>> attached to - * the base_type name, and there will be a csym:nextSibling node - * chain. Most of the time, there **wont** be * a "class"-type - * node. Mostly, what I've seen are "constructor"-type nodes. - * Eventutally, however, a node is encountered with its - * sym:name set and this happens to be the right name. - * - * The worst that can happen here is that base_type is unchanged, - * which tends also to be the right thing to do. - * - * Dunno, this seems to work, so... contemplate what the "right" - * SWIG thing is to do... - */ - - while (classnode && Getattr(classnode, "sym:name") == NULL) { - classnode = Getattr(classnode, "csym:nextSibling"); - } - } - - if (base_type != classtype) - Delete(base_type); - Delete(reduced_type); - - return classnode; - } - - /* --------------------------------------------------------------- * Canonicalize the JNI field descriptor * ! * Take the input type name, reduce the typedef to its fundamental ! * type if necessary, normalize its name. ! * ! * See if the resulting typdef-reduced, normalized type name also ! * has a "javapackage" typemap, and use it instead of the default ! * package_path. * * !!SFM!! If $packagepath occurs in the field descriptor, but --- 2740,2748 ---- /* --------------------------------------------------------------- * Canonicalize the JNI field descriptor * ! * Replace the $javapackage and $javaclassname family of special ! * variables with the desired package and Java proxy name as ! * required in the JNI field descriptors. * * !!SFM!! If $packagepath occurs in the field descriptor, but *************** *** 2811,2844 **** * --------------------------------------------------------------- */ ! String *canonicalJNIFDesc(String *in_desc, Node *n, String *classtype) { ! Node *classnode = canonicalizeType(n, classtype); ! String *name = (classnode ? Getattr(classnode, "name") : classtype); ! String *symname = (classnode ? Getattr(classnode, "sym:name") : classtype); ! Parm *tp = NewParm(name, (String *) empty_string); ! String *pkg_path; ! pkg_path = Swig_typemap_lookup_new("javapackage", tp, "", 0); ! Delete(tp); ! if (pkg_path != NULL && Len(pkg_path) != 0) { Replaceall(pkg_path, ".", "/"); } else pkg_path = package_path; ! String *mod_desc = Copy(in_desc); if (Len(pkg_path) > 0) { ! Replaceall(mod_desc, "$packagepath", pkg_path); } else { ! Replaceall(mod_desc, "$packagepath/", empty_string); ! Replaceall(mod_desc, "$packagepath", empty_string); } ! Replaceall(mod_desc, "$javaclassname", symname); if (pkg_path != package_path) Delete(pkg_path); ! return mod_desc; } --- 2752,2779 ---- * --------------------------------------------------------------- */ ! String *canonicalizeJNIDescriptor(String *descriptor_in, SwigType *type) { ! String *pkg_path = Swig_typemap_lookup_new("javapackage", type, "", 0); ! if (pkg_path && Len(pkg_path) != 0) { Replaceall(pkg_path, ".", "/"); } else pkg_path = package_path; ! String *descriptor_out = Copy(descriptor_in); if (Len(pkg_path) > 0) { ! Replaceall(descriptor_out, "$packagepath", pkg_path); } else { ! Replaceall(descriptor_out, "$packagepath/", empty_string); ! Replaceall(descriptor_out, "$packagepath", empty_string); } ! substituteClassname(type, descriptor_out); if (pkg_path != package_path) Delete(pkg_path); ! return descriptor_out; } *************** *** 2860,2864 **** String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); ! String *type = Getattr(n, "type"); String *c_classname = NULL; String *overloaded_name = getOverloadedName(n); --- 2795,2800 ---- String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); ! SwigType *type = Getattr(n, "type"); ! SwigType *returntype = Getattr(n,"returntype"); String *c_classname = NULL; String *overloaded_name = getOverloadedName(n); *************** *** 2867,2871 **** String *decl = Getattr(n, "decl"); String *declaration = NewString(""); - String *return_type = Copy(type); String *tm; Parm *p; --- 2803,2806 ---- *************** *** 2873,2877 **** Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); ! bool is_void = !(Cmp(type, "void")); String *qualified_return = NewString(""); bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); --- 2808,2812 ---- Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); ! bool is_void = !(Cmp(returntype, "void")); String *qualified_return = NewString(""); bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); *************** *** 2885,2889 **** String *jniret_desc = NewString(""); String *classret_desc = NewString(""); ! String *jniret_type = NULL; String *jupcall_args = NewString("swig_get_self()"); String *imclass_dmethod; --- 2820,2824 ---- String *jniret_desc = NewString(""); String *classret_desc = NewString(""); ! SwigType *jniret_type = NULL; String *jupcall_args = NewString("swig_get_self()"); String *imclass_dmethod; *************** *** 2901,2905 **** imclass_dmethod = NewStringf("SwigDirector_%s", Swig_name_member(classname, overloaded_name)); ! // Get the proper name for the parent node (should be a class... hint) c_classname = Getattr(parent, "name"); --- 2836,2840 ---- imclass_dmethod = NewStringf("SwigDirector_%s", Swig_name_member(classname, overloaded_name)); ! // Get the C++ name for the parent node (should be a class... hint) c_classname = Getattr(parent, "name"); *************** *** 2907,2937 **** c_classname = classname; ! /* Handle and form complete return type, including the modification ! to a pointer, if return type is a reference. */ ! ! if (return_type) { if (!is_void) { - SwigType *t = Copy(decl); - SwigType *f = SwigType_pop_function(t); - - SwigType_push(return_type, t); ! Delete(f); ! Delete(t); ! ! qualified_return = SwigType_rcaststr(return_type, "result"); ! if (!SwigType_isclass(return_type)) { ! if (!(SwigType_ispointer(return_type) || SwigType_isreference(return_type))) { ! Wrapper_add_localv(w, "result", SwigType_lstr(return_type, "result"), NIL); } else { /* initialize pointers to something sane. */ ! Wrapper_add_localv(w, "result", SwigType_lstr(return_type, "result"), "= 0", NIL); } } else { SwigType *vt; ! vt = cplus_value_type(return_type); if (vt == NULL) { ! Wrapper_add_localv(w, "result", SwigType_lstr(return_type, "result"), NIL); } else { Wrapper_add_localv(w, "result", SwigType_lstr(vt, "result"), NIL); --- 2842,2862 ---- c_classname = classname; ! if (returntype) { if (!is_void) { ! qualified_return = SwigType_rcaststr(returntype, "result"); ! if (!SwigType_isclass(returntype)) { ! if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { ! Wrapper_add_localv(w, "result", SwigType_lstr(returntype, "result"), NIL); } else { /* initialize pointers to something sane. */ ! Wrapper_add_localv(w, "result", SwigType_lstr(returntype, "result"), "= 0", NIL); } } else { SwigType *vt; ! vt = cplus_value_type(returntype); if (vt == NULL) { ! Wrapper_add_localv(w, "result", SwigType_lstr(returntype, "result"), NIL); } else { Wrapper_add_localv(w, "result", SwigType_lstr(vt, "result"), NIL); *************** *** 2941,2945 **** /* Create the intermediate class wrapper */ ! Parm *tp = NewParm(return_type, empty_str); tm = Swig_typemap_lookup_new("jtype", tp, "", 0); --- 2866,2870 ---- /* Create the intermediate class wrapper */ ! Parm *tp = NewParm(returntype, empty_str); tm = Swig_typemap_lookup_new("jtype", tp, "", 0); *************** *** 2948,2952 **** } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, ! "No jtype typemap defined for %s\n", SwigType_str(t,0)); } } else --- 2873,2877 ---- } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, ! "No jtype typemap defined for %s\n", SwigType_str(returntype,0)); } } else *************** *** 2956,2960 **** to jniret_desc */ ! Parm *retpm = NewParm(return_type, empty_str); if ((jniret_type = Swig_typemap_lookup_new("jni", retpm, "", 0)) != NULL) { --- 2881,2885 ---- to jniret_desc */ ! Parm *retpm = NewParm(returntype, empty_str); if ((jniret_type = Swig_typemap_lookup_new("jni", retpm, "", 0)) != NULL) { *************** *** 2972,2976 **** String *jnidesc_canon; ! jnidesc_canon = canonicalJNIFDesc(jdesc, n, jniret_type); Append(jniret_desc, jnidesc_canon); Delete(jnidesc_canon); --- 2897,2901 ---- String *jnidesc_canon; ! jnidesc_canon = canonicalizeJNIDescriptor(jdesc, Getattr(tp,"type")); Append(jniret_desc, jnidesc_canon); Delete(jnidesc_canon); *************** *** 2984,2988 **** } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, ! "No jni typemap defined for %s\n", SwigType_str(type,0)); output_director = false; } --- 2909,2913 ---- } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, ! "No jni typemap defined for %s\n", SwigType_str(returntype,0)); output_director = false; } *************** *** 2990,3000 **** String *jdesc; ! if ((tm = Swig_typemap_lookup_new("directorin", retpm, "", 0)) != NULL ! && (jdesc = Getattr(retpm, "tmap:directorin:descriptor")) != NULL) { 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 ! SwigType *virtualtype = Getattr(n,"virtual:type"); ! jnidesc_canon = canonicalJNIFDesc(jdesc, n, virtualtype ? virtualtype : return_type); Append(classret_desc, jnidesc_canon); Delete(jnidesc_canon); --- 2915,2928 ---- String *jdesc; ! SwigType *virtualtype = Getattr(n,"virtual:type"); ! SwigType *adjustedreturntype = virtualtype ? virtualtype : returntype; ! Parm *adjustedreturntypeparm = NewParm(adjustedreturntype, empty_str); ! ! if ((tm = Swig_typemap_lookup_new("directorin", adjustedreturntypeparm, "", 0)) != NULL ! && (jdesc = Getattr(adjustedreturntypeparm, "tmap:directorin:descriptor")) != NULL) { 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, adjustedreturntype); Append(classret_desc, jnidesc_canon); Delete(jnidesc_canon); *************** *** 3005,3008 **** --- 2933,2937 ---- } + Delete(adjustedreturntypeparm); Delete(retpm); } *************** *** 3070,3074 **** /* Start the Java field descriptor for the intermediate class's upcall (insert self object) */ { ! Parm *tp = NewParm(classname, empty_str); String *jdesc; --- 2999,3003 ---- /* Start the Java field descriptor for the intermediate class's upcall (insert self object) */ { ! Parm *tp = NewParm(c_classname, empty_str); String *jdesc; *************** *** 3077,3081 **** String *jni_canon; ! jni_canon = canonicalJNIFDesc(jdesc, n, classname); Append(jnidesc, jni_canon); Delete(jni_canon); --- 3006,3010 ---- String *jni_canon; ! jni_canon = canonicalizeJNIDescriptor(jdesc, Getattr(tp,"type")); Append(jnidesc, jni_canon); Delete(jni_canon); *************** *** 3131,3135 **** String *jni_canon; ! jni_canon = canonicalJNIFDesc(jdesc, n, c_param_type); Append(jnidesc, jni_canon); Delete(jni_canon); --- 3060,3064 ---- String *jni_canon; ! jni_canon = canonicalizeJNIDescriptor(jdesc, Getattr(tp,"type")); Append(jnidesc, jni_canon); Delete(jni_canon); *************** *** 3163,3167 **** Printv(imcall_args, ln, NIL); ! jni_canon = canonicalJNIFDesc(cdesc, n, pt); Append(classdesc, jni_canon); Delete(jni_canon); --- 3092,3096 ---- Printv(imcall_args, ln, NIL); ! jni_canon = canonicalizeJNIDescriptor(cdesc, Getattr(p,"type")); Append(classdesc, jni_canon); Delete(jni_canon); *************** *** 3266,3275 **** if (!is_void) { ! Parm *tp = NewParm(return_type, empty_str); ! String *base_type = SwigType_base(return_type); tm = Swig_typemap_lookup_new("javadirectorout", tp, "", 0); if (tm != NULL) { ! substituteClassname(base_type, tm); Replaceall(tm, "$javacall", upcall); --- 3195,3203 ---- if (!is_void) { ! Parm *tp = NewParm(returntype, empty_str); tm = Swig_typemap_lookup_new("javadirectorout", tp, "", 0); if (tm != NULL) { ! substituteClassname(returntype, tm); Replaceall(tm, "$javacall", upcall); *************** *** 3277,3281 **** } - Delete(base_type); Delete(tm); Delete(tp); --- 3205,3208 ---- *************** *** 3306,3310 **** String *jresult_str = NewString("jresult"); String *result_str = NewString("result"); ! Parm *tp = NewParm(return_type, result_str); /* Copy jresult into result... */ --- 3233,3237 ---- String *jresult_str = NewString("jresult"); String *result_str = NewString("result"); ! Parm *tp = NewParm(returntype, result_str); /* Copy jresult into result... */ |