From: <ash...@us...> - 2009-07-08 23:54:18
|
Revision: 11381 http://swig.svn.sourceforge.net/swig/?rev=11381&view=rev Author: ashishs99 Date: 2009-07-08 23:54:15 +0000 (Wed, 08 Jul 2009) Log Message: ----------- style only fix. Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-08 12:17:45 UTC (rev 11380) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-08 23:54:15 UTC (rev 11381) @@ -5,288 +5,280 @@ #include "swigmod.h" -class OBJC : public Language { +class OBJC:public Language { protected: - static const char *usage; - const String *empty_string; - File *f_ll_h; - File *f_ll_mm; - File *f_runtime; - File *f_header; - File *f_wrappers; - File *f_init; - String *objcpp_h_code; + static const char *usage; + const String *empty_string; + File *f_ll_h; + File *f_ll_mm; + File *f_runtime; + File *f_header; + File *f_wrappers; + File *f_init; + String *objcpp_h_code; - bool proxy_flag; // Flag for generating proxy classes - bool native_function_flag; // Flag for when wrapping a native function + bool proxy_flag; // Flag for generating proxy classes + bool native_function_flag; // Flag for when wrapping a native function public: - OBJC(): empty_string(NewString("")), - f_ll_h(NULL), - f_ll_mm(NULL), - f_runtime(NULL), - f_header(NULL), - f_wrappers(NULL), - f_init(NULL), - native_function_flag(false), - objcpp_h_code(NULL) {} - - virtual void main(int argc, char *argv[]) { - SWIG_library_directory("objc"); - - // Look for certain command line options - for (int i = 1; i < argc; i++) { - if (argv[i]) { - if ((strcmp(argv[i], "-noproxy") == 0)) { - Swig_mark_arg(i); - proxy_flag = false; - } else if (strcmp(argv[i], "-help") == 0) { - Printf(stdout, "%s\n", usage); - } - } - } - - // Add a symbol to the parser for conditional compilation - Preprocessor_define("SWIGOBJC 1", 0); - - // Add typemap definitions - SWIG_typemap_lang("objc"); - SWIG_config_file("objc.swg"); - - allow_overloading(); + OBJC():empty_string(NewString("")), + f_ll_h(NULL), f_ll_mm(NULL), f_runtime(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), native_function_flag(false), objcpp_h_code(NULL) { + } virtual void main(int argc, char *argv[]) { + SWIG_library_directory("objc"); + + // Look for certain command line options + for (int i = 1; i < argc; i++) { + if (argv[i]) { + if ((strcmp(argv[i], "-noproxy") == 0)) { + Swig_mark_arg(i); + proxy_flag = false; + } else if (strcmp(argv[i], "-help") == 0) { + Printf(stdout, "%s\n", usage); } - - virtual int top(Node *n) { - - // Get the module name - String *modulename = Getattr(n,"name"); - - // Initialize all of the output files - String *file_mm = NewStringf("%sWrapper.mm", modulename); - f_ll_mm = NewFile(file_mm, "w", SWIG_output_files()); - if (!f_ll_mm) { - FileErrorDisplay(f_ll_mm); - SWIG_exit(EXIT_FAILURE); - } - - String *file_h = NewStringf("%sWrapper.h", modulename); - f_ll_h = NewFile(file_h, "w", SWIG_output_files()); - if (!f_ll_h) { - FileErrorDisplay(f_ll_h); - SWIG_exit(EXIT_FAILURE); - } - - f_runtime = NewString(""); - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - // Register file targets with the SWIG file handler - Swig_register_filebyname("header", f_header); - Swig_register_filebyname("wrapper", f_wrappers); - Swig_register_filebyname("runtime", f_runtime); - Swig_register_filebyname("init", f_init); - - // Initialize members - objcpp_h_code = NewString(""); - - // Generate low level accessors - Swig_banner(f_ll_h); - - Printf(f_runtime, "\n"); - Printf(f_runtime, "#define SWIGOBJC\n"); - Printf(f_runtime, "\n"); - - Swig_name_register((char *) "wrapper", (char *) "ObjCPP_%f"); - - Printf(f_ll_h, "\n#ifdef __cplusplus\n"); - Printf(f_ll_h, "extern \"C\" {\n"); - Printf(f_ll_h, "#endif\n\n"); - - Printf(f_wrappers, "#include \"%s\"\n\n", file_h); - Printf(f_wrappers, "extern \"C\" {\n"); + } + } - // Emit code for children - Language::top(n); - - Printv(f_ll_h, objcpp_h_code, NIL); - Printf(f_ll_h, "\n#ifdef __cplusplus\n"); - Printf(f_ll_h, "}\n"); - Printf(f_ll_h, "#endif\n"); - - Printf(f_wrappers, "}\n"); - - // Write all to the files - Dump(f_header, f_ll_mm); - Dump(f_wrappers, f_ll_mm); - Wrapper_pretty_print(f_init, f_ll_mm); - - // Cleanup strings - Delete(file_h); - Delete(objcpp_h_code); - objcpp_h_code = NULL; + // Add a symbol to the parser for conditional compilation + Preprocessor_define("SWIGOBJC 1", 0); - // Cleanup files - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Delete(f_runtime); - Close(f_ll_mm); - Delete(f_ll_mm); - Close(f_ll_h); - Delete(f_ll_h); - return SWIG_OK; - } + // Add typemap definitions + SWIG_typemap_lang("objc"); + SWIG_config_file("objc.swg"); - virtual int nativeWrapper(Node *n) { - String *wrapname = Getattr(n, "wrap:name"); - - if (!addSymbol(wrapname, n)) - return SWIG_ERROR; - - if (Getattr(n, "type")) { - Swig_save("nativeWrapper", n, "name", NIL); - Setattr(n, "name", wrapname); - native_function_flag = true; - functionWrapper(n); - Swig_restore(n); - native_function_flag = false; - } else { - Printf(stderr, "%s : Line %d. No return type for %%native method %s.\n", input_file, line_number, Getattr(n, "wrap:name")); - } - - return SWIG_OK; - } - - virtual int functionWrapper(Node *n) { - String *symname = Getattr(n, "sym:name"); - SwigType *t = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - - String *objcpp_return_type = NewString(""); - String *tm; - Parm *p; - int i; - int num_arguments = 0; - int num_required = 0; - bool is_void_return; + allow_overloading(); + } - Wrapper *f = NewWrapper(); - String *wname = Swig_name_wrapper(symname); - - Swig_typemap_attach_parms("ObjCpptype", l, f); + virtual int top(Node *n) { - if ((tm = Swig_typemap_lookup("ObjCpptype", n, "", 0))) { - Printf(objcpp_return_type, "%s", tm); - } else { - // Display warning - } - - is_void_return = (Cmp(objcpp_return_type, "void") == 0); - if (!is_void_return) - Wrapper_add_localv(f, "objcresult", objcpp_return_type, "objcresult", NIL); - - Printv(f->def, objcpp_return_type," ", wname, "(", NIL); - Printv(objcpp_h_code, objcpp_return_type, " ", wname, "(", NIL); - - // Emit all of the local variables for holding arguments. - emit_parameter_variables(l, f); - - // Attach the standard typemaps - emit_attach_parmmaps(l, f); - - // Parameter overloading - Setattr(n, "wrap:parms", l); - Setattr(n, "wrap:name", wname); - - // Get number of required and total arguments - num_arguments = emit_num_arguments(l); - num_required = emit_num_required(l); - int gencomma = 0; - - // Now walk the function parameter list and generate code to get arguments - for (i = 0, p = l; i < num_arguments; i++) { - - while (checkAttribute(p, "tmap:in:numinputs", "0")) { - p = Getattr(p, "tmap:in:next"); - } - - SwigType *pt = Getattr(p, "type"); - String *ln = Getattr(p, "lname"); - String *objcpp_param_type = NewString(""); - String *arg = NewString(""); - - Printf(arg, "objc%s", ln); - - // Get the ctype types of the parameter - if ((tm = Getattr(p, "tmap:ObjCpptype"))) { - Printv(objcpp_param_type, tm, NIL); - } else { - // Display warning - } - - // Add parameter to the objcpp function - Printv(f->def, gencomma ? ", " : "", objcpp_param_type, " ", arg, NIL); - Printv(objcpp_h_code, gencomma ? ", " : "", objcpp_param_type, " ", arg, NIL); + // Get the module name + String *modulename = Getattr(n, "name"); - gencomma = 1; - - // Get typemap for this argument - if ((tm = Getattr(p, "tmap:in"))) { - Replaceall(tm, "$source", arg); /* deprecated */ - Replaceall(tm, "$target", ln); /* deprecated */ - Replaceall(tm, "$arg", arg); /* deprecated? */ - Replaceall(tm, "$input", arg); - Setattr(p, "emit:input", arg); - Printf(f->code, "%s\n", tm); - p = Getattr(p, "tmap:in:next"); - } else { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); - p = nextSibling(p); - } - Delete(objcpp_param_type); - Delete(arg); - } - - // Now write code to make the function call - if (!native_function_flag) { - String *actioncode = emit_action(n); - - // Return value if necessary - if ((tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode))) { - Replaceall(tm, "$source", "result"); /* deprecated */ - Replaceall(tm, "$target", "objcresult"); /* deprecated */ - Replaceall(tm, "$result", "objcresult"); - if (GetFlag(n, "feature:new")) - Replaceall(tm, "$owner", "1"); - else - Replaceall(tm, "$owner", "0"); - Printf(f->code, "%s", tm); - if (Len(tm)) - Printf(f->code, "\n"); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); - } - emit_return_variable(n, t, f); - } - - Printf(objcpp_h_code, ");\n"); - Printf(f->def, ") {"); - - if (!is_void_return) - Printv(f->code, " return objcresult;\n", NIL); - Printf(f->code, "}\n"); - - // Dump the function out - Wrapper_print(f,f_wrappers); - - // Tidy up - Delete(objcpp_return_type); - Delete(wname); - DelWrapper(f); - - return SWIG_OK; - } + // Initialize all of the output files + String *file_mm = NewStringf("%sWrapper.mm", modulename); + f_ll_mm = NewFile(file_mm, "w", SWIG_output_files()); + if (!f_ll_mm) { + FileErrorDisplay(f_ll_mm); + SWIG_exit(EXIT_FAILURE); + } + + String *file_h = NewStringf("%sWrapper.h", modulename); + f_ll_h = NewFile(file_h, "w", SWIG_output_files()); + if (!f_ll_h) { + FileErrorDisplay(f_ll_h); + SWIG_exit(EXIT_FAILURE); + } + + f_runtime = NewString(""); + f_init = NewString(""); + f_header = NewString(""); + f_wrappers = NewString(""); + + // Register file targets with the SWIG file handler + Swig_register_filebyname("header", f_header); + Swig_register_filebyname("wrapper", f_wrappers); + Swig_register_filebyname("runtime", f_runtime); + Swig_register_filebyname("init", f_init); + + // Initialize members + objcpp_h_code = NewString(""); + + // Generate low level accessors + Swig_banner(f_ll_h); + + Printf(f_runtime, "\n"); + Printf(f_runtime, "#define SWIGOBJC\n"); + Printf(f_runtime, "\n"); + + Swig_name_register((char *) "wrapper", (char *) "ObjCPP_%f"); + + Printf(f_ll_h, "\n#ifdef __cplusplus\n"); + Printf(f_ll_h, "extern \"C\" {\n"); + Printf(f_ll_h, "#endif\n\n"); + + Printf(f_wrappers, "#include \"%s\"\n\n", file_h); + Printf(f_wrappers, "extern \"C\" {\n"); + + // Emit code for children + Language::top(n); + + Printv(f_ll_h, objcpp_h_code, NIL); + Printf(f_ll_h, "\n#ifdef __cplusplus\n"); + Printf(f_ll_h, "}\n"); + Printf(f_ll_h, "#endif\n"); + + Printf(f_wrappers, "}\n"); + + // Write all to the files + Dump(f_header, f_ll_mm); + Dump(f_wrappers, f_ll_mm); + Wrapper_pretty_print(f_init, f_ll_mm); + + // Cleanup strings + Delete(file_h); + Delete(objcpp_h_code); + objcpp_h_code = NULL; + + // Cleanup files + Delete(f_header); + Delete(f_wrappers); + Delete(f_init); + Delete(f_runtime); + Close(f_ll_mm); + Delete(f_ll_mm); + Close(f_ll_h); + Delete(f_ll_h); + return SWIG_OK; + } + + virtual int nativeWrapper(Node *n) { + String *wrapname = Getattr(n, "wrap:name"); + + if (!addSymbol(wrapname, n)) + return SWIG_ERROR; + + if (Getattr(n, "type")) { + Swig_save("nativeWrapper", n, "name", NIL); + Setattr(n, "name", wrapname); + native_function_flag = true; + functionWrapper(n); + Swig_restore(n); + native_function_flag = false; + } else { + Printf(stderr, "%s : Line %d. No return type for %%native method %s.\n", input_file, line_number, Getattr(n, "wrap:name")); + } + + return SWIG_OK; + } + + virtual int functionWrapper(Node *n) { + String *symname = Getattr(n, "sym:name"); + SwigType *t = Getattr(n, "type"); + ParmList *l = Getattr(n, "parms"); + + String *objcpp_return_type = NewString(""); + String *tm; + Parm *p; + int i; + int num_arguments = 0; + int num_required = 0; + bool is_void_return; + + Wrapper *f = NewWrapper(); + String *wname = Swig_name_wrapper(symname); + + Swig_typemap_attach_parms("ObjCpptype", l, f); + + if ((tm = Swig_typemap_lookup("ObjCpptype", n, "", 0))) { + Printf(objcpp_return_type, "%s", tm); + } else { + // Display warning + } + + is_void_return = (Cmp(objcpp_return_type, "void") == 0); + if (!is_void_return) + Wrapper_add_localv(f, "objcresult", objcpp_return_type, "objcresult", NIL); + + Printv(f->def, objcpp_return_type, " ", wname, "(", NIL); + Printv(objcpp_h_code, objcpp_return_type, " ", wname, "(", NIL); + + // Emit all of the local variables for holding arguments. + emit_parameter_variables(l, f); + + // Attach the standard typemaps + emit_attach_parmmaps(l, f); + + // Parameter overloading + Setattr(n, "wrap:parms", l); + Setattr(n, "wrap:name", wname); + + // Get number of required and total arguments + num_arguments = emit_num_arguments(l); + num_required = emit_num_required(l); + int gencomma = 0; + + // Now walk the function parameter list and generate code to get arguments + for (i = 0, p = l; i < num_arguments; i++) { + + while (checkAttribute(p, "tmap:in:numinputs", "0")) { + p = Getattr(p, "tmap:in:next"); + } + + SwigType *pt = Getattr(p, "type"); + String *ln = Getattr(p, "lname"); + String *objcpp_param_type = NewString(""); + String *arg = NewString(""); + + Printf(arg, "objc%s", ln); + + // Get the ctype types of the parameter + if ((tm = Getattr(p, "tmap:ObjCpptype"))) { + Printv(objcpp_param_type, tm, NIL); + } else { + // Display warning + } + + // Add parameter to the objcpp function + Printv(f->def, gencomma ? ", " : "", objcpp_param_type, " ", arg, NIL); + Printv(objcpp_h_code, gencomma ? ", " : "", objcpp_param_type, " ", arg, NIL); + + gencomma = 1; + + // Get typemap for this argument + if ((tm = Getattr(p, "tmap:in"))) { + Replaceall(tm, "$source", arg); /* deprecated */ + Replaceall(tm, "$target", ln); /* deprecated */ + Replaceall(tm, "$arg", arg); /* deprecated? */ + Replaceall(tm, "$input", arg); + Setattr(p, "emit:input", arg); + Printf(f->code, "%s\n", tm); + p = Getattr(p, "tmap:in:next"); + } else { + Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); + p = nextSibling(p); + } + Delete(objcpp_param_type); + Delete(arg); + } + + // Now write code to make the function call + if (!native_function_flag) { + String *actioncode = emit_action(n); + + // Return value if necessary + if ((tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode))) { + Replaceall(tm, "$source", "result"); /* deprecated */ + Replaceall(tm, "$target", "objcresult"); /* deprecated */ + Replaceall(tm, "$result", "objcresult"); + if (GetFlag(n, "feature:new")) + Replaceall(tm, "$owner", "1"); + else + Replaceall(tm, "$owner", "0"); + Printf(f->code, "%s", tm); + if (Len(tm)) + Printf(f->code, "\n"); + } else { + Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); + } + emit_return_variable(n, t, f); + } + + Printf(objcpp_h_code, ");\n"); + Printf(f->def, ") {"); + + if (!is_void_return) + Printv(f->code, " return objcresult;\n", NIL); + Printf(f->code, "}\n"); + + // Dump the function out + Wrapper_print(f, f_wrappers); + + // Tidy up + Delete(objcpp_return_type); + Delete(wname); + DelWrapper(f); + + return SWIG_OK; + } }; /* ----------------------------------------------------------------------------- @@ -294,11 +286,11 @@ * ----------------------------------------------------------------------------- */ static Language *new_swig_objc() { - return new OBJC(); + return new OBJC(); } -extern "C" Language* swig_objc() { - return new_swig_objc(); +extern "C" Language *swig_objc() { + return new_swig_objc(); } /* ----------------------------------------------------------------------------- @@ -309,4 +301,4 @@ Objective-C Options (available with -objc)\n\ -noproxy - Generate the low-level functional interface instead\n\ of proxy classes\n\ -\n"; \ No newline at end of file +\n"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ash...@us...> - 2009-07-11 06:12:38
|
Revision: 11384 http://swig.svn.sourceforge.net/swig/?rev=11384&view=rev Author: ashishs99 Date: 2009-07-11 06:12:32 +0000 (Sat, 11 Jul 2009) Log Message: ----------- support for proxy code generation - first checkin. Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-11 06:11:41 UTC (rev 11383) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-11 06:12:32 UTC (rev 11384) @@ -1,28 +1,57 @@ /* * OBJC.cxx - * Module file for Objective C support + * Module file for Objective-C support */ #include "swigmod.h" +#include <ctype.h> + class OBJC:public Language { protected: static const char *usage; const String *empty_string; - File *f_ll_h; - File *f_ll_mm; + + File *f_ocpp_h; + File *f_ocpp_mm; File *f_runtime; File *f_header; File *f_wrappers; File *f_init; - String *objcpp_h_code; + File *f_proxy_h; + File *f_proxy_m; bool proxy_flag; // Flag for generating proxy classes bool native_function_flag; // Flag for when wrapping a native function + bool static_flag; // Flag for when wrapping a static functions or member variables + bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable + String *ocpp_h_code; // Code for Objective-C++ header + String *proxy_h_code; // Code for Objective-C proxy header + String *proxy_m_code; // Code for Objective-C proxy implementation + + String *proxy_class_name; // Name of the proxy class + String *variable_name; // Name of a variable being wrapped + String *proxy_class_decl; + String *proxy_class_def; + String *proxy_class_code; + public: OBJC():empty_string(NewString("")), - f_ll_h(NULL), f_ll_mm(NULL), f_runtime(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), native_function_flag(false), objcpp_h_code(NULL) { + f_ocpp_h(NULL), + f_ocpp_mm(NULL), + f_proxy_h(NULL), + f_proxy_m(NULL), + f_runtime(NULL), + f_header(NULL), + f_wrappers(NULL), + f_init(NULL), + native_function_flag(false), + static_flag(false), + variable_wrapper_flag(false), + proxy_flag(true), + proxy_class_name(NULL), variable_name(NULL), proxy_class_def(NULL), proxy_class_decl(NULL), proxy_class_code(NULL), + ocpp_h_code(NULL), proxy_h_code(NULL), proxy_m_code(NULL) { } virtual void main(int argc, char *argv[]) { SWIG_library_directory("objc"); @@ -43,31 +72,35 @@ // Add typemap definitions SWIG_typemap_lang("objc"); + + // Set config file SWIG_config_file("objc.swg"); allow_overloading(); } + + /* ----------------------------------------------------------------------------- + * emitBanner() + * ----------------------------------------------------------------------------- */ + + void emitBanner(File *f) { + Printf(f, "/* ----------------------------------------------------------------------------\n"); + Swig_banner_target_lang(f, " *"); + Printf(f, " * ----------------------------------------------------------------------------- */\n\n"); + } + + /* ----------------------------------------------------------------------------- + * top() + * ----------------------------------------------------------------------------- */ + virtual int top(Node *n) { - // Get the module name String *modulename = Getattr(n, "name"); - // Initialize all of the output files + String *file_h = NewStringf("%sWrapper.h", modulename); String *file_mm = NewStringf("%sWrapper.mm", modulename); - f_ll_mm = NewFile(file_mm, "w", SWIG_output_files()); - if (!f_ll_mm) { - FileErrorDisplay(f_ll_mm); - SWIG_exit(EXIT_FAILURE); - } - String *file_h = NewStringf("%sWrapper.h", modulename); - f_ll_h = NewFile(file_h, "w", SWIG_output_files()); - if (!f_ll_h) { - FileErrorDisplay(f_ll_h); - SWIG_exit(EXIT_FAILURE); - } - f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); @@ -79,57 +112,111 @@ Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); - // Initialize members - objcpp_h_code = NewString(""); - - // Generate low level accessors - Swig_banner(f_ll_h); - Printf(f_runtime, "\n"); Printf(f_runtime, "#define SWIGOBJC\n"); Printf(f_runtime, "\n"); Swig_name_register((char *) "wrapper", (char *) "ObjCPP_%f"); - Printf(f_ll_h, "\n#ifdef __cplusplus\n"); - Printf(f_ll_h, "extern \"C\" {\n"); - Printf(f_ll_h, "#endif\n\n"); - Printf(f_wrappers, "#include \"%s\"\n\n", file_h); Printf(f_wrappers, "extern \"C\" {\n"); + // Initialize members + ocpp_h_code = NewString(""); + proxy_h_code = NewString(""); + proxy_m_code = NewString(""); + // Emit code for children Language::top(n); - Printv(f_ll_h, objcpp_h_code, NIL); - Printf(f_ll_h, "\n#ifdef __cplusplus\n"); - Printf(f_ll_h, "}\n"); - Printf(f_ll_h, "#endif\n"); + // Generate low level accessors + { + Printf(f_wrappers, "}\n"); + f_ocpp_h = NewFile(file_h, "w", SWIG_output_files()); + if (!f_ocpp_h) { + FileErrorDisplay(f_ocpp_h); + SWIG_exit(EXIT_FAILURE); + } + f_ocpp_mm = NewFile(file_mm, "w", SWIG_output_files()); + if (!f_ocpp_mm) { + FileErrorDisplay(f_ocpp_mm); + SWIG_exit(EXIT_FAILURE); + } - Printf(f_wrappers, "}\n"); + Swig_banner(f_ocpp_h); + Printf(f_ocpp_h, "\n#ifdef __cplusplus\n"); + Printf(f_ocpp_h, "extern \"C\" {\n"); + Printf(f_ocpp_h, "#endif\n\n"); + Printv(f_ocpp_h, ocpp_h_code, NIL); + Printf(f_ocpp_h, "\n#ifdef __cplusplus\n"); + Printf(f_ocpp_h, "}\n"); + Printf(f_ocpp_h, "#endif\n"); - // Write all to the files - Dump(f_header, f_ll_mm); - Dump(f_wrappers, f_ll_mm); - Wrapper_pretty_print(f_init, f_ll_mm); + Dump(f_header, f_ocpp_mm); + Dump(f_wrappers, f_ocpp_mm); + Wrapper_pretty_print(f_init, f_ocpp_mm); - // Cleanup strings - Delete(file_h); - Delete(objcpp_h_code); - objcpp_h_code = NULL; + Delete(file_h); + file_h = NULL; + Delete(file_mm); + file_mm = NULL; + Delete(ocpp_h_code); + ocpp_h_code = NULL; - // Cleanup files - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Delete(f_runtime); - Close(f_ll_mm); - Delete(f_ll_mm); - Close(f_ll_h); - Delete(f_ll_h); + Delete(f_header); + Delete(f_wrappers); + Delete(f_init); + Delete(f_runtime); + Close(f_ocpp_mm); + Delete(f_ocpp_mm); + Close(f_ocpp_h); + Delete(f_ocpp_h); + } + + // Generate proxy code + if (proxy_flag) { + String *file_proxy_h = NewStringf("%sProxy.h", modulename); + f_proxy_h = NewFile(file_proxy_h, "w", SWIG_output_files()); + if (!f_proxy_h) { + FileErrorDisplay(f_proxy_h); + SWIG_exit(EXIT_FAILURE); + } + + String *file_proxy_m = NewStringf("%sProxy.m", modulename); + f_proxy_m = NewFile(file_proxy_m, "w", SWIG_output_files()); + if (!f_proxy_m) { + FileErrorDisplay(f_proxy_m); + SWIG_exit(EXIT_FAILURE); + } + + emitBanner(f_proxy_h); + Printf(f_proxy_m, "#include \"%s\"\n\n", file_h); + Printf(f_proxy_m, "#include \"%s\"\n\n", file_proxy_h); + Printv(f_proxy_h, proxy_h_code, NIL); + Printv(f_proxy_m, proxy_m_code, NIL); + + Delete(file_proxy_h); + file_proxy_h = NULL; + Delete(file_proxy_m); + file_proxy_m = NULL; + + Delete(proxy_h_code); + proxy_h_code = NULL; + Delete(proxy_h_code); + proxy_h_code = NULL; + Close(f_proxy_m); + Delete(f_proxy_m); + Close(f_proxy_h); + Delete(f_proxy_h); + } + return SWIG_OK; } + /* ----------------------------------------------------------------------------- + * nativeWrapper() + * ----------------------------------------------------------------------------- */ + virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); @@ -150,36 +237,241 @@ return SWIG_OK; } + /* ----------------------------------------------------------------------------- + * makeParameterName() + * + * Inputs: + * n - Node + * p - parameter node + * arg_num - parameter argument number + * setter - set this flag when wrapping variables + * Return: + * arg - a unique parameter name + * ----------------------------------------------------------------------------- */ + + String *makeParameterName(Node *n, Parm *p, int arg_num) { + + String *arg = 0; + String *pn = Getattr(p, "name"); + + // Use C parameter name unless it is a duplicate or an empty parameter name + int count = 0; + ParmList *plist = Getattr(n, "parms"); + while (plist) { + if ((Cmp(pn, Getattr(plist, "name")) == 0)) + count++; + plist = nextSibling(plist); + } + String *wrn = pn ? Swig_name_warning(p, 0, pn, 0) : 0; + arg = (!pn || (count > 1) || wrn) ? NewStringf("arg%d", arg_num) : Copy(pn); + + return arg; + } + + /* ----------------------------------------------------------------------------- + * proxyFunctionHandler() + * + * Function called for creating an Objective-C proxy function around a c++ function + * Used for static and non-static C++ class function and C global functions. + * C++ class static functions map to Objective-C "+" functions. + * C++ class non-static functions map to Objective-C "-" functions. + * C global functions are mapped to Objective-C global functions. + * ----------------------------------------------------------------------------- */ + + void proxyFunctionHandler(Node *n) { + SwigType *t = Getattr(n, "type"); + ParmList *l = Getattr(n, "parms"); + String *proxy_function_name = Getattr(n, "proxyfuncname"); + String *tm; + Parm *p; + Parm *last_parm = 0; + int i; + String *imcall = NewString(""); + String *return_type = NewString(""); + String *function_def = NewString(""); + String *function_decl = NewString(""); + + bool setter_flag = false; + + if (!proxy_flag) + return; + + // Wrappers not wanted for some methods where the parameters cannot be overloaded in Objective-C + if (Getattr(n, "overload:ignore")) + return; + + if (l) { + if (SwigType_type(Getattr(l, "type")) == T_VOID) { + l = nextSibling(l); + } + } + + /* Attach the non-standard typemaps to the parameter list */ + Swig_typemap_attach_parms("in", l, NULL); + Swig_typemap_attach_parms("objctype", l, NULL); + Swig_typemap_attach_parms("objcin", l, NULL); + + /* Get return types */ + if ((tm = Swig_typemap_lookup("objctype", n, "", 0))) { + String *objctypeout = Getattr(n, "tmap:objctype:out"); // the type in the objctype typemap's out attribute overrides the type in the typemap + if (objctypeout) + tm = objctypeout; + Printf(return_type, "%s", tm); + } else { + Swig_warning(WARN_NONE, input_file, line_number, "No objctype typemap defined for %s\n", SwigType_str(t, 0)); + } + + /* Start generating the proxy function */ + const String *outattributes = Getattr(n, "tmap:objctype:outattributes"); + if (outattributes) + Printf(function_decl, " %s\n", outattributes); + const String *objcattributes = Getattr(n, "feature:objc:attributes"); + if (objcattributes) + Printf(function_decl, " %s\n", objcattributes); + + if (static_flag) { + Printf(function_decl, "+ "); + } + + Printf(function_decl, "(%s) %s:", return_type, proxy_function_name); + + Printv(imcall, "$imfuncname(", NIL); + + if (!static_flag) + Printf(imcall, "swigCPtr"); + + emit_mark_varargs(l); + + int gencomma = !static_flag; + + /* Output each parameter, this essentially completes the function name for objective-c function */ + for (i = 0, p = l; p; i++) { + /* Ignored varargs */ + if (checkAttribute(p, "varargs:ignore", "1")) { + p = nextSibling(p); + continue; + } + + /* Ignored parameters */ + if (checkAttribute(p, "tmap:in:numinputs", "0")) { + p = Getattr(p, "tmap:in:next"); + continue; + } + + /* Ignore the 'this' argument for variable wrappers */ + if (!(variable_wrapper_flag && i == 0)) { + SwigType *pt = Getattr(p, "type"); + String *param_type = NewString(""); + if (setter_flag) + last_parm = p; + + /* Get the Objective-C parameter type */ + if ((tm = Getattr(p, "tmap:objctype"))) { + const String *inattributes = Getattr(p, "tmap:objctype:inattributes"); + Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); + } else { + Swig_warning(WARN_NONE, input_file, line_number, "No objctype typemap defined for %s\n", SwigType_str(pt, 0)); + } + + String *arg = makeParameterName(n, p, i); + + if (gencomma) { + Printf(imcall, ", "); + } + // Use typemaps to transform type used in Objective-C proxy function to type used in low level ocpp accessor + if ((tm = Getattr(p, "tmap:objcin"))) { + Replaceall(tm, "$objcinput", arg); + Printv(imcall, tm, NIL); + } else { + Swig_warning(WARN_NONE, input_file, line_number, "No objcin typemap defined for %s\n", SwigType_str(pt, 0)); + } + + /* Add parameter to proxy function */ + if (i == 0) + Printf(function_decl, ":"); + else + Printf(function_decl, "%s: ", arg); + + Printf(function_decl, "(%s)%s", param_type, arg); + + Delete(arg); + Delete(param_type); + } + p = Getattr(p, "tmap:in:next"); + } + + Printf(imcall, ")"); + Printv(function_def, function_decl, "{", NIL); + Printf(function_decl, ";"); + + // Transform return type used in low level accessor to type used in Objective-C proxy function + if ((tm = Swig_typemap_lookup("objcout", n, "", 0))) { + if (GetFlag(n, "feature:new")) + Replaceall(tm, "$owner", "true"); + else + Replaceall(tm, "$owner", "false"); + Replaceall(tm, "$imcall", imcall); + } else { + Swig_warning(WARN_NONE, input_file, line_number, "No objcout typemap defined for %s\n", SwigType_str(t, 0)); + } + + Printf(function_def, " %s\n\n", tm ? (const String *) tm : empty_string); + Printv(proxy_h_code, function_decl, NIL); + Printv(proxy_m_code, function_def, NIL); + + Delete(function_decl); + Delete(function_def); + Delete(return_type); + Delete(imcall); + } + + + /* ----------------------------------------------------------------------------- + * functionWrapper() + * ----------------------------------------------------------------------------- */ + virtual int functionWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); - String *objcpp_return_type = NewString(""); + String *cleanup = NewString(""); + String *outarg = NewString(""); + String *ocpp_return_type = NewString(""); String *tm; Parm *p; int i; int num_arguments = 0; int num_required = 0; bool is_void_return; + String *overloaded_name = getOverloadedName(n); + if (!Getattr(n, "sym:overloaded")) { + if (!addSymbol(Getattr(n, "sym:name"), n)) + return SWIG_ERROR; + } + Wrapper *f = NewWrapper(); - String *wname = Swig_name_wrapper(symname); + String *wname = Swig_name_wrapper(overloaded_name); - Swig_typemap_attach_parms("ObjCpptype", l, f); + Swig_typemap_attach_parms("ocpptype", l, f); - if ((tm = Swig_typemap_lookup("ObjCpptype", n, "", 0))) { - Printf(objcpp_return_type, "%s", tm); + /* Get return types */ + if ((tm = Swig_typemap_lookup("ocpptype", n, "", 0))) { + String *ocpptypeout = Getattr(n, "tmap:ocpptype:out"); // the type in the ocpptype typemap's out attribute overrides the type in the typemap + if (ocpptypeout) + tm = ocpptypeout; + Printf(ocpp_return_type, "%s", tm); } else { - // Display warning + Swig_warning(WARN_NONE, input_file, line_number, "No ocpptype typemap defined for %s\n", SwigType_str(t, 0)); } - is_void_return = (Cmp(objcpp_return_type, "void") == 0); + is_void_return = (Cmp(ocpp_return_type, "void") == 0); if (!is_void_return) - Wrapper_add_localv(f, "objcresult", objcpp_return_type, "objcresult", NIL); + Wrapper_add_localv(f, "oresult", ocpp_return_type, "oresult", NIL); - Printv(f->def, objcpp_return_type, " ", wname, "(", NIL); - Printv(objcpp_h_code, objcpp_return_type, " ", wname, "(", NIL); + Printv(f->def, ocpp_return_type, " ", wname, "(", NIL); + Printv(ocpp_h_code, ocpp_return_type, " ", wname, "(", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); @@ -191,6 +483,13 @@ Setattr(n, "wrap:parms", l); Setattr(n, "wrap:name", wname); + // Wrappers not wanted for some methods where the parameters cannot be overloaded in Objective-C + if (Getattr(n, "sym:overloaded")) { + // Emit warnings for the few cases that can't be overloaded in Objective-C and give up on generating wrapper + Swig_overload_check(n); + if (Getattr(n, "overload:ignore")) + return SWIG_OK; + } // Get number of required and total arguments num_arguments = emit_num_arguments(l); num_required = emit_num_required(l); @@ -205,21 +504,21 @@ SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); - String *objcpp_param_type = NewString(""); + String *ocpp_param_type = NewString(""); String *arg = NewString(""); - Printf(arg, "objc%s", ln); + Printf(arg, "o%s", ln); - // Get the ctype types of the parameter - if ((tm = Getattr(p, "tmap:ObjCpptype"))) { - Printv(objcpp_param_type, tm, NIL); + if ((tm = Getattr(p, "tmap:ocpptype"))) { + const String *inattributes = Getattr(p, "tmap:ocpptype:inattributes"); + Printf(ocpp_param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { - // Display warning + Swig_warning(WARN_NONE, input_file, line_number, "No ocpptype typemap defined for %s\n", SwigType_str(pt, 0)); } // Add parameter to the objcpp function - Printv(f->def, gencomma ? ", " : "", objcpp_param_type, " ", arg, NIL); - Printv(objcpp_h_code, gencomma ? ", " : "", objcpp_param_type, " ", arg, NIL); + Printv(f->def, gencomma ? ", " : "", ocpp_param_type, " ", arg, NIL); + Printv(ocpp_h_code, gencomma ? ", " : "", ocpp_param_type, " ", arg, NIL); gencomma = 1; @@ -236,19 +535,60 @@ Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } - Delete(objcpp_param_type); + Delete(ocpp_param_type); Delete(arg); } - // Now write code to make the function call + /* Insert constraint checking code */ + for (p = l; p;) { + if ((tm = Getattr(p, "tmap:check"))) { + Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ + Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ + Replaceall(tm, "$input", Getattr(p, "emit:input")); + Printv(f->code, tm, "\n", NIL); + p = Getattr(p, "tmap:check:next"); + } else { + p = nextSibling(p); + } + } + + /* Insert cleanup code */ + for (p = l; p;) { + if ((tm = Getattr(p, "tmap:freearg"))) { + Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ + Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ + Replaceall(tm, "$input", Getattr(p, "emit:input")); + Printv(cleanup, tm, "\n", NIL); + p = Getattr(p, "tmap:freearg:next"); + } else { + p = nextSibling(p); + } + } + + /* Insert argument output code */ + for (p = l; p;) { + if ((tm = Getattr(p, "tmap:argout"))) { + Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ + Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ + Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ + Replaceall(tm, "$result", "jresult"); + Replaceall(tm, "$input", Getattr(p, "emit:input")); + Printv(outarg, tm, "\n", NIL); + p = Getattr(p, "tmap:argout:next"); + } else { + p = nextSibling(p); + } + } + + // Now write code to make the low level function call if (!native_function_flag) { String *actioncode = emit_action(n); // Return value if necessary if ((tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode))) { Replaceall(tm, "$source", "result"); /* deprecated */ - Replaceall(tm, "$target", "objcresult"); /* deprecated */ - Replaceall(tm, "$result", "objcresult"); + Replaceall(tm, "$target", "oresult"); /* deprecated */ + Replaceall(tm, "$result", "oresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else @@ -262,23 +602,116 @@ emit_return_variable(n, t, f); } - Printf(objcpp_h_code, ");\n"); + /* Output argument output code */ + Printv(f->code, outarg, NIL); + + /* Output cleanup code */ + Printv(f->code, cleanup, NIL); + + /* Look to see if there is any newfree cleanup code */ + if (GetFlag(n, "feature:new")) { + if ((tm = Swig_typemap_lookup("newfree", n, "result", 0))) { + Replaceall(tm, "$source", "result"); /* deprecated */ + Printf(f->code, "%s\n", tm); + } + } + + /* See if there is any return cleanup code */ + if (!native_function_flag) { + if ((tm = Swig_typemap_lookup("ret", n, "result", 0))) { + Replaceall(tm, "$source", "result"); /* deprecated */ + Printf(f->code, "%s\n", tm); + } + } + // Finish the ocpp header code and wrapper function definition + Printf(ocpp_h_code, ");\n"); Printf(f->def, ") {"); if (!is_void_return) - Printv(f->code, " return objcresult;\n", NIL); + Printv(f->code, " return oresult;\n", NIL); + Printf(f->code, "}\n"); + /* Substitute the cleanup code */ + Replaceall(f->code, "$cleanup", cleanup); + + /* Substitute the function name */ + Replaceall(f->code, "$symname", symname); + // Dump the function out - Wrapper_print(f, f_wrappers); - + if (!native_function_flag) { + Wrapper_print(f, f_wrappers); + } // Tidy up - Delete(objcpp_return_type); + Delete(ocpp_return_type); Delete(wname); DelWrapper(f); return SWIG_OK; } + + /* ----------------------------------------------------------------------------- + * getOverloadedName() + * ----------------------------------------------------------------------------- */ + + String *getOverloadedName(Node *n) { + + /* A Objective-C HandleRef is used for all classes in the SWIG intermediary class. + * The intermediary class methods are thus mangled when overloaded to give + * a unique name. */ + String *overloaded_name = NewStringf("%s", Getattr(n, "sym:name")); + + if (Getattr(n, "sym:overloaded")) { + Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); + } + + return overloaded_name; + } + + + /* ----------------------------------------------------------------------------- + * emitProxyClassDeclaration() + * ----------------------------------------------------------------------------- */ + + void emitProxyClassDeclaration(Node *n) { + } + + /* ----------------------------------------------------------------------------- + * emitProxyClassDefinition() + * ----------------------------------------------------------------------------- */ + + void emitProxyClassDefinition(Node *n) { + } + + + /* ----------------------------------------------------------------------------- + * classHandler() + * ----------------------------------------------------------------------------- */ + + virtual int classHandler(Node *n) { + if (proxy_flag) { + proxy_class_name = NewString(Getattr(n, "sym:name")); + if (!addSymbol(proxy_class_name, n)) + return SWIG_ERROR; + } + + Language::classHandler(n); + + if (proxy_flag) { + emitProxyClassDeclaration(n); + Printv(f_proxy_h, proxy_class_decl, proxy_class_code, NIL); + + emitProxyClassDefinition(n); + Printv(f_proxy_m, proxy_class_def, proxy_class_code, NIL); + + Delete(proxy_class_name); + proxy_class_name = NULL; + } + + return SWIG_OK; + } + + }; /* ----------------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ash...@us...> - 2009-07-16 04:26:26
|
Revision: 11403 http://swig.svn.sourceforge.net/swig/?rev=11403&view=rev Author: ashishs99 Date: 2009-07-16 04:26:11 +0000 (Thu, 16 Jul 2009) Log Message: ----------- Minor fixes Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-15 21:03:04 UTC (rev 11402) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-16 04:26:11 UTC (rev 11403) @@ -12,6 +12,7 @@ static const char *usage; const String *empty_string; + Hash *swig_types_hash; File *f_ocpp_h; File *f_ocpp_mm; File *f_runtime; @@ -37,6 +38,7 @@ public: OBJC():empty_string(NewString("")), + swig_types_hash(NULL), f_ocpp_h(NULL), f_ocpp_mm(NULL), f_proxy_h(NULL), @@ -125,6 +127,7 @@ proxy_m_code = NewString(""); proxy_class_decl = NewString(""); proxy_class_def = NewString(""); + swig_types_hash = NewHash(); // Emit code for children Language::top(n); @@ -200,6 +203,8 @@ Delete(ocpp_h_code); ocpp_h_code = NULL; + Delete(swig_types_hash); + swig_types_hash = NULL; Delete(f_header); Delete(f_wrappers); Delete(f_init); @@ -238,6 +243,108 @@ } /* ----------------------------------------------------------------------------- + * getEnumName() + * ----------------------------------------------------------------------------- */ + + String *getEnumName(SwigType *t) { + Node *enum_name = NULL; + Node *n = enumLookup(t); + if (n) { + String *symname = Getattr(n, "sym:name"); + if (symname) { + // Add in class scope when referencing enum if not a global enum + String *scopename_prefix = Swig_scopename_prefix(Getattr(n, "name")); + String *proxyname = 0; + if (scopename_prefix) { + proxyname = getProxyName(scopename_prefix); + } + if (proxyname) + enum_name = NewStringf("%s.%s", proxyname, symname); + else + enum_name = NewStringf("%s", symname); + Delete(scopename_prefix); + } + } + + return enum_name; + } + + + /* ----------------------------------------------------------------------------- + * substituteClassname() + * + * Substitute $objcclassname with the proxy class name for classes/structs/unions that SWIG knows about. + * Also substitutes enums with enum name. + * Otherwise use the $descriptor name for the C# class name. Note that the $&objcclassname substitution + * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. + * Inputs: + * pt - parameter type + * tm - cstype typemap + * Outputs: + * tm - cstype typemap with $objcclassname substitution + * Return: + * substitution_performed - flag indicating if a substitution was performed + * ----------------------------------------------------------------------------- */ + + bool substituteClassname(SwigType *pt, String *tm) { + bool substitution_performed = false; + SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); + SwigType *strippedtype = SwigType_strip_qualifiers(type); + + if (Strstr(tm, "$objcclassname")) { + SwigType *classnametype = Copy(strippedtype); + substituteClassnameSpecialVariable(classnametype, tm, "$objcclassname"); + substitution_performed = true; + Delete(classnametype); + } + if (Strstr(tm, "$*objcclassname")) { + SwigType *classnametype = Copy(strippedtype); + Delete(SwigType_pop(classnametype)); + substituteClassnameSpecialVariable(classnametype, tm, "$*objcclassname"); + substitution_performed = true; + Delete(classnametype); + } + if (Strstr(tm, "$&objcclassname")) { + SwigType *classnametype = Copy(strippedtype); + SwigType_add_pointer(classnametype); + substituteClassnameSpecialVariable(classnametype, tm, "$&objcclassname"); + substitution_performed = true; + Delete(classnametype); + } + + Delete(strippedtype); + Delete(type); + + return substitution_performed; + } + + /* ----------------------------------------------------------------------------- + * substituteClassnameSpecialVariable() + * ----------------------------------------------------------------------------- */ + + void substituteClassnameSpecialVariable(SwigType *classnametype, String *tm, const char *classnamespecialvariable) { + if (SwigType_isenum(classnametype)) { + String *enumname = getEnumName(classnametype); + if (enumname) + Replaceall(tm, classnamespecialvariable, enumname); + else + Replaceall(tm, classnamespecialvariable, NewStringf("int")); + } else { + String *classname = getProxyName(classnametype); + if (classname) { + Replaceall(tm, classnamespecialvariable, classname); // getProxyName() works for pointers to classes too + } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. + String *descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); + Replaceall(tm, classnamespecialvariable, descriptor); + + // Add to hash table so that the type wrapper classes can be created later + Setattr(swig_types_hash, descriptor, classnametype); + Delete(descriptor); + } + } + } + + /* ----------------------------------------------------------------------------- * makeParameterName() * * Inputs: @@ -268,17 +375,170 @@ return arg; } + /* ----------------------------------------------------------------------------- - * proxyFunctionHandler() + * proxyGlobalFunctionHandler() * + * C global functions are mapped to Objective-C global functions. + * ----------------------------------------------------------------------------- */ + + void proxyGlobalFunctionHandler(Node *n) { + SwigType *t = Getattr(n, "type"); + ParmList *l = Getattr(n, "parms"); + String *ocpp_function_name = Getattr(n, "ocppfuncname"); + String *proxy_function_name = Getattr(n, "proxyfuncname"); + String *tm; + Parm *p; + Parm *last_parm = 0; + int i; + String *imcall = NewString(""); + String *return_type = NewString(""); + String *function_def = NewString(""); + String *function_decl = NewString(""); + + bool setter_flag = false; + + if (!proxy_flag) + return; + + // Wrappers not wanted for some methods where the parameters cannot be overloaded in Objective-C + if (Getattr(n, "overload:ignore")) + return; + + if (l) { + if (SwigType_type(Getattr(l, "type")) == T_VOID) { + l = nextSibling(l); + } + } + + /* Attach the non-standard typemaps to the parameter list */ + Swig_typemap_attach_parms("in", l, NULL); + Swig_typemap_attach_parms("objctype", l, NULL); + Swig_typemap_attach_parms("objcin", l, NULL); + + /* Get return types */ + if ((tm = Swig_typemap_lookup("objctype", n, "", 0))) { + String *objctypeout = Getattr(n, "tmap:objctype:out"); // the type in the objctype typemap's out attribute overrides the type in the typemap + if (objctypeout) + tm = objctypeout; + substituteClassname(t, tm); + Printf(return_type, "%s", tm); + } else { + Swig_warning(WARN_NONE, input_file, line_number, "No objctype typemap defined for %s\n", SwigType_str(t, 0)); + } + + /* Start generating the proxy function */ + const String *outattributes = Getattr(n, "tmap:objctype:outattributes"); + if (outattributes) + Printf(function_decl, " %s\n", outattributes); + const String *objcattributes = Getattr(n, "feature:objc:attributes"); + if (objcattributes) + Printf(function_decl, " %s\n", objcattributes); + + if (static_flag) + Printf(function_decl, "static "); + + Printf(function_decl, "%s %s(", return_type, proxy_function_name); + + Printv(imcall, "$ocppfuncname(", NIL); + + emit_mark_varargs(l); + + int gencomma = !static_flag; + + /* Output each parameter */ + for (i = 0, p = l; p; i++) { + + /* Ignored varargs */ + if (checkAttribute(p, "varargs:ignore", "1")) { + p = nextSibling(p); + continue; + } + + /* Ignored parameters */ + if (checkAttribute(p, "tmap:in:numinputs", "0")) { + p = Getattr(p, "tmap:in:next"); + continue; + } + + /* Ignore the 'this' argument for variable wrappers */ + if (!(variable_wrapper_flag && i == 0)) { + SwigType *pt = Getattr(p, "type"); + String *param_type = NewString(""); + if (setter_flag) + last_parm = p; + + /* Get the Objective-C parameter type */ + if ((tm = Getattr(p, "tmap:objctype"))) { + substituteClassname(t, tm); + const String *inattributes = Getattr(p, "tmap:objctype:inattributes"); + Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); + } else { + Swig_warning(WARN_NONE, input_file, line_number, "No objctype typemap defined for %s\n", SwigType_str(pt, 0)); + } + + String *arg = makeParameterName(n, p, i); + + // Use typemaps to transform type used in Objective-C proxy function to the one used in intermediate code. + if ((tm = Getattr(p, "tmap:objcin"))) { + substituteClassname(pt, tm); + Replaceall(tm, "$objcinput", arg); + Printv(imcall, tm, NIL); + } else { + Swig_warning(WARN_NONE, input_file, line_number, "No objcin typemap defined for %s\n", SwigType_str(pt, 0)); + } + + /* Add parameter to proxy function */ + if (gencomma >= 2) + Printf(function_decl, ", "); + gencomma = 2; + Printf(function_decl, "%s %s", param_type, arg); + + Delete(arg); + Delete(param_type); + } + p = Getattr(p, "tmap:in:next"); + } + + Printf(imcall, ")"); + Printf(function_decl, ")"); + Printv(function_def, function_decl, NIL); + Printf(function_decl, ";\n"); + + // Transform return type used in low level accessor to type used in Objective-C proxy function + if ((tm = Swig_typemap_lookup("objcout", n, "", 0))) { + if (GetFlag(n, "feature:new")) + Replaceall(tm, "$owner", "true"); + else + Replaceall(tm, "$owner", "false"); + substituteClassname(t, tm); + Replaceall(imcall, "$ocppfuncname", ocpp_function_name); + Replaceall(tm, "$imcall", imcall); + } else { + Swig_warning(WARN_NONE, input_file, line_number, "No objcout typemap defined for %s\n", SwigType_str(t, 0)); + } + + Printf(function_def, " %s\n\n", tm ? (const String *) tm : empty_string); + Printv(proxy_h_code, function_decl, NIL); + Printv(proxy_m_code, function_def, NIL); + + Delete(function_decl); + Delete(function_def); + Delete(return_type); + Delete(imcall); + } + + + /* ----------------------------------------------------------------------------- + * proxyClassFunctionHandler() + * * Function called for creating an Objective-C proxy function around a c++ function * Used for static and non-static C++ class function and C global functions. * C++ class static functions map to Objective-C "+" functions. * C++ class non-static functions map to Objective-C "-" functions. - * C global functions are mapped to Objective-C global functions. * ----------------------------------------------------------------------------- */ - void proxyFunctionHandler(Node *n) { + void proxyClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *ocpp_function_name = Getattr(n, "ocppfuncname"); @@ -335,7 +595,7 @@ else Printf(function_decl, "- "); - Printf(function_decl, "(%s) %s", return_type, proxy_function_name); + Printf(function_decl, "(%s)%s", return_type, proxy_function_name); Printv(imcall, "$ocppfuncname(", NIL); @@ -369,6 +629,7 @@ /* Get the Objective-C parameter type */ if ((tm = Getattr(p, "tmap:objctype"))) { + substituteClassname(pt, tm); const String *inattributes = Getattr(p, "tmap:objctype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { @@ -382,6 +643,7 @@ } // Use typemaps to transform type used in Objective-C proxy function to type used in low level ocpp accessor if ((tm = Getattr(p, "tmap:objcin"))) { + substituteClassname(pt, tm); Replaceall(tm, "$objcinput", arg); Printv(imcall, tm, NIL); } else { @@ -392,9 +654,9 @@ if (i == 0) Printf(function_decl, ":"); else - Printf(function_decl, "%s: ", arg); + Printf(function_decl, " %s: ", arg); - Printf(function_decl, "(%s)%s", param_type, arg); + Printf(function_decl, " (%s)%s", param_type, arg); Delete(arg); Delete(param_type); @@ -412,6 +674,7 @@ Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); + substituteClassname(t, tm); Replaceall(imcall, "$ocppfuncname", ocpp_function_name); Replaceall(tm, "$imcall", imcall); } else { @@ -679,7 +942,7 @@ String *wname = Swig_name_wrapper(overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "ocppfuncname", wname); - proxyFunctionHandler(n); + proxyClassFunctionHandler(n); Delete(overloaded_name); } return SWIG_OK; @@ -699,7 +962,7 @@ String *wname = Swig_name_wrapper(overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "ocppfuncname", wname); - proxyFunctionHandler(n); + proxyClassFunctionHandler(n); Delete(overloaded_name); } static_flag = false; @@ -718,7 +981,7 @@ String *wname = Swig_name_wrapper(overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "ocppfuncname", wname); - proxyFunctionHandler(n); + proxyGlobalFunctionHandler(n); Delete(overloaded_name); } return SWIG_OK; @@ -884,8 +1147,8 @@ Language::classHandler(n); if (proxy_flag) { - Printv(proxy_h_code, "\n@end", NIL); - Printv(proxy_m_code, "\n@end", NIL); + Printv(proxy_h_code, "@end\n\n", NIL); + Printv(proxy_m_code, "@end\n\n", NIL); Delete(proxy_class_name); proxy_class_name = NULL; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ash...@us...> - 2009-07-21 02:07:02
|
Revision: 11429 http://swig.svn.sourceforge.net/swig/?rev=11429&view=rev Author: ashishs99 Date: 2009-07-21 02:06:54 +0000 (Tue, 21 Jul 2009) Log Message: ----------- support for generating setters/getters for member variables and global variables. Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-21 01:02:57 UTC (rev 11428) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-21 02:06:54 UTC (rev 11429) @@ -24,8 +24,11 @@ bool proxy_flag; // Flag for generating proxy classes bool native_function_flag; // Flag for when wrapping a native function + bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable + bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const + bool global_variable_flag; // Flag for when wrapping a global variable String *ocpp_h_code; // Code for Objective-C++ header String *proxy_h_code; // Code for Objective-C proxy header @@ -48,8 +51,11 @@ f_wrappers(NULL), f_init(NULL), native_function_flag(false), + enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), + wrapping_member_flag(false), + global_variable_flag(false), proxy_flag(true), proxy_class_name(NULL), variable_name(NULL), proxy_class_def(NULL), proxy_class_decl(NULL), ocpp_h_code(NULL), proxy_h_code(NULL), proxy_m_code(NULL) { } virtual void main(int argc, char *argv[]) { @@ -356,11 +362,12 @@ * n - Node * p - parameter node * arg_num - parameter argument number + * setter - set this flag when wrapping variables * Return: * arg - a unique parameter name * ----------------------------------------------------------------------------- */ - String *makeParameterName(Node *n, Parm *p, int arg_num) { + String *makeParameterName(Node *n, Parm *p, int arg_num, bool setter) { String *arg = 0; String *pn = Getattr(p, "name"); @@ -376,6 +383,13 @@ String *wrn = pn ? Swig_name_warning(p, 0, pn, 0) : 0; arg = (!pn || (count > 1) || wrn) ? NewStringf("arg%d", arg_num) : Copy(pn); + if (setter && Cmp(arg, "self") != 0) { + // Note that for setters the parameter name is always set but sometimes includes C++ + // scope resolution, so we need to strip off the scope resolution to make a valid name. + Delete(arg); + arg = NewString("value"); //Swig_scopename_last(pn); + } + return arg; } @@ -390,7 +404,7 @@ SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *ocpp_function_name = Getattr(n, "ocppfuncname"); - String *proxy_function_name = Getattr(n, "proxyfuncname"); + String *func_name = NULL; String *tm; Parm *p; Parm *last_parm = 0; @@ -431,6 +445,21 @@ Swig_warning(WARN_NONE, input_file, line_number, "No objctype typemap defined for %s\n", SwigType_str(t, 0)); } + /* Change function name for global variables */ + if (proxy_flag && global_variable_flag) { + // Capitalize the first letter in the variable to create a objcBean type getter/setter function name + func_name = NewString(""); + setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(variable_name)) == 0); + if (setter_flag) + Printf(func_name, "set"); + else + Printf(func_name, "get"); + Putc(toupper((int) *Char(variable_name)), func_name); + Printf(func_name, "%s", Char(variable_name) + 1); + } else { + func_name = Copy(Getattr(n, "sym:name")); + } + /* Start generating the proxy function */ const String *outattributes = Getattr(n, "tmap:objctype:outattributes"); if (outattributes) @@ -442,7 +471,7 @@ if (static_flag) Printf(function_decl, "static "); - Printf(function_decl, "%s %s(", return_type, proxy_function_name); + Printf(function_decl, "%s %s(", return_type, func_name); Printv(imcall, "$ocppfuncname(", NIL); @@ -481,7 +510,7 @@ Swig_warning(WARN_NONE, input_file, line_number, "No objctype typemap defined for %s\n", SwigType_str(pt, 0)); } - String *arg = makeParameterName(n, p, i); + String *arg = makeParameterName(n, p, i, true); // Use typemaps to transform type used in Objective-C proxy function to the one used in intermediate code. if ((tm = Getattr(p, "tmap:objcin"))) { @@ -586,6 +615,11 @@ Swig_warning(WARN_NONE, input_file, line_number, "No objctype typemap defined for %s\n", SwigType_str(t, 0)); } + if (wrapping_member_flag && !enum_constant_flag) { + // For wrapping member variables + setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(Swig_name_member(proxy_class_name, variable_name))) == 0); + } + /* Start generating the proxy function */ const String *outattributes = Getattr(n, "tmap:objctype:outattributes"); if (outattributes) @@ -640,7 +674,7 @@ Swig_warning(WARN_NONE, input_file, line_number, "No objctype typemap defined for %s\n", SwigType_str(pt, 0)); } - String *arg = makeParameterName(n, p, i); + String *arg = makeParameterName(n, p, i, setter_flag); if (gencomma) { Printf(imcall, ", "); @@ -902,24 +936,97 @@ Printf(f->code, "}\n"); - /* Substitute the cleanup code */ + // Substitute the cleanup code Replaceall(f->code, "$cleanup", cleanup); - /* Substitute the function name */ + // Substitute the function name Replaceall(f->code, "$symname", symname); // Dump the function out if (!native_function_flag) { Wrapper_print(f, f_wrappers); } + + if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { + Setattr(n, "ocppfuncname", wname); + proxyGlobalFunctionHandler(n); + } + + /* + * Generate the proxy class getters/setters for public member variables. + * Not for enums and constants. + */ + if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { + // Capitalize the first letter in the variable to create getter/setter function name + bool getter_flag = Cmp(symname, Swig_name_set(Swig_name_member(proxy_class_name, variable_name))) != 0; + + String *getter_setter_name = NewString(""); + if (!getter_flag) + Printf(getter_setter_name, "set"); + else + Printf(getter_setter_name, "get"); + Putc(toupper((int) *Char(variable_name)), getter_setter_name); + Printf(getter_setter_name, "%s", Char(variable_name) + 1); + + String *ocppfunctname = NewStringf("ObjCPP_%s", symname); + + Setattr(n, "proxyfuncname", getter_setter_name); + Setattr(n, "ocppfuncname", ocppfunctname); + + proxyClassFunctionHandler(n); + Delete(getter_setter_name); + Delete(ocppfunctname); + } // Tidy up Delete(ocpp_return_type); Delete(wname); + Delete(overloaded_name); DelWrapper(f); return SWIG_OK; } + /* ---------------------------------------------------------------------- + * membervariableHandler() + * ---------------------------------------------------------------------- */ + + virtual int membervariableHandler(Node *n) { + variable_name = Getattr(n, "sym:name"); + wrapping_member_flag = true; + variable_wrapper_flag = true; + Language::membervariableHandler(n); + wrapping_member_flag = false; + variable_wrapper_flag = false; + return SWIG_OK; + } + + /* ---------------------------------------------------------------------- + * staticmembervariableHandler() + * ---------------------------------------------------------------------- */ + + virtual int staticmembervariableHandler(Node *n) { + variable_name = Getattr(n, "sym:name"); + wrapping_member_flag = true; + static_flag = true; + Language::staticmembervariableHandler(n); + wrapping_member_flag = false; + static_flag = false; + return SWIG_OK; + } + + /* ---------------------------------------------------------------------- + * memberconstantHandler() + * ---------------------------------------------------------------------- */ + + virtual int memberconstantHandler(Node *n) { + variable_name = Getattr(n, "sym:name"); + wrapping_member_flag = true; + Language::memberconstantHandler(n); + wrapping_member_flag = false; + return SWIG_OK; + } + + /* ----------------------------------------------------------------------------- * getOverloadedName() * ----------------------------------------------------------------------------- */ @@ -934,6 +1041,30 @@ return overloaded_name; } + /* ----------------------------------------------------------------------- + * variableWrapper() + * ----------------------------------------------------------------------- */ + + virtual int variableWrapper(Node *n) { + variable_wrapper_flag = true; + Language::variableWrapper(n); /* Default to functions */ + variable_wrapper_flag = false; + return SWIG_OK; + } + + /* ----------------------------------------------------------------------- + * globalvariableHandler() + * ------------------------------------------------------------------------ */ + + virtual int globalvariableHandler(Node *n) { + + variable_name = Getattr(n, "sym:name"); + global_variable_flag = true; + int ret = Language::globalvariableHandler(n); + global_variable_flag = false; + return ret; + } + /* ---------------------------------------------------------------------- * memberfunctionHandler() * ---------------------------------------------------------------------- */ @@ -980,24 +1111,6 @@ } /* ----------------------------------------------------------------------------- - * globalfunctionHandler() - * ----------------------------------------------------------------------------- */ - virtual int globalfunctionHandler(Node *n) { - Language::globalfunctionHandler(n); - - if (proxy_flag) { - String *overloaded_name = getOverloadedName(n); - String *intermediary_function_name = Swig_name_wrapper(overloaded_name); - Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); - Setattr(n, "ocppfuncname", intermediary_function_name); - proxyGlobalFunctionHandler(n); - Delete(overloaded_name); - } - - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- * getProxyName() * * Test to see if a type corresponds to something wrapped with a proxy class @@ -1114,7 +1227,7 @@ if (objcattributes && *Char(objcattributes)) Printf(proxy_class_def, "%s\n", objcattributes); - Printv(proxy_class_decl, typemapLookup("objcclassinterface", typemap_lookup_type, WARN_NONE), // Class modifiers + Printv(proxy_class_decl, "\n", typemapLookup("objcclassinterface", typemap_lookup_type, WARN_NONE), // Class modifiers " $objcclassname", // Class name and base class (*Char(wanted_base) || *Char(pure_interfaces)) ? " : " : "", wanted_base, (*Char(wanted_base) && *Char(pure_interfaces)) ? // Interfaces ", " : "", pure_interfaces, derived ? typemapLookup("objcinterface_derived", typemap_lookup_type, WARN_NONE) : // main body of class This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ash...@us...> - 2009-07-23 02:06:45
|
Revision: 11439 http://swig.svn.sourceforge.net/swig/?rev=11439&view=rev Author: ashishs99 Date: 2009-07-23 02:06:42 +0000 (Thu, 23 Jul 2009) Log Message: ----------- Handling of constants and macros. Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-23 01:12:01 UTC (rev 11438) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-23 02:06:42 UTC (rev 11439) @@ -38,7 +38,9 @@ String *variable_name; // Name of a variable being wrapped String *proxy_class_decl; String *proxy_class_def; - String *destructor_call; //C++ destructor call if any + String *destructor_call; // C++ destructor call if any + String *proxy_class_constants_code; + String *proxy_global_constants_code; public: OBJC():empty_string(NewString("")), @@ -59,7 +61,8 @@ global_variable_flag(false), proxy_flag(true), proxy_class_name(NULL), - destructor_call(NULL), variable_name(NULL), proxy_class_def(NULL), proxy_class_decl(NULL), ocpp_h_code(NULL), proxy_h_code(NULL), proxy_m_code(NULL) { + destructor_call(NULL), proxy_class_constants_code(NULL), proxy_global_constants_code(NULL), variable_name(NULL), proxy_class_def(NULL), + proxy_class_decl(NULL), ocpp_h_code(NULL), proxy_h_code(NULL), proxy_m_code(NULL) { } virtual void main(int argc, char *argv[]) { SWIG_library_directory("objc"); @@ -136,6 +139,7 @@ proxy_class_decl = NewString(""); proxy_class_def = NewString(""); swig_types_hash = NewHash(); + proxy_global_constants_code = NewString(""); // Emit code for children Language::top(n); @@ -217,6 +221,8 @@ proxy_class_def = NULL; Delete(proxy_class_decl); proxy_class_decl = NULL; + Delete(proxy_global_constants_code); + proxy_global_constants_code = NULL; Delete(f_header); Delete(f_wrappers); @@ -1255,6 +1261,122 @@ return SWIG_OK; } + + /* ----------------------------------------------------------------------- + * constantWrapper() + * Used for wrapping constants - #define or %constant. + * Also for inline initialised const static primitive type member variables (short, int, double, enums etc). + * Objective-C static const variables are generated for these. + * If the %objcconst(1) feature is used then the C constant value is used to initialise the Objective-C const variable. + * If not, method is generated to get the C constant value for initialisation of the Objective-C const variable. + * However, if the %objcconstvalue feature is used, it overrides all other ways to generate the initialisation. + * Also note that this method might be called for wrapping enum items (when the enum is using %objcconst(0)). + * ------------------------------------------------------------------------ */ + + virtual int constantWrapper(Node *n) { + String *symname = Getattr(n, "sym:name"); + SwigType *t = Getattr(n, "type"); + ParmList *l = Getattr(n, "parms"); + String *tm; + String *return_type = NewString(""); + String *constants_code = NewString(""); + + if (!addSymbol(symname, n)) + return SWIG_ERROR; + + bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); + + // The %objcconst feature determines how the constant value is obtained + int const_feature_flag = GetFlag(n, "feature:objc:const"); + + /* Adjust the enum type for the Swig_typemap_lookup. + * We want the same objctype typemap for all the enum items so we use the enum type (parent node). */ + if (is_enum_item) { + t = Getattr(parentNode(n), "enumtype"); + Setattr(n, "type", t); + } + + /* Attach the non-standard typemaps to the parameter list. */ + Swig_typemap_attach_parms("objctype", l, NULL); + + /* Get Objective-C return types */ + bool classname_substituted_flag = false; + + if ((tm = Swig_typemap_lookup("objctype", n, "", 0))) { + String *objctypeout = Getattr(n, "tmap:objctype:out"); // the type in the objctype typemap's out attribute overrides the type in the typemap + if (objctypeout) + tm = objctypeout; + classname_substituted_flag = substituteClassname(t, tm); + Printf(return_type, "%s", tm); + } else { + Swig_warning(WARN_NONE, input_file, line_number, "No objctype typemap defined for %s\n", SwigType_str(t, 0)); + } + + // Add the stripped quotes back in + String *new_value = NewString(""); + Swig_save("constantWrapper", n, "value", NIL); + if (SwigType_type(t) == T_STRING) { + Printf(new_value, "\"%s\"", Copy(Getattr(n, "value"))); + Setattr(n, "value", new_value); + } else if (SwigType_type(t) == T_CHAR) { + Printf(new_value, "\'%s\'", Copy(Getattr(n, "value"))); + Setattr(n, "value", new_value); + } + + const String *outattributes = Getattr(n, "tmap:objctype:outattributes"); + if (outattributes) + Printf(constants_code, " %s\n", outattributes); + const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; + + Printf(constants_code, " %s %s %s = ", (const_feature_flag ? "const" : "static"), return_type, itemname); + + // Check for the %objcconstvalue feature + String *value = Getattr(n, "feature:objc:constvalue"); + + if (value) { + Printf(constants_code, "%s;\n", value); + } else if (!const_feature_flag) { + // Default enum and constant handling will work with any type of C constant and initialises the Objective-C variable from C through a method call. + + if (classname_substituted_flag) { + if (SwigType_isenum(t)) { + // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) + Printf(constants_code, "(%s)%s();\n", return_type, Swig_name_get(symname)); + } else { + // This handles function pointers using the %constant directive + Printf(constants_code, "new %s(%s(), false);\n", return_type, Swig_name_get(symname)); + } + } else + Printf(constants_code, "%s();\n", Swig_name_get(symname)); + + // Each constant and enum value is wrapped with a separate function call + SetFlag(n, "feature:immutable"); + enum_constant_flag = true; + variableWrapper(n); + enum_constant_flag = false; + } else { + // Alternative constant handling will use the C syntax to make a true Objective-C constant and hope that it compiles as Objective-C code + Printf(constants_code, "%s;\n", Getattr(n, "value")); + } + + // Emit the generated code to appropriate place + // Enums only emit the intermediate methods, so no proxy wrapper methods needed + if (!is_enum_item) { + if (proxy_flag && wrapping_member_flag) + Printv(proxy_class_constants_code, constants_code, NIL); + else { + Printv(proxy_global_constants_code, constants_code, NIL); + Printv(proxy_h_code, proxy_global_constants_code, NIL); + } + } + // Cleanup + Swig_restore(n); + Delete(new_value); + Delete(return_type); + Delete(constants_code); + return SWIG_OK; + } + /* ----------------------------------------------------------------------------- * getProxyName() * @@ -1431,6 +1553,7 @@ Clear(proxy_class_decl); destructor_call = NewString(""); + proxy_class_constants_code = NewString(""); proxyClassHandler(n); Printv(proxy_h_code, proxy_class_decl, NIL); @@ -1443,6 +1566,11 @@ Language::classHandler(n); if (proxy_flag) { + + // Write out all the constants + if (Len(proxy_class_constants_code) != 0) + Printv(proxy_h_code, proxy_class_constants_code, NIL); + Printv(proxy_h_code, proxy_class_decl, NIL); Printv(proxy_m_code, proxy_class_def, NIL); @@ -1453,6 +1581,8 @@ proxy_class_name = NULL; Delete(destructor_call); destructor_call = NULL; + Delete(proxy_class_constants_code); + proxy_class_constants_code = NULL; } return SWIG_OK; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ash...@us...> - 2009-07-24 03:39:57
|
Revision: 11445 http://swig.svn.sourceforge.net/swig/?rev=11445&view=rev Author: ashishs99 Date: 2009-07-24 03:39:50 +0000 (Fri, 24 Jul 2009) Log Message: ----------- Handling for enums Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-23 23:53:16 UTC (rev 11444) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-07-24 03:39:50 UTC (rev 11445) @@ -4,6 +4,7 @@ */ #include "swigmod.h" +#include "cparse.h" #include <ctype.h> @@ -39,9 +40,12 @@ String *proxy_class_decl; String *proxy_class_def; String *destructor_call; // C++ destructor call if any + String *enum_code; String *proxy_class_constants_code; String *proxy_global_constants_code; + enum EnumFeature { SimpleEnum, ProperEnum }; + public: OBJC():empty_string(NewString("")), swig_types_hash(NULL), @@ -61,7 +65,7 @@ global_variable_flag(false), proxy_flag(true), proxy_class_name(NULL), - destructor_call(NULL), proxy_class_constants_code(NULL), proxy_global_constants_code(NULL), variable_name(NULL), proxy_class_def(NULL), + destructor_call(NULL), proxy_class_constants_code(NULL), enum_code(NULL), proxy_global_constants_code(NULL), variable_name(NULL), proxy_class_def(NULL), proxy_class_decl(NULL), ocpp_h_code(NULL), proxy_h_code(NULL), proxy_m_code(NULL) { } virtual void main(int argc, char *argv[]) { SWIG_library_directory("objc"); @@ -164,7 +168,7 @@ emitBanner(f_proxy_h); Printf(f_proxy_m, "#include \"%s\"\n\n", file_h); Printf(f_proxy_m, "#include \"%s\"\n\n", file_proxy_h); - Printv(f_proxy_h, proxy_h_code, NIL); + Printv(f_proxy_h, proxy_global_constants_code, proxy_h_code, NIL); Printv(f_proxy_m, proxy_m_code, NIL); Delete(file_proxy_h); @@ -288,7 +292,67 @@ return enum_name; } + /*---------------------------------------------------------------------- + * decodeEnumFeature() + * Decode the possible enum features, which are one of: + * %objcenum(simple) + * %objcenum(proper) + *--------------------------------------------------------------------*/ + EnumFeature decodeEnumFeature(Node *n) { + EnumFeature enum_feature = SimpleEnum; + String *feature = Getattr(n, "feature:objc:enum"); + if (feature) { + if (Cmp(feature, "simple") == 0) + enum_feature = SimpleEnum; + else if (Cmp(feature, "proper") == 0) + enum_feature = ProperEnum; + } + return enum_feature; + } + + + /* ----------------------------------------------------------------------- + * enumValue() + * This method will return a string with an enum value to use in Objective-C generated + * code. If the %objcconst feature is not used, the string will contain the intermediary + * method call to obtain the enum value. The intermediary methods to obtain + * the enum value will be generated. Otherwise the C/C++ enum value will be used if there + * is one and hopefully it will compile as Objective-C code - e.g. 20 as in: enum E{e=20}; + * The %objcconstvalue feature overrides all other ways to generate the constant value. + * The caller must delete memory allocated for the returned string. + * ------------------------------------------------------------------------ */ + + String *enumValue(Node *n) { + String *symname = Getattr(n, "sym:name"); + + // Check for the %objcconstvalue feature + String *value = Getattr(n, "feature:objc:constvalue"); + + if (!value) { + // The %objcconst feature determines how the constant value is obtained + int const_feature_flag = GetFlag(n, "feature:objc:const"); + + if (const_feature_flag) { + // Use the C syntax to make a true Objective-C constant and hope that it compiles as Objective-C code + value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex")); + } else { + // Get the enumvalue from a PINVOKE call + if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { + // Strange hack to change the name + Setattr(n, "name", Getattr(n, "value")); /* for wrapping of enums in a namespace when emit_action is used */ + constantWrapper(n); + value = NewStringf("%s()", Swig_name_get(symname)); + } else { + memberconstantHandler(n); + value = NewStringf("%s()", Swig_name_get(Swig_name_member(proxy_class_name, symname))); + } + } + } + return value; + } + + /* ----------------------------------------------------------------------------- * substituteClassname() * @@ -1261,7 +1325,146 @@ return SWIG_OK; } + /* ---------------------------------------------------------------------- + * enumDeclaration() + * + * C/C++ enums can be mapped in one of 4 ways, depending on the objc:enum feature specified: + * 1) Simple enums - simple constant within the proxy (Class or global) + * 2) Proper enums - proper Objective-C/C enum. This is just copy-paste of the enum declaration. + * Anonymous enums always default to 1) + * ---------------------------------------------------------------------- */ + virtual int enumDeclaration(Node *n) { + + if (!ImportMode) { + if (getCurrentClass() && (cplus_mode != PUBLIC)) + return SWIG_NOWRAP; + + enum_code = NewString(""); + String *symname = Getattr(n, "sym:name"); + String *constants_code = (proxy_flag && is_wrapping_class())? proxy_global_constants_code : proxy_global_constants_code; + EnumFeature enum_feature = decodeEnumFeature(n); + String *typemap_lookup_type = Getattr(n, "name"); + + if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { + // Cop-paste the C/C++ enum as an Objective-C enum + Printf(enum_code, "enum %s {", symname); + + } else { + // Wrap C++ enum with integers - just indicate start of enum with a comment, no comment for anonymous enums of any sort + if (symname && !Getattr(n, "unnamedinstance")) + Printf(constants_code, " // %s \n", symname); + } + + // Emit each enum item + Language::enumDeclaration(n); + + Replaceall(enum_code, "$objcclassname", symname); + + // Substitute $enumvalues - intended usage is for typesafe enums + if (Getattr(n, "enumvalues")) + Replaceall(enum_code, "$enumvalues", Getattr(n, "enumvalues")); + else + Replaceall(enum_code, "$enumvalues", ""); + + + if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { + // Copy-paste the C/C++ enum as a proper Objective-C enum + // Finish the enum declaration + Printf(enum_code, "};\n\n"); + } else { + // Wrap C++ enum with simple constant + Printf(enum_code, "\n"); + if (proxy_flag && is_wrapping_class()) { + Printv(proxy_global_constants_code, enum_code, NIL); // for now writing everything globally + } else { + Printv(proxy_global_constants_code, enum_code, NIL); + } + } + + Delete(enum_code); + enum_code = NULL; + } + return SWIG_OK; + } + + /* ---------------------------------------------------------------------- + * enumvalueDeclaration() + * ---------------------------------------------------------------------- */ + + virtual int enumvalueDeclaration(Node *n) { + if (getCurrentClass() && (cplus_mode != PUBLIC)) + return SWIG_NOWRAP; + + Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); + String *symname = Getattr(n, "sym:name"); + String *value = Getattr(n, "value"); + String *name = Getattr(n, "name"); + String *tmpValue; + String *tm; + SwigType *t = Getattr(n, "type"); + + // Strange hack from parent method + if (value) + tmpValue = NewString(value); + else + tmpValue = NewString(name); + // Note that this is used in enumValue() amongst other places + Setattr(n, "value", tmpValue); + + { + EnumFeature enum_feature = decodeEnumFeature(parentNode(n)); + // The %objcconst feature determines how the constant value is obtained + + int const_feature_flag = GetFlag(n, "feature:objc:const"); + + if ((enum_feature != SimpleEnum) && Getattr(parentNode(n), "sym:name") && !Getattr(parentNode(n), "unnamedinstance")) { + // Wrap (non-anonymous) C/C++ enum with a proper Objective-C enum + // Emit the enum item. + if (!Getattr(n, "_last")) // Only the first enum item has this attribute set + Printf(enum_code, ",\n"); + Printf(enum_code, " %s", symname); + + // Check for the %objcconstvalue feature + String *value = Getattr(n, "feature:objc:constvalue"); + + // Note that the enum value must be a true constant and cannot be set from a PINVOKE call, thus no support for %objcconst(0) + value = value ? value : Getattr(n, "enumvalue"); + if (value) { + Printf(enum_code, " = %s", value); + } + } else { + // Wrap C/C++ enums with constant integers + String *return_type = NewString(""); + + if ((tm = Swig_typemap_lookup("objctype", n, "", 0))) { + String *objctypeout = Getattr(n, "tmap:objctype:out"); // the type in the objctype typemap's out attribute overrides the type in the typemap + if (objctypeout) + tm = objctypeout; + substituteClassname(t, tm); + Printf(return_type, "%s", tm); + } + // Simple integer constants + // Note these are always generated for anonymous enums, no matter what enum_feature is specified + const char *const_static = const_feature_flag ? "const" : "static"; + String *value = enumValue(n); + Printf(enum_code, " %s %s %s = %s;\n", const_static, return_type, symname, value); + Delete(value); + } + + // Add the enum value to the comma separated list being constructed in the enum declaration. + String *enumvalues = Getattr(parentNode(n), "enumvalues"); + if (!enumvalues) + Setattr(parentNode(n), "enumvalues", Copy(symname)); + else + Printv(enumvalues, ", ", symname, NIL); + } + + Delete(tmpValue); + Swig_restore(n); + return SWIG_OK; + } + /* ----------------------------------------------------------------------- * constantWrapper() * Used for wrapping constants - #define or %constant. @@ -1316,10 +1519,10 @@ String *new_value = NewString(""); Swig_save("constantWrapper", n, "value", NIL); if (SwigType_type(t) == T_STRING) { - Printf(new_value, "\"%s\"", Copy(Getattr(n, "value"))); + Printf(new_value, "@\"%s\"", Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } else if (SwigType_type(t) == T_CHAR) { - Printf(new_value, "\'%s\'", Copy(Getattr(n, "value"))); + Printf(new_value, "\'%s\'", Copy(Getattr(n, "value"))); //character pointer ?? Setattr(n, "value", new_value); } @@ -1362,9 +1565,10 @@ // Emit the generated code to appropriate place // Enums only emit the intermediate methods, so no proxy wrapper methods needed if (!is_enum_item) { - if (proxy_flag && wrapping_member_flag) - Printv(proxy_class_constants_code, constants_code, NIL); - else { + if (proxy_flag && wrapping_member_flag) { + Printv(proxy_global_constants_code, constants_code, NIL); //for now writing everything globally + Printv(proxy_h_code, proxy_global_constants_code, NIL); + } else { Printv(proxy_global_constants_code, constants_code, NIL); Printv(proxy_h_code, proxy_global_constants_code, NIL); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ash...@us...> - 2009-08-08 17:31:40
|
Revision: 11516 http://swig.svn.sourceforge.net/swig/?rev=11516&view=rev Author: ashishs99 Date: 2009-08-08 17:31:26 +0000 (Sat, 08 Aug 2009) Log Message: ----------- fixed tab spacing. Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-08-08 13:25:29 UTC (rev 11515) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-08-08 17:31:26 UTC (rev 11516) @@ -134,11 +134,11 @@ Swig_name_register((char *) "wrapper", (char *) "ObjCPP_%f"); Printf(f_wrappers, "#include \"%s\"\n\n", file_h); - + Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); - + // Initialize members ocpp_h_code = NewString(""); proxy_h_code = NewString(""); @@ -190,9 +190,9 @@ } // Generate low level accessors { - Printf(f_wrappers, "#ifdef __cplusplus\n"); - Printf(f_wrappers, "}\n"); - Printf(f_wrappers, "#endif\n"); + Printf(f_wrappers, "#ifdef __cplusplus\n"); + Printf(f_wrappers, "}\n"); + Printf(f_wrappers, "#endif\n"); f_ocpp_h = NewFile(file_h, "w", SWIG_output_files()); if (!f_ocpp_h) { @@ -214,11 +214,11 @@ Printf(f_ocpp_h, "}\n"); Printf(f_ocpp_h, "#endif\n"); - Dump(f_header, f_runtime); - Dump(f_wrappers, f_runtime); - Wrapper_pretty_print(f_init, f_runtime); + Dump(f_header, f_runtime); + Dump(f_wrappers, f_runtime); + Wrapper_pretty_print(f_init, f_runtime); - Dump(f_runtime, f_ocpp_mm); + Dump(f_runtime, f_ocpp_mm); Delete(file_h); file_h = NULL; @@ -283,7 +283,7 @@ if (n) { String *symname = Getattr(n, "sym:name"); if (symname) { - enum_name = NewStringf("%s", symname); + enum_name = NewStringf("%s", symname); } } @@ -584,7 +584,7 @@ // Use typemaps to transform type used in Objective-C proxy function to the one used in intermediate code. if ((tm = Getattr(p, "tmap:objcin"))) { - addThrows(n, "tmap:objcin", p); + addThrows(n, "tmap:objcin", p); substituteClassname(pt, tm); Replaceall(tm, "$objcinput", arg); Printv(imcall, tm, NIL); @@ -611,7 +611,7 @@ // Transform return type used in low level accessor to type used in Objective-C proxy function if ((tm = Swig_typemap_lookup("objcout", n, "", 0))) { - addThrows(n, "tmap:objcout", n); + addThrows(n, "tmap:objcout", n); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else @@ -753,7 +753,7 @@ } // Use typemaps to transform type used in Objective-C proxy function to type used in low level ocpp accessor if ((tm = Getattr(p, "tmap:objcin"))) { - addThrows(n, "tmap:objcin", p); + addThrows(n, "tmap:objcin", p); substituteClassname(pt, tm); Replaceall(tm, "$objcinput", arg); Printv(imcall, tm, NIL); @@ -783,7 +783,7 @@ // Transform return type used in low level accessor to type used in Objective-C proxy function if ((tm = Swig_typemap_lookup("objcout", n, "", 0))) { - addThrows(n, "tmap:objcout", n); + addThrows(n, "tmap:objcout", n); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else @@ -904,7 +904,7 @@ // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { - addThrows(n, "tmap:in", p); + addThrows(n, "tmap:in", p); Replaceall(tm, "$source", arg); /* deprecated */ Replaceall(tm, "$target", ln); /* deprecated */ Replaceall(tm, "$arg", arg); /* deprecated? */ @@ -923,7 +923,7 @@ /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { - addThrows(n, "tmap:check", p); + addThrows(n, "tmap:check", p); Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); @@ -937,7 +937,7 @@ /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { - addThrows(n, "tmap:freearg", p); + addThrows(n, "tmap:freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); @@ -951,7 +951,7 @@ /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { - addThrows(n, "tmap:argout", p); + addThrows(n, "tmap:argout", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ @@ -964,27 +964,26 @@ } } - // Get any Objective-C exception classes in the throws typemap + // Get any Objective-C exception classes in the throws typemap ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "throws"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); for (p = throw_parm_list; p; p = nextSibling(p)) { - if ((tm = Getattr(p, "tmap:throws"))) { - addThrows(n, "tmap:throws", p); - } + if ((tm = Getattr(p, "tmap:throws"))) { + addThrows(n, "tmap:throws", p); + } } } - // Now write code to make the low level function call if (!native_function_flag) { String *actioncode = emit_action(n); - - // Handle exception classes specified in the "except" feature's "throws" attribute + + // Handle exception classes specified in the "except" feature's "throws" attribute addThrows(n, "feature:except", n); // Return value if necessary if ((tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode))) { - addThrows(n, "tmap:out", n); + addThrows(n, "tmap:out", n); Replaceall(tm, "$source", "result"); /* deprecated */ Replaceall(tm, "$target", "oresult"); /* deprecated */ Replaceall(tm, "$result", "oresult"); @@ -1010,7 +1009,7 @@ /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, "result", 0))) { - addThrows(n, "tmap:newfree", n); + addThrows(n, "tmap:newfree", n); Replaceall(tm, "$source", "result"); /* deprecated */ Printf(f->code, "%s\n", tm); } @@ -1019,7 +1018,7 @@ /* See if there is any return cleanup code */ if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, "result", 0))) { - addThrows(n, "tmap:ret", n); + addThrows(n, "tmap:ret", n); Replaceall(tm, "$source", "result"); /* deprecated */ Printf(f->code, "%s\n", tm); } @@ -1044,11 +1043,11 @@ Wrapper_print(f, f_wrappers); } - if (!is_void_return) + if (!is_void_return) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", ""); - + if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { Setattr(n, "ocppfuncname", wname); proxyGlobalFunctionHandler(n); @@ -1162,7 +1161,7 @@ // Use typemaps to transform type used in Objective-C wrapper function (in proxy class) to type used in intermediary code if ((tm = Getattr(p, "tmap:objcin"))) { - addThrows(n, "tmap:objcin", p); + addThrows(n, "tmap:objcin", p); substituteClassname(pt, tm); Replaceall(tm, "$objcinput", arg); Printv(imcall, tm, NIL); @@ -1389,19 +1388,19 @@ Language::enumDeclaration(n); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { - Replaceall(enum_code, "$objcclassname", symname); + Replaceall(enum_code, "$objcclassname", symname); // Copy-paste the C/C++ enum as a proper Objective-C enum // Finish the enum declaration Printf(enum_code, "};\n\n"); } else { // Wrap C++ enum with simple constant Printf(enum_code, "\n"); - } - if (proxy_flag && is_wrapping_class()) - Printv(proxy_class_constants_code, enum_code, NIL); - else - Printv(proxy_global_constants_code, enum_code, NIL); - + } + if (proxy_flag && is_wrapping_class()) + Printv(proxy_class_constants_code, enum_code, NIL); + else + Printv(proxy_global_constants_code, enum_code, NIL); + Delete(enum_code); enum_code = NULL; } @@ -1429,13 +1428,13 @@ tmpValue = NewString(value); else tmpValue = NewString(name); - + // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); { EnumFeature enum_feature = decodeEnumFeature(parentNode(n)); - + // The %objcconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:objc:const"); @@ -1444,7 +1443,7 @@ // Emit the enum item. if (!Getattr(n, "_last")) // Only the first enum item has this attribute set Printf(enum_code, ",\n"); - + Printf(enum_code, " %s", symname); // Check for the %objcconstvalue feature @@ -1813,61 +1812,61 @@ return SWIG_OK; } - /* ----------------------------------------------------------------------------- + /* ----------------------------------------------------------------------------- * addThrows() * * Adds exception classes to a throws list. The throws list is the list of classes * that will form the Objective-C throws clause. Mainly for checked exceptions. * ----------------------------------------------------------------------------- */ - + void addThrows(Node *n, const String *attribute, Node *parameter) { // Get the comma separated exception classes for the throws clause - held in typemap/feature's "throws" attribute String *throws_attribute = NewStringf("%s:throws", attribute); String *throws = Getattr(parameter, throws_attribute); - + if (throws && Len(throws) > 0) { String *throws_list = Getattr(n, "objc:throwslist"); if (!throws_list) { - throws_list = NewList(); - Setattr(n, "objc:throwslist", throws_list); + throws_list = NewList(); + Setattr(n, "objc:throwslist", throws_list); } // Put the exception classes in the throws clause into a temporary List List *temp_classes_list = Split(throws, ',', INT_MAX); - + // Add the exception classes to the node throws list, but don't duplicate if already in list if (temp_classes_list && Len(temp_classes_list) > 0) { - for (Iterator cls = First(temp_classes_list); cls.item; cls = Next(cls)) { - String *exception_class = NewString(cls.item); - Replaceall(exception_class, " ", ""); // remove spaces - Replaceall(exception_class, "\t", ""); // remove tabs - if (Len(exception_class) > 0) { - // $objcclassname substitution - SwigType *pt = Getattr(parameter, "type"); - substituteClassname(pt, exception_class); - - // Don't duplicate the Objective-C exception class in the throws clause - bool found_flag = false; - for (Iterator item = First(throws_list); item.item; item = Next(item)) { - if (Strcmp(item.item, exception_class) == 0) - found_flag = true; - } - if (!found_flag) - Append(throws_list, exception_class); - } - Delete(exception_class); - } + for (Iterator cls = First(temp_classes_list); cls.item; cls = Next(cls)) { + String *exception_class = NewString(cls.item); + Replaceall(exception_class, " ", ""); // remove spaces + Replaceall(exception_class, "\t", ""); // remove tabs + if (Len(exception_class) > 0) { + // $objcclassname substitution + SwigType *pt = Getattr(parameter, "type"); + substituteClassname(pt, exception_class); + + // Don't duplicate the Objective-C exception class in the throws clause + bool found_flag = false; + for (Iterator item = First(throws_list); item.item; item = Next(item)) { + if (Strcmp(item.item, exception_class) == 0) + found_flag = true; + } + if (!found_flag) + Append(throws_list, exception_class); + } + Delete(exception_class); + } } Delete(temp_classes_list); } Delete(throws_attribute); } - + /* ----------------------------------------------------------------------------- * generateThrowsClause() * * Generates throws clause for checked exception * ----------------------------------------------------------------------------- */ - + void generateThrowsClause(Node *n, String *code) { // Add the throws clause into code List *throws_list = Getattr(n, "objc:throwslist"); @@ -1875,11 +1874,11 @@ Iterator cls = First(throws_list); Printf(code, " throws %s", cls.item); while ((cls = Next(cls)).item) - Printf(code, ", %s", cls.item); + Printf(code, ", %s", cls.item); } } - + }; /* ----------------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ash...@us...> - 2009-08-16 05:22:06
|
Revision: 11588 http://swig.svn.sourceforge.net/swig/?rev=11588&view=rev Author: ashishs99 Date: 2009-08-16 05:21:59 +0000 (Sun, 16 Aug 2009) Log Message: ----------- Some fixes. Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-08-16 05:18:33 UTC (rev 11587) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-08-16 05:21:59 UTC (rev 11588) @@ -169,6 +169,7 @@ } emitBanner(f_proxy_h); + Printf(f_proxy_h, "#import <Foundation/Foundation.h>"); Printf(f_proxy_m, "#include \"%s\"\n\n", file_h); Printf(f_proxy_m, "#include \"%s\"\n\n", proxy_h); Printv(f_proxy_h, proxy_global_constants_code, proxy_h_code, NIL); @@ -206,6 +207,7 @@ } Swig_banner(f_ocpp_h); + Printf(f_ocpp_h, "\n#import <Foundation/Foundation.h>\n"); Printf(f_ocpp_h, "\n#ifdef __cplusplus\n"); Printf(f_ocpp_h, "extern \"C\" {\n"); Printf(f_ocpp_h, "#endif\n\n"); @@ -1038,16 +1040,19 @@ // Substitute the function name Replaceall(f->code, "$symname", symname); - // Dump the function out - if (!native_function_flag) { - Wrapper_print(f, f_wrappers); - } + /* Contract macro modification */ + Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, "); if (!is_void_return) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", ""); + // Dump the function out + if (!native_function_flag) { + Wrapper_print(f, f_wrappers); + } + if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { Setattr(n, "ocppfuncname", wname); proxyGlobalFunctionHandler(n); @@ -1116,7 +1121,7 @@ Printf(function_decl, "- (id)init"); - Printv(imcall, mangled_overname, "(", NIL); + Printv(imcall, "ObjCPP_", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); @@ -1745,10 +1750,11 @@ if (*Char(destructor_call)) Replaceall(destruct, "$imcall", destructor_call); else - Replaceall(destruct, "$imcall", "throw new UnsupportedOperationException(\"C++ destructor does not have public access\")"); + Replaceall(destruct, "$imcall", + "[NSException raise:@\"UnsupportedOperationException\" format: @\"%@\", @\"C++ destructor does not have public access\"]"); if (*Char(destruct)) { - Printv(proxy_class_decl, "- (void)", destruct_methodname, "();", "\n", NIL); - Printv(proxy_class_def, "- (void)", destruct_methodname, "() ", destruct, "\n\n", NIL); + Printv(proxy_class_decl, "- (void)", destruct_methodname, ";", "\n", NIL); + Printv(proxy_class_def, "- (void)", destruct_methodname, " ", destruct, "\n\n", NIL); } } // Emit extra user code This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ash...@us...> - 2009-08-19 06:29:04
|
Revision: 11653 http://swig.svn.sourceforge.net/swig/?rev=11653&view=rev Author: ashishs99 Date: 2009-08-19 06:28:57 +0000 (Wed, 19 Aug 2009) Log Message: ----------- Few fixes. Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-08-19 06:28:24 UTC (rev 11652) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-08-19 06:28:57 UTC (rev 11653) @@ -169,7 +169,7 @@ } emitBanner(f_proxy_h); - Printf(f_proxy_h, "#import <Foundation/Foundation.h>"); + Printf(f_proxy_h, "\n#import <Foundation/Foundation.h>\n"); Printf(f_proxy_m, "#include \"%s\"\n\n", file_h); Printf(f_proxy_m, "#include \"%s\"\n\n", proxy_h); Printv(f_proxy_h, proxy_global_constants_code, proxy_h_code, NIL); @@ -216,6 +216,12 @@ Printf(f_ocpp_h, "}\n"); Printf(f_ocpp_h, "#endif\n"); + + // Output a Objective-C type wrapper class for each SWIG type + for (Iterator swig_type = First(swig_types_hash); swig_type.key; swig_type = Next(swig_type)) { + emitTypeWrapperClass(swig_type.key, swig_type.item); + } + Dump(f_header, f_runtime); Dump(f_wrappers, f_runtime); Wrapper_pretty_print(f_init, f_runtime); @@ -1623,7 +1629,75 @@ return NULL; } + /* ----------------------------------------------------------------------------- + * emitTypeWrapperClass() + * ----------------------------------------------------------------------------- */ + + void emitTypeWrapperClass(String *classname, SwigType *type) { + + String *swigtypeh = NewString(""); + String *swigtypem = NewString(""); + String *fileh = NewStringf("%s%s.h", SWIG_output_directory(), classname); + String *filem = NewStringf("%s%s.m", SWIG_output_directory(), classname); + File *fh_swigtype = NewFile(fileh, "w", SWIG_output_files()); + File *fm_swigtype = NewFile(filem, "w", SWIG_output_files()); + if (!fh_swigtype) { + FileErrorDisplay(fileh); + SWIG_exit(EXIT_FAILURE); + } + + if (!fm_swigtype) { + FileErrorDisplay(filem); + SWIG_exit(EXIT_FAILURE); + } + + // Start writing out the type wrapper class file + emitBanner(fh_swigtype); + + // Pure Objective-C baseclass and interfaces + const String *pure_baseclass = typemapLookup("objcbase", type, WARN_NONE); + const String *pure_interfaces = typemapLookup("objcinterfaces", type, WARN_NONE); + + Printf(swigtypeh, "#include \<Foundation/Foundation.h\>\n\n", fileh); + + Printv(swigtypeh, typemapLookup("objcimports", type, WARN_NONE), // Import statements + "\n", typemapLookup("objcclassinterface", type, WARN_NONE), // Class modifiers + " $objcclassname", // Class name and base class + *Char(pure_baseclass) ? " : " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces + ", " : "", pure_interfaces, typemapLookup("objcinterface", type, WARN_NONE), // main body of class + typemapLookup("objccode", type, WARN_NONE), // extra Objective-C code + "@end\n", "\n", NIL); + + Printf(swigtypem, "#include \"%s\"\n\n", fileh); + + Printv(swigtypem, typemapLookup("objcimports", type, WARN_NONE), // Import statements + typemapLookup("objcclassimplementation", type, WARN_NONE), // Class modifiers + " $objcclassname", typemapLookup("objcbody", type, WARN_NONE), // main body of class + typemapLookup("objccode", type, WARN_NONE), // extra Objective-C code + "@end\n", "\n", NIL); + + + Replaceall(swigtypeh, "$objcclassname", classname); + Replaceall(swigtypem, "$objcclassname", classname); + + Printv(fh_swigtype, swigtypeh, NIL); + Printv(fm_swigtype, swigtypem, NIL); + + Close(fh_swigtype); + Delete(swigtypeh); + + Close(fm_swigtype); + Delete(swigtypem); + + Delete(fileh); + fileh = NULL; + + Delete(filem); + filem = NULL; + } + + /* ----------------------------------------------------------------------------- * typemapLookup() * ----------------------------------------------------------------------------- */ @@ -1715,8 +1789,8 @@ // Pure Objective-C interfaces const String *pure_interfaces = typemapLookup(derived ? "objcinterfaces_derived" : "objcinterfaces", typemap_lookup_type, WARN_NONE); // Start writing the proxy class - Printv(proxy_class_decl, typemapLookup("objcimports", typemap_lookup_type, WARN_NONE), // Import statements - "\n", NIL); // This would be needed when we decide upon a separate file for each class. + //Printv(proxy_class_decl, typemapLookup("objcimports", typemap_lookup_type, WARN_NONE), // Import statements + // "\n", NIL); // This would be needed when we decide upon a separate file for each class. // Class attributes const String *objcattributes = typemapLookup("objcattributes", typemap_lookup_type, WARN_NONE); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ash...@us...> - 2009-10-16 20:52:46
|
Revision: 11702 http://swig.svn.sourceforge.net/swig/?rev=11702&view=rev Author: ashishs99 Date: 2009-10-16 20:52:37 +0000 (Fri, 16 Oct 2009) Log Message: ----------- Resolved minor problems after merging with the trunk Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-10-16 20:49:20 UTC (rev 11701) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-10-16 20:52:37 UTC (rev 11702) @@ -1148,7 +1148,7 @@ /* Insert the objcconstruct typemap, doing the replacement for $directorconnect, as needed */ Hash *attributes = NewHash(); - String *construct_tm = Copy(typemapLookup("objcconstruct", Getattr(n, "name"), + String *construct_tm = Copy(typemapLookup(n, "objcconstruct", Getattr(n, "name"), WARN_NONE, attributes)); if (construct_tm) { Printv(function_def, " ", construct_tm, "\n", NIL); @@ -1165,7 +1165,7 @@ Delete(overloaded_name); Delete(imcall); } - + Delete(n); return SWIG_OK; } @@ -1660,54 +1660,63 @@ * ----------------------------------------------------------------------------- */ void emitTypeWrapperClass(String *classname, SwigType *type) { - + Node *n = NewHash(); + Setfile(n, input_file); + Setline(n, line_number); + // Pure Objective-C baseclass and interfaces - const String *pure_baseclass = typemapLookup("objcbase", type, WARN_NONE); - const String *pure_interfaces = typemapLookup("objcinterfaces", type, WARN_NONE); + const String *pure_baseclass = typemapLookup(n,"objcbase", type, WARN_NONE); + const String *pure_interfaces = typemapLookup(n,"objcinterfaces", type, WARN_NONE); - Printv(swigtypes_h_code, typemapLookup("objcimports", type, WARN_NONE), // Import statements - "\n", typemapLookup("objcclassinterface", type, WARN_NONE), // Class modifiers + Printv(swigtypes_h_code, typemapLookup(n, "objcimports", type, WARN_NONE), // Import statements + "\n", typemapLookup(n, "objcclassinterface", type, WARN_NONE), // Class modifiers " $objcclassname", // Class name and base class *Char(pure_baseclass) ? " : " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces - ", " : "", pure_interfaces, typemapLookup("objcinterface", type, WARN_NONE), // main body of class - typemapLookup("objccode", type, WARN_NONE), // extra Objective-C code + ", " : "", pure_interfaces, typemapLookup(n, "objcinterface", type, WARN_NONE), // main body of class + typemapLookup(n, "objccode", type, WARN_NONE), // extra Objective-C code "@end\n", "\n", NIL); - Printv(swigtypes_m_code, typemapLookup("objcimports", type, WARN_NONE), // Import statements - typemapLookup("objcclassimplementation", type, WARN_NONE), // Class modifiers - " $objcclassname", typemapLookup("objcbody", type, WARN_NONE), // main body of class - typemapLookup("objccode", type, WARN_NONE), // extra Objective-C code + Printv(swigtypes_m_code, typemapLookup(n, "objcimports", type, WARN_NONE), // Import statements + typemapLookup(n, "objcclassimplementation", type, WARN_NONE), // Class modifiers + " $objcclassname", typemapLookup(n, "objcbody", type, WARN_NONE), // main body of class + typemapLookup(n, "objccode", type, WARN_NONE), // extra Objective-C code "@end\n", "\n", NIL); Replaceall(swigtypes_h_code, "$objcclassname", classname); Replaceall(swigtypes_m_code, "$objcclassname", classname); + + Delete(n); } + /* ----------------------------------------------------------------------------- + * typemapLookup(n, ) + * n - for input only and must contain info for Getfile(n) and Getline(n) to work + * tmap_method - typemap method name + * type - typemap type to lookup + * warning - warning number to issue if no typemaps found + * typemap_attributes - the typemap attributes are attached to this node and will + * also be used for temporary storage if non null + * return is never NULL, unlike Swig_typemap_lookup() + * ----------------------------------------------------------------------------- */ + + const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { + Node *node = !typemap_attributes ? NewHash() : typemap_attributes; + Setattr(node, "type", type); + Setfile(node, Getfile(n)); + Setline(node, Getline(n)); + const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); + if (!tm) { + tm = empty_string; + if (warning != WARN_NONE) + Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); + } + if (!typemap_attributes) + Delete(node); + return tm; + } + /* ----------------------------------------------------------------------------- - * typemapLookup() - * ----------------------------------------------------------------------------- */ - - const String *typemapLookup(const String *op, String *type, int warning, Node *typemap_attributes = NULL) { - String *tm = NULL; - const String *code = NULL; - - if ((tm = Swig_typemap_search(op, type, NULL, NULL))) { - code = Getattr(tm, "code"); - if (typemap_attributes) - Swig_typemap_attach_kwargs(tm, op, typemap_attributes); - } - - if (!code) { - code = empty_string; - if (warning != WARN_NONE) - Swig_warning(warning, input_file, line_number, "No %s typemap defined for %s\n", op, type); - } - - return code ? code : empty_string; - } - - /* ----------------------------------------------------------------------------- * proxyClassHandler() * ----------------------------------------------------------------------------- */ @@ -1719,7 +1728,7 @@ // Inheritance from pure Objective-C classes Node *attributes = NewHash(); - const String *pure_baseclass = typemapLookup("objcbase", typemap_lookup_type, WARN_NONE, attributes); + const String *pure_baseclass = typemapLookup(n, "objcbase", typemap_lookup_type, WARN_NONE, attributes); bool purebase_replace = GetFlag(attributes, "tmap:objcbase:replace") ? true : false; bool purebase_notderived = GetFlag(attributes, "tmap:objcbase:notderived") ? true : false; Delete(attributes); @@ -1773,26 +1782,26 @@ "Perhaps you need one of the 'replace' or 'notderived' attributes in the objcbase typemap?\n", typemap_lookup_type, pure_baseclass); } // Pure Objective-C interfaces - const String *pure_interfaces = typemapLookup(derived ? "objcinterfaces_derived" : "objcinterfaces", typemap_lookup_type, WARN_NONE); + const String *pure_interfaces = typemapLookup(n, derived ? "objcinterfaces_derived" : "objcinterfaces", typemap_lookup_type, WARN_NONE); // Start writing the proxy class - //Printv(proxy_class_decl, typemapLookup("objcimports", typemap_lookup_type, WARN_NONE), // Import statements + //Printv(proxy_class_decl, typemapLookup(n, "objcimports", typemap_lookup_type, WARN_NONE), // Import statements // "\n", NIL); // This would be needed when we decide upon a separate file for each class. // Class attributes - const String *objcattributes = typemapLookup("objcattributes", typemap_lookup_type, WARN_NONE); + const String *objcattributes = typemapLookup(n, "objcattributes", typemap_lookup_type, WARN_NONE); if (objcattributes && *Char(objcattributes)) Printf(proxy_class_def, "%s\n", objcattributes); - Printv(proxy_class_decl, "\n", typemapLookup("objcclassinterface", typemap_lookup_type, WARN_NONE), // Class modifiers + Printv(proxy_class_decl, "\n", typemapLookup(n, "objcclassinterface", typemap_lookup_type, WARN_NONE), // Class modifiers " $objcclassname", // Class name and base class (*Char(wanted_base) || *Char(pure_interfaces)) ? " : " : "", wanted_base, (*Char(wanted_base) && *Char(pure_interfaces)) ? // Interfaces - ", " : "", pure_interfaces, derived ? typemapLookup("objcinterface_derived", typemap_lookup_type, WARN_NONE) : // main body of class - typemapLookup("objcinterface", typemap_lookup_type, WARN_NONE), // main body of class + ", " : "", pure_interfaces, derived ? typemapLookup(n, "objcinterface_derived", typemap_lookup_type, WARN_NONE) : // main body of class + typemapLookup(n, "objcinterface", typemap_lookup_type, WARN_NONE), // main body of class NIL); - Printv(proxy_class_def, typemapLookup("objcclassimplementation", typemap_lookup_type, WARN_NONE), // Class modifiers - " $objcclassname", derived ? typemapLookup("objcbody_derived", typemap_lookup_type, WARN_NONE) : // main body of class - typemapLookup("objcbody", typemap_lookup_type, WARN_NONE), // main body of class + Printv(proxy_class_def, typemapLookup(n, "objcclassimplementation", typemap_lookup_type, WARN_NONE), // Class modifiers + " $objcclassname", derived ? typemapLookup(n, "objcbody_derived", typemap_lookup_type, WARN_NONE) : // main body of class + typemapLookup(n, "objcbody", typemap_lookup_type, WARN_NONE), // main body of class "\n", NIL); // C++ destructor is wrapped by the dealloc method @@ -1801,7 +1810,7 @@ const String *tm = NULL; attributes = NewHash(); String *destruct_methodname = NewString("dealloc"); - tm = typemapLookup("objcdestruct", typemap_lookup_type, WARN_NONE, attributes); + tm = typemapLookup(n, "objcdestruct", typemap_lookup_type, WARN_NONE, attributes); // Emit the dealloc method if (tm) { @@ -1818,7 +1827,7 @@ } } // Emit extra user code - Printv(proxy_class_def, typemapLookup("objccode", typemap_lookup_type, WARN_NONE), // extra Objective-C code + Printv(proxy_class_def, typemapLookup(n, "objccode", typemap_lookup_type, WARN_NONE), // extra Objective-C code NIL); // Substitute various strings into the above template @@ -1826,6 +1835,7 @@ Replaceall(proxy_class_def, "$objcclassname", proxy_class_name); Delete(baseclass); + Delete(n); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ash...@us...> - 2009-11-02 22:25:56
|
Revision: 11718 http://swig.svn.sourceforge.net/swig/?rev=11718&view=rev Author: ashishs99 Date: 2009-11-02 22:25:44 +0000 (Mon, 02 Nov 2009) Log Message: ----------- Removed few warnings Modified Paths: -------------- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx Modified: branches/gsoc2009-ashishs99/Source/Modules/objc.cxx =================================================================== --- branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-11-02 06:31:45 UTC (rev 11717) +++ branches/gsoc2009-ashishs99/Source/Modules/objc.cxx 2009-11-02 22:25:44 UTC (rev 11718) @@ -54,22 +54,29 @@ swig_types_hash(NULL), f_ocpp_h(NULL), f_ocpp_mm(NULL), + f_runtime(NULL), + f_header(NULL), + f_wrappers(NULL), + f_init(NULL), f_proxy_h(NULL), f_proxy_m(NULL), - f_runtime(NULL), - f_header(NULL), - f_wrappers(NULL), - f_init(NULL), + proxy_flag(true), native_function_flag(false), enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), - proxy_flag(true), + ocpp_h_code(NULL), + proxy_h_code(NULL), + proxy_m_code(NULL), + swigtypes_h_code(NULL), + swigtypes_m_code(NULL), proxy_class_name(NULL), - destructor_call(NULL), proxy_class_constants_code(NULL), enum_code(NULL), proxy_global_constants_code(NULL), variable_name(NULL), proxy_class_def(NULL), - proxy_class_decl(NULL), ocpp_h_code(NULL), proxy_h_code(NULL), proxy_m_code(NULL), swigtypes_h_code(NULL), swigtypes_m_code(NULL) { + variable_name(NULL), + proxy_class_decl(NULL), + proxy_class_def(NULL), + destructor_call(NULL),enum_code(NULL), proxy_class_constants_code(NULL), proxy_global_constants_code(NULL){ } virtual void main(int argc, char *argv[]) { SWIG_library_directory("objc"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |