diff --git a/Source/Modules/perl5.cxx b/Source/Modules/perl5.cxx index 58b61d4e2..de0674769 100644 --- a/Source/Modules/perl5.cxx +++ b/Source/Modules/perl5.cxx @@ -851,6 +851,7 @@ public: tab4, "MAGIC_PPERL\n", NIL); + int addfail = 0; if ((tm = Swig_typemap_lookup_new("varout",n,name,0))) { SwigType *t = Getattr(n,"type"); Replaceall(tm,"$target","sv"); @@ -862,13 +863,19 @@ public: Replaceall(tm, "$shadow", "0"); } /* Printf(getf->code,"%s\n", tm);*/ - emit_action_code(n, getf, tm); + addfail = emit_action_code(n, getf, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t,0)); return SWIG_NOWRAP; } - Printf(getf->code," return 1;\n}\n"); + Printf(getf->code," return 1;\n"); + if (addfail) { + Append(getf->code,"fail:\n"); + Append(getf->code," return 0;\n"); + } + Append(getf->code,"}\n"); + Replaceall(getf->code,"$symname",iname); Wrapper_print(getf,magic); diff --git a/Source/Modules/ruby.cxx b/Source/Modules/ruby.cxx index 216049601..dfe93f970 100644 --- a/Source/Modules/ruby.cxx +++ b/Source/Modules/ruby.cxx @@ -1433,17 +1433,24 @@ public: Wrapper_add_local(getf,"_val","VALUE _val"); tm = Swig_typemap_lookup_new("varout",n, name, 0); + int addfail = 0; if (tm) { Replaceall(tm,"$result","_val"); Replaceall(tm,"$target","_val"); Replaceall(tm,"$source",name); /* Printv(getf->code,tm, NIL); */ - emit_action_code(n, getf, tm); + addfail = emit_action_code(n, getf, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t,0)); } - Printv(getf->code, tab4, "return _val;\n}\n", NIL); + Printv(getf->code, tab4, "return _val;\n", NIL); + if (addfail) { + Append(getf->code,"fail:\n"); + Append(getf->code," return Qnil;\n"); + } + Append(getf->code,"}\n"); + Wrapper_print(getf,f_wrappers); if (!is_assignable(n)) { diff --git a/Source/Modules/tcl8.cxx b/Source/Modules/tcl8.cxx index cb87f1158..bb84c7eaa 100644 --- a/Source/Modules/tcl8.cxx +++ b/Source/Modules/tcl8.cxx @@ -578,18 +578,22 @@ public: getname = Swig_name_get(iname); Printv(getf->def,"SWIGINTERN char *",getname,"(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, char *name1, char *name2, int flags) {",NIL); Wrapper_add_local(getf,"value", "Tcl_Obj *value = 0"); - + int addfail = 0; if ((tm = Swig_typemap_lookup_new("varout",n,name,0))) { Replaceall(tm,"$source", name); Replaceall(tm,"$target","value"); Replaceall(tm,"$result", "value"); /* Printf(getf->code, "%s\n",tm); */ - emit_action_code(n, getf, tm); + addfail = emit_action_code(n, getf, tm); Printf(getf->code, "if (value) {\n"); Printf(getf->code, "Tcl_SetVar2(interp,name1,name2,Tcl_GetStringFromObj(value,NULL), flags);\n"); Printf(getf->code, "Tcl_DecrRefCount(value);\n"); Printf(getf->code, "}\n"); Printf(getf->code, "return NULL;\n"); + if (addfail) { + Append(getf->code,"fail:\n"); + Printf(getf->code,"return \"%s\";\n", iname); + } Printf(getf->code,"}\n"); Wrapper_print(getf,f_wrappers); } else {