javagetcptr and javaptrconstructormodifiers typemap replaced by the javabody/javabody_derived typemap

javaclassmodifiers typemap now contains the class type
jniclassclassmodifiers and moduleclassmodifiers pragmas now contain the class type
$module special variable support


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5968 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2004-06-03 22:38:05 +00:00
commit 910e6b2d54

View file

@ -49,7 +49,6 @@ class JAVA : public Language {
bool global_variable_flag; // Flag for when wrapping a global variable bool global_variable_flag; // Flag for when wrapping a global variable
bool member_func_flag; // flag set when wrapping a member function bool member_func_flag; // flag set when wrapping a member function
String *module; // module name
String *imclass_name; // intermediary class name String *imclass_name; // intermediary class name
String *module_class_name; // module class name String *module_class_name; // module class name
String *imclass_class_code; // intermediary class code String *imclass_class_code; // intermediary class code
@ -255,9 +254,8 @@ class JAVA : public Language {
* --------------------------------------------------------------------- */ * --------------------------------------------------------------------- */
virtual int top(Node *n) { virtual int top(Node *n) {
// Make the intermediary class and module class names. The
// intermediary class name can be set in the module directive.
// Get any options set in the module directive
Node* optionsnode = Getattr( Getattr(n,"module"), "options"); Node* optionsnode = Getattr( Getattr(n,"module"), "options");
if (optionsnode) { if (optionsnode) {
@ -292,7 +290,7 @@ class JAVA : public Language {
if (directorsEnabled()) { if (directorsEnabled()) {
f_runtime_h = NewFile(outfile_h,"w"); f_runtime_h = NewFile(outfile_h,"w");
if (!f_runtime_h) { if (!f_runtime_h) {
Printf(stderr,"*** Can't open '%s'\n", outfile_h); Printf(stderr,"Unable to open %s\n", outfile_h);
SWIG_exit(EXIT_FAILURE); SWIG_exit(EXIT_FAILURE);
} }
} }
@ -313,6 +311,7 @@ class JAVA : public Language {
swig_types_hash = NewHash(); swig_types_hash = NewHash();
// Make the intermediary class and module class names. The intermediary class name can be set in the module directive.
if (!imclass_name) { if (!imclass_name) {
imclass_name = NewStringf("%sJNI", Getattr(n,"name")); imclass_name = NewStringf("%sJNI", Getattr(n,"name"));
module_class_name = Copy(Getattr(n,"name")); module_class_name = Copy(Getattr(n,"name"));
@ -324,19 +323,18 @@ class JAVA : public Language {
module_class_name = Copy(Getattr(n,"name")); module_class_name = Copy(Getattr(n,"name"));
} }
module = Copy(Getattr(n,"name"));
imclass_class_code = NewString(""); imclass_class_code = NewString("");
proxy_class_def = NewString(""); proxy_class_def = NewString("");
proxy_class_code = NewString(""); proxy_class_code = NewString("");
module_class_constants_code = NewString(""); module_class_constants_code = NewString("");
imclass_baseclass = NewString(""); imclass_baseclass = NewString("");
imclass_interfaces = NewString(""); imclass_interfaces = NewString("");
imclass_class_modifiers = NewString(""); // package access only to the intermediary class by default imclass_class_modifiers = NewString("");
module_class_code = NewString(""); module_class_code = NewString("");
module_baseclass = NewString(""); module_baseclass = NewString("");
module_interfaces = NewString(""); module_interfaces = NewString("");
module_imports = NewString(""); module_imports = NewString("");
module_class_modifiers = NewString("public"); module_class_modifiers = NewString("");
imclass_imports = NewString(""); imclass_imports = NewString("");
imclass_cppcasts_code = NewString(""); imclass_cppcasts_code = NewString("");
imclass_directors = NewString(""); imclass_directors = NewString("");
@ -358,13 +356,11 @@ class JAVA : public Language {
if (directorsEnabled()) { if (directorsEnabled()) {
Printf(f_runtime,"#define SWIG_DIRECTORS\n"); Printf(f_runtime,"#define SWIG_DIRECTORS\n");
}
/* Emit initial director header and director code: */ /* Emit initial director header and director code: */
if (directorsEnabled()) {
Swig_banner(f_directors_h); Swig_banner(f_directors_h);
Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_class_name);
Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_class_name);
Printf(f_directors, "\n\n"); Printf(f_directors, "\n\n");
Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, "/* ---------------------------------------------------\n");
@ -428,7 +424,7 @@ class JAVA : public Language {
if (Len(imclass_class_modifiers) > 0) if (Len(imclass_class_modifiers) > 0)
Printf(f_im, "%s ", imclass_class_modifiers); Printf(f_im, "%s ", imclass_class_modifiers);
Printf(f_im, "class %s ", imclass_name); Printf(f_im, "%s ", imclass_name);
if (imclass_baseclass && *Char(imclass_baseclass)) if (imclass_baseclass && *Char(imclass_baseclass))
Printf(f_im, "extends %s ", imclass_baseclass); Printf(f_im, "extends %s ", imclass_baseclass);
@ -437,6 +433,7 @@ class JAVA : public Language {
Printf(f_im, "{\n"); Printf(f_im, "{\n");
// Add the intermediary class methods // Add the intermediary class methods
Replaceall(imclass_class_code, "$module", module_class_name);
Printv(f_im, imclass_class_code, NIL); Printv(f_im, imclass_class_code, NIL);
Printv(f_im, imclass_cppcasts_code, NIL); Printv(f_im, imclass_cppcasts_code, NIL);
if (Len(imclass_directors) > 0) { if (Len(imclass_directors) > 0) {
@ -478,7 +475,7 @@ class JAVA : public Language {
if (Len(module_class_modifiers) > 0) if (Len(module_class_modifiers) > 0)
Printf(f_module, "%s ", module_class_modifiers); Printf(f_module, "%s ", module_class_modifiers);
Printf(f_module, "class %s ", module_class_name); Printf(f_module, "%s ", module_class_name);
if (module_baseclass && *Char(module_baseclass)) if (module_baseclass && *Char(module_baseclass))
Printf(f_module, "extends %s ", module_baseclass); Printf(f_module, "extends %s ", module_baseclass);
@ -493,6 +490,9 @@ class JAVA : public Language {
} }
Printf(f_module, "{\n"); Printf(f_module, "{\n");
Replaceall(module_class_code, "$module", module_class_name);
Replaceall(module_class_constants_code, "$module", module_class_name);
// Add the wrapper methods // Add the wrapper methods
Printv(f_module, module_class_code, NIL); Printv(f_module, module_class_code, NIL);
@ -520,9 +520,7 @@ class JAVA : public Language {
if(module_imports) if(module_imports)
Printf(f_module, "%s\n", module_imports); Printf(f_module, "%s\n", module_imports);
if (Len(module_class_modifiers) > 0) Printf(f_module, "public interface %sConstants {\n", module_class_name);
Printf(f_module, "%s ", module_class_modifiers);
Printf(f_module, "interface %sConstants {\n", module_class_name);
// Write out all the global constants // Write out all the global constants
Printv(f_module, module_class_constants_code, NIL); Printv(f_module, module_class_constants_code, NIL);
@ -546,17 +544,6 @@ class JAVA : public Language {
emitTypeWrapperClass(swig_type.key, swig_type.item); emitTypeWrapperClass(swig_type.key, swig_type.item);
} }
/* Close all of the files */
Dump(f_header,f_runtime);
if (directorsEnabled()) {
Dump(f_directors, f_runtime);
Dump(f_directors_h, f_runtime_h);
Printf(f_runtime_h, "\n");
Printf(f_runtime_h, "#endif\n");
}
Delete(swig_types_hash); swig_types_hash = NULL; Delete(swig_types_hash); swig_types_hash = NULL;
Delete(imclass_name); imclass_name = NULL; Delete(imclass_name); imclass_name = NULL;
Delete(imclass_class_code); imclass_class_code = NULL; Delete(imclass_class_code); imclass_class_code = NULL;
@ -584,14 +571,22 @@ class JAVA : public Language {
n_dmethods = 0; n_dmethods = 0;
emitted_connect = false; emitted_connect = false;
if (f_runtime_h) { /* Close all of the files */
Dump(f_header,f_runtime);
if (directorsEnabled()) {
Dump(f_directors, f_runtime);
Dump(f_directors_h, f_runtime_h);
Printf(f_runtime_h, "\n");
Printf(f_runtime_h, "#endif\n");
Close(f_runtime_h); Close(f_runtime_h);
Delete(f_runtime_h); f_runtime_h = NULL; Delete(f_runtime_h); f_runtime_h = NULL;
Delete(f_directors); f_directors = NULL;
Delete(f_directors_h); f_directors_h = NULL;
} }
Delete(f_directors); f_directors = NULL;
Delete(f_directors_h); f_directors_h = NULL;
Dump(f_wrappers,f_runtime); Dump(f_wrappers,f_runtime);
Wrapper_pretty_print(f_init,f_runtime); Wrapper_pretty_print(f_init,f_runtime);
Delete(f_header); Delete(f_header);
@ -757,6 +752,7 @@ class JAVA : public Language {
Swig_typemap_attach_parms("jni", l, f); Swig_typemap_attach_parms("jni", l, f);
Swig_typemap_attach_parms("jtype", l, f); Swig_typemap_attach_parms("jtype", l, f);
/* Get return types */
if ((tm = Swig_typemap_lookup_new("jni",n,"",0))) { if ((tm = Swig_typemap_lookup_new("jni",n,"",0))) {
Printf(c_return_type,"%s", tm); Printf(c_return_type,"%s", tm);
} else { } else {
@ -1112,7 +1108,7 @@ class JAVA : public Language {
(enum_feature == ProperEnum) ? (enum_feature == ProperEnum) ?
";\n" : ";\n" :
"", "",
typemapLookup("javagetcptr", typemap_lookup_type, WARN_NONE), // getCPtr method (will probably never be used, but what the heck) typemapLookup("javabody", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class
typemapLookup("javacode", typemap_lookup_type, WARN_NONE), // extra Java code typemapLookup("javacode", typemap_lookup_type, WARN_NONE), // extra Java code
"}\n", "}\n",
"\n", "\n",
@ -1351,6 +1347,16 @@ class JAVA : public Language {
return SWIG_OK; return SWIG_OK;
} }
/* -----------------------------------------------------------------------------
* insertDirective()
* ----------------------------------------------------------------------------- */
virtual int insertDirective(Node *n) {
String *code = Getattr(n,"code");
Replaceall(code, "$module", module_class_name);
return Language::insertDirective(n);
}
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* pragmaDirective() * pragmaDirective()
* *
@ -1516,7 +1522,7 @@ class JAVA : public Language {
typemapLookup("javaimports", typemap_lookup_type, WARN_NONE), // Import statements typemapLookup("javaimports", typemap_lookup_type, WARN_NONE), // Import statements
"\n", "\n",
typemapLookup("javaclassmodifiers", typemap_lookup_type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers typemapLookup("javaclassmodifiers", typemap_lookup_type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers
" class $javaclassname", // Class name and bases " $javaclassname", // Class name and bases
(derived || *Char(pure_baseclass)) ? (derived || *Char(pure_baseclass)) ?
" extends " : " extends " :
"", "",
@ -1526,20 +1532,10 @@ class JAVA : public Language {
" implements " : " implements " :
"", "",
pure_interfaces, pure_interfaces,
" {\n", " {",
" private long swigCPtr;\n", // Member variables for memory handling
derived ? derived ?
"" : typemapLookup("javabody_derived", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF) : // main body of class
" protected boolean swigCMemOwn;\n", typemapLookup("javabody", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class
"\n",
" ",
typemapLookup("javaptrconstructormodifiers", typemap_lookup_type, WARN_JAVA_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers
" $javaclassname(long cPtr, boolean cMemoryOwn) {\n", // Constructor used for wrapping pointers
derived ?
" super($imclassname.SWIG$javaclassnameTo$baseclass(cPtr), cMemoryOwn);\n" :
" swigCMemOwn = cMemoryOwn;\n",
" swigCPtr = cPtr;\n",
" }\n",
NIL); NIL);
if(!have_default_constructor_flag) { // All proxy classes need a constructor if(!have_default_constructor_flag) { // All proxy classes need a constructor
@ -1589,9 +1585,8 @@ class JAVA : public Language {
Delete(attributes); Delete(attributes);
Delete(destruct); Delete(destruct);
// Emit various other methods // Emit extra user code
Printv(proxy_class_def, Printv(proxy_class_def,
typemapLookup("javagetcptr", typemap_lookup_type, WARN_JAVA_TYPEMAP_GETCPTR_UNDEF), // getCPtr method
typemapLookup("javacode", typemap_lookup_type, WARN_NONE), // extra Java code typemapLookup("javacode", typemap_lookup_type, WARN_NONE), // extra Java code
"\n", "\n",
NIL); NIL);
@ -1608,23 +1603,17 @@ class JAVA : public Language {
Replaceall(proxy_class_code, "$javaclassname", proxy_class_name); Replaceall(proxy_class_code, "$javaclassname", proxy_class_name);
Replaceall(proxy_class_def, "$javaclassname", proxy_class_name); Replaceall(proxy_class_def, "$javaclassname", proxy_class_name);
Replaceall(proxy_class_def, "$baseclass", baseclass); Replaceall(proxy_class_def, "$module", module_class_name);
Replaceall(proxy_class_code, "$baseclass", baseclass); Replaceall(proxy_class_code, "$module", module_class_name);
Replaceall(proxy_class_def, "$imclassname", imclass_name);
Replaceall(proxy_class_code, "$imclassname", imclass_name);
// Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy)
if(derived){ if(derived){
Printv(imclass_cppcasts_code," public final static native long ", Printv(imclass_cppcasts_code," public final static native long SWIG$javaclassnameUpcast(long jarg1);\n", NIL);
"SWIG$javaclassnameTo$baseclass(long jarg1);\n",
NIL);
Replaceall(imclass_cppcasts_code, "$javaclassname", proxy_class_name); Replaceall(imclass_cppcasts_code, "$javaclassname", proxy_class_name);
Replaceall(imclass_cppcasts_code, "$baseclass", baseclass);
Printv(upcasts_code, Printv(upcasts_code,
"JNIEXPORT jlong JNICALL Java_$jnipackage$imimclass_SWIG$imclazznameTo$imbaseclass", "JNIEXPORT jlong JNICALL Java_$jnipackage$imimclass_SWIG$imclazznameUpcast",
"(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n",
" jlong baseptr = 0;\n" " jlong baseptr = 0;\n"
" (void)jenv;\n" " (void)jenv;\n"
@ -1637,15 +1626,12 @@ class JAVA : public Language {
String *imimclass = makeValidJniName(imclass_name); String *imimclass = makeValidJniName(imclass_name);
String *imclazzname = makeValidJniName(proxy_class_name); String *imclazzname = makeValidJniName(proxy_class_name);
String *imbaseclass = makeValidJniName(baseclass);
Replaceall(upcasts_code, "$imbaseclass", imbaseclass);
Replaceall(upcasts_code, "$cbaseclass", c_baseclass); Replaceall(upcasts_code, "$cbaseclass", c_baseclass);
Replaceall(upcasts_code, "$imclazzname", imclazzname); Replaceall(upcasts_code, "$imclazzname", imclazzname);
Replaceall(upcasts_code, "$cclass", c_classname); Replaceall(upcasts_code, "$cclass", c_classname);
Replaceall(upcasts_code, "$jnipackage", jnipackage); Replaceall(upcasts_code, "$jnipackage", jnipackage);
Replaceall(upcasts_code, "$imimclass", imimclass); Replaceall(upcasts_code, "$imimclass", imimclass);
Delete(imbaseclass);
Delete(imclazzname); Delete(imclazzname);
Delete(imimclass); Delete(imimclass);
} }
@ -1702,6 +1688,9 @@ class JAVA : public Language {
emitProxyClassDefAndCPPCasts(n); emitProxyClassDefAndCPPCasts(n);
Replaceall(proxy_class_def, "$module", module_class_name);
Replaceall(proxy_class_code, "$module", module_class_name);
Replaceall(proxy_class_constants_code, "$module", module_class_name);
Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); Printv(f_proxy, proxy_class_def, proxy_class_code, NIL);
// Write out all the constants // Write out all the constants
@ -1862,7 +1851,7 @@ class JAVA : public Language {
emit_mark_varargs(l); emit_mark_varargs(l);
int gencomma = !static_flag; int gencomma = !static_flag;
/* Output each parameter */ /* Output each parameter */
for (i = 0, p=l; p; i++) { for (i = 0, p=l; p; i++) {
@ -1933,7 +1922,6 @@ class JAVA : public Language {
else else
Replaceall(tm,"$owner","false"); Replaceall(tm,"$owner","false");
substituteClassname(t, tm); substituteClassname(t, tm);
Replaceall(tm, "$imclassname", imclass_name);
Replaceall(tm, "$jnicall", imcall); Replaceall(tm, "$jnicall", imcall);
} else { } else {
Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number, Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number,
@ -2164,7 +2152,6 @@ class JAVA : public Language {
* a Java long is used for all classes in the SWIG intermediary class. * a Java long is used for all classes in the SWIG intermediary class.
* The intermediary class methods are thus mangled when overloaded to give * The intermediary class methods are thus mangled when overloaded to give
* a unique name. */ * a unique name. */
String *overloaded_name = NewStringf("%s", Getattr(n,"sym:name")); String *overloaded_name = NewStringf("%s", Getattr(n,"sym:name"));
if (Getattr(n,"sym:overloaded")) { if (Getattr(n,"sym:overloaded")) {
@ -2297,7 +2284,6 @@ class JAVA : public Language {
else else
Replaceall(tm,"$owner","false"); Replaceall(tm,"$owner","false");
substituteClassname(t, tm); substituteClassname(t, tm);
Replaceall(tm, "$imclassname", imclass_name);
Replaceall(tm, "$jnicall", imcall); Replaceall(tm, "$jnicall", imcall);
} else { } else {
Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number, Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number,
@ -2515,7 +2501,7 @@ class JAVA : public Language {
typemapLookup("javaimports", type, WARN_NONE), // Import statements typemapLookup("javaimports", type, WARN_NONE), // Import statements
"\n", "\n",
typemapLookup("javaclassmodifiers", type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers typemapLookup("javaclassmodifiers", type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers
" class $javaclassname", // Class name and bases " $javaclassname", // Class name and bases
*Char(pure_baseclass) ? *Char(pure_baseclass) ?
" extends " : " extends " :
"", "",
@ -2524,29 +2510,19 @@ class JAVA : public Language {
" implements " : " implements " :
"", "",
pure_interfaces, pure_interfaces,
" {\n", " {",
" private long swigCPtr;\n", typemapLookup("javabody", type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class
"\n",
" ",
typemapLookup("javaptrconstructormodifiers", type, WARN_JAVA_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers
" $javaclassname(long cPtr, boolean bFutureUse) {\n", // Constructor used for wrapping pointers
" swigCPtr = cPtr;\n",
" }\n",
"\n",
" protected $javaclassname() {\n", // Default constructor
" swigCPtr = 0;\n",
" }\n",
typemapLookup("javagetcptr", type, WARN_JAVA_TYPEMAP_GETCPTR_UNDEF), // getCPtr method
typemapLookup("javacode", type, WARN_NONE), // extra Java code typemapLookup("javacode", type, WARN_NONE), // extra Java code
"}\n", "}\n",
"\n", "\n",
NIL); NIL);
Replaceall(swigtype, "$javaclassname", classname); Replaceall(swigtype, "$javaclassname", classname);
Printv(f_swigtype, swigtype, NIL); Replaceall(swigtype, "$module", module_class_name);
Printv(f_swigtype, swigtype, NIL);
Close(f_swigtype); Close(f_swigtype);
Delete(swigtype); Delete(swigtype);
} }
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
@ -3125,7 +3101,7 @@ class JAVA : public Language {
din = Copy(Getattr(p, "tmap:javadirectorin")); din = Copy(Getattr(p, "tmap:javadirectorin"));
if (din != NULL) { if (din != NULL) {
Replaceall(din, "$imclassname", imclass_name); Replaceall(din, "$module", module_class_name);
Replaceall(din, "$javaclassname", canon_type); Replaceall(din, "$javaclassname", canon_type);
Replaceall(din, "$jniinput", ln); Replaceall(din, "$jniinput", ln);