diff options
author | Kjell Ahlstedt <kjell.ahlstedt@bredband.net> | 2016-06-02 08:59:49 +0200 |
---|---|---|
committer | Kjell Ahlstedt <kjell.ahlstedt@bredband.net> | 2016-06-02 08:59:49 +0200 |
commit | 71d272a1926260ad3ee8abd38875066b139801b8 (patch) | |
tree | 5761a1a553f334971ec39e1478c2a36e45c8f9e6 | |
parent | efa8aeb31a86ff9a70cda945b3f1fa93269820a8 (diff) | |
download | glibmm-71d272a1926260ad3ee8abd38875066b139801b8.tar.gz |
gmmproc: Add optional argument err_return_value in _WRAP_VFUNC
* tools/m4/vfunc.m4:
* tools/pm/Output.pm:
* tools/pm/WrapParser.pm: Add the optional argument err_return_value in
_WRAP_VFUNC. This return value, if specified, applies only when the C++ vfunc
throws an exception, which is propagated to the C callback function.
-rw-r--r-- | tools/m4/vfunc.m4 | 16 | ||||
-rw-r--r-- | tools/pm/Output.pm | 4 | ||||
-rw-r--r-- | tools/pm/WrapParser.pm | 21 |
3 files changed, 28 insertions, 13 deletions
diff --git a/tools/m4/vfunc.m4 b/tools/m4/vfunc.m4 index 5b6f1141..e1609a94 100644 --- a/tools/m4/vfunc.m4 +++ b/tools/m4/vfunc.m4 @@ -24,8 +24,8 @@ dnl $5 $6 $7 $8 dnl `<cargs and names>',`<cnames>',`<cpparg names>',firstarg, dnl $9 $10 $11 $12 dnl refreturn_ctype, keep_return, ifdef, errthrow, -dnl $13 $14 $15 $16 -dnl slot_type, c_data_param_name, return_value, exception_handler) +dnl $13 $14 $15 $16 $17 +dnl slot_type, c_data_param_name, return_value, err_return_value, exception_handler) dnl dnl Note: _get_current_wrapper_inline() could be used throughout for performance instead of _get_current_wrapper(), dnl and is_derived_() instead of is_derived_(), @@ -89,15 +89,15 @@ ifelse($10,keep_return,`dnl ')dnl end refreturn_ctype ')dnl end void } -ifelse($16,,,`dnl if (exception_handler) +ifelse($17,,,`dnl if (exception_handler) catch(...) { try { ifelse($9,refreturn_ctype,`dnl - return Glib::unwrap_copy`'(obj->$16`'()); + return Glib::unwrap_copy`'(obj->$17`'()); ', `dnl - return _CONVERT($3, $4, `obj->$16`'()'); + return _CONVERT($3, $4, `obj->$17`'()'); ')dnl } ')dnl end exception_handler @@ -108,11 +108,11 @@ ifelse($12,errthrow,`dnl ifelse($4,void,`dnl return; ',`dnl -ifelse(`$15', `',`dnl +ifelse(`$16', `',`dnl using RType = $4; return RType`'(); ',`dnl - return _CONVERT($3,$4,`$15'); + return _CONVERT($3,$4,`$16'); ')dnl ')dnl } @@ -121,7 +121,7 @@ ifelse(`$15', `',`dnl { Glib::exception_handlers_invoke`'(); } -ifelse($16,,,`dnl if (exception_handler) +ifelse($17,,,`dnl if (exception_handler) } ')dnl } diff --git a/tools/pm/Output.pm b/tools/pm/Output.pm index 6af27752..b9207915 100644 --- a/tools/pm/Output.pm +++ b/tools/pm/Output.pm @@ -240,9 +240,10 @@ sub output_wrap_vfunc_cc($$$$$$$$) convert_args_c_to_cpp($objCFunc, $objCppfunc, $line_num); my $returnValue = $$objCppfunc{return_value}; + my $errReturnValue = $$objCppfunc{err_return_value}; my $exceptionHandler = $$objCppfunc{exception_handler}; - my $str = sprintf("_VFUNC_PCC(%s,%s,%s,%s,\`%s\',\`%s\',\`%s\',%s,%s,%s,%s,%s,%s,%s,%s,%s)dnl\n", + my $str = sprintf("_VFUNC_PCC(%s,%s,%s,%s,\`%s\',\`%s\',\`%s\',%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)dnl\n", $$objCppfunc{name}, $cname, $$objCppfunc{rettype}, @@ -258,6 +259,7 @@ sub output_wrap_vfunc_cc($$$$$$$$) $$objCppfunc{slot_type}, $$objCppfunc{c_data_param_name}, $returnValue, + $errReturnValue, $exceptionHandler); $self->append($str); diff --git a/tools/pm/WrapParser.pm b/tools/pm/WrapParser.pm index 9a03e731..3f71ece6 100644 --- a/tools/pm/WrapParser.pm +++ b/tools/pm/WrapParser.pm @@ -1325,6 +1325,7 @@ sub on_wrap_vfunc($) my $keep_return = 0; my $refreturn_ctype = 0; my $returnValue = ""; + my $errReturnValue = ""; my $exceptionHandler = ""; my $custom_vfunc = 0; my $custom_vfunc_callback = 0; @@ -1360,6 +1361,14 @@ sub on_wrap_vfunc($) { $returnValue = $1; } + # Return value, if the C++ vfunc throws an exception which is propagated + # to the C callback. + # (Default is the default value of the return type or, if return_value + # is specified, the return_value.) + elsif($argRef =~ /^err_return_value\s+(.*)/) + { + $errReturnValue = $1; + } # If exception handler is not defined, then Glib::exception_handlers_invoke # method will be used for exception handling. elsif($argRef =~ /^exception_handler\s+(.*)/) @@ -1402,11 +1411,13 @@ sub on_wrap_vfunc($) $no_slot_copy = 1; } } + $errReturnValue = $returnValue if ($returnValue ne "" and $errReturnValue eq ""); $self->output_wrap_vfunc($argCppDecl, $argCName, $$self{filename}, $$self{line_num}, $refreturn, $keep_return, $refreturn_ctype, $custom_vfunc, $custom_vfunc_callback, $ifdef, $errthrow, - $slot_name, $slot_callback, $no_slot_copy, $returnValue, $exceptionHandler); + $slot_name, $slot_callback, $no_slot_copy, + $returnValue, $errReturnValue, $exceptionHandler); } # Common part of _WRAP_ENUM(), _WRAP_ENUM_DOCS_ONLY() and _WRAP_GERROR(). @@ -1689,12 +1700,13 @@ sub output_wrap_signal($$$$$$$$$$$$$$$$$) # void output_wrap_vfunc($CppDecl, $vfunc_name, $filename, $line_num, # $refreturn, $keep_return, $refreturn_ctype, # $custom_vfunc, $custom_vfunc_callback, $ifdef, $errthrow, -# $slot_name, $slot_callback, $no_slot_copy, $returnValue, $exceptionHandler) -sub output_wrap_vfunc($$$$$$$$$$$$$$$$$) +# $slot_name, $slot_callback, $no_slot_copy, $returnValue, +# $errReturnValue, $exceptionHandler) +sub output_wrap_vfunc($$$$$$$$$$$$$$$$$$) { my ($self, $CppDecl, $vfunc_name, $filename, $line_num, $refreturn, $keep_return, $refreturn_ctype, $custom_vfunc, $custom_vfunc_callback, $ifdef, $errthrow, - $slot_name, $slot_callback, $no_slot_copy, $returnValue, $exceptionHandler) = @_; + $slot_name, $slot_callback, $no_slot_copy, $returnValue, $errReturnValue, $exceptionHandler) = @_; #Some checks: return if ($self->output_wrap_check($CppDecl, $vfunc_name, $filename, $line_num, '_WRAP_VFUNC')); @@ -1727,6 +1739,7 @@ sub output_wrap_vfunc($$$$$$$$$$$$$$$$$) $$objCppVfunc{rettype_needs_ref} = $refreturn; $$objCppVfunc{keep_return} = $keep_return; $$objCppVfunc{return_value} = $returnValue; + $$objCppVfunc{err_return_value} = $errReturnValue; $$objCppVfunc{exception_handler} = $exceptionHandler; $$objCppVfunc{name} .= "_vfunc"; #All vfuncs should have the "_vfunc" suffix, and a separate easily-named invoker method. |