diff options
author | Marcin Kolny <marcin.kolny@gmail.com> | 2014-08-21 02:19:06 +0200 |
---|---|---|
committer | Marcin Kolny <marcin.kolny@gmail.com> | 2014-09-08 18:49:21 +0200 |
commit | e96ac12360a50a902647eb7e61e7ebe8fd1b89f6 (patch) | |
tree | 806b441594dca8fcca75f6f9d98044c018422da9 /tools/pm | |
parent | b671bb745680c8b98854dc748ae80849ccff06d5 (diff) | |
download | glibmm-e96ac12360a50a902647eb7e61e7ebe8fd1b89f6.tar.gz |
gmmproc: Added parameter exception_handler in _WRAP_VFUNC (bgo#735132)
This change allows developer to use custom exception handler, instead of
using Glib::exception_handlers_invoke() method. It might be useful, if
developer can't get access to a thread, where exception might appear, or
it is very difficult to register handler in this thread.
* tools/m4/signal.m4:
* tools/m4/vfunc.m4:
* tools/pm/Output.pm:
* tools/pm/WrapParser.pm: added additional parameter
to a _WRAP_VFUNC and _WRAP_SIGNAL, allowing write custom
exception handlers
Diffstat (limited to 'tools/pm')
-rw-r--r-- | tools/pm/Output.pm | 45 | ||||
-rw-r--r-- | tools/pm/WrapParser.pm | 36 |
2 files changed, 51 insertions, 30 deletions
diff --git a/tools/pm/Output.pm b/tools/pm/Output.pm index d1d3b1e4..22af9ef8 100644 --- a/tools/pm/Output.pm +++ b/tools/pm/Output.pm @@ -209,8 +209,9 @@ sub output_wrap_vfunc_cc($$$$$$$$) convert_args_c_to_cpp($objCFunc, $objCppfunc, $line_num); my $returnValue = $$objCppfunc{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)dnl\n", + my $str = sprintf("_VFUNC_PCC(%s,%s,%s,%s,\`%s\',\`%s\',\`%s\',%s,%s,%s,%s,%s,%s,%s,%s)dnl\n", $$objCppfunc{name}, $cname, $$objCppfunc{rettype}, @@ -224,7 +225,8 @@ sub output_wrap_vfunc_cc($$$$$$$$) $errthrow, $$objCppfunc{slot_type}, $$objCppfunc{c_data_param_name}, - $returnValue); + $returnValue, + $exceptionHandler); $self->append($str); } @@ -234,10 +236,10 @@ sub output_wrap_vfunc_cc($$$$$$$$) # _SIGNAL_H(signame,rettype, `<cppargs>', ifdef) # _SIGNAL_PH(gtkname,crettype, cargs and names, ifdef, deprecated) # void output_wrap_default_signal_handler_h($filename, $line_num, $objCppfunc, -# $objCDefsFunc, $ifdef, $deprecated) -sub output_wrap_default_signal_handler_h($$$$$$$) +# $objCDefsFunc, $ifdef, $deprecated, $exceptionHandler) +sub output_wrap_default_signal_handler_h($$$$$$$$) { - my ($self, $filename, $line_num, $objCppfunc, $objCDefsFunc, $ifdef, $deprecated) = @_; + my ($self, $filename, $line_num, $objCppfunc, $objCDefsFunc, $ifdef, $deprecated, $exceptionHandler) = @_; # The default signal handler is a virtual function. # It's not hidden by deprecation, since that would break ABI. @@ -253,21 +255,23 @@ sub output_wrap_default_signal_handler_h($$$$$$$) #The default callback, which will call on_* or the base default callback. #Declares the callback in the private *Class class and sets it in the class_init function. #This is hidden by deprecation. - $str = sprintf("_SIGNAL_PH(%s,%s,\`%s\',%s,%s)dnl\n", + $str = sprintf("_SIGNAL_PH(%s,%s,\`%s\',%s,%s,%s)dnl\n", $$objCDefsFunc{name}, $$objCDefsFunc{rettype}, $objCDefsFunc->args_types_and_names(), $ifdef, - $deprecated + $deprecated, + $exceptionHandler ); $self->append($str); } -# _SIGNAL_CC(signame, gtkname, rettype, crettype,`<cppargs>',`<cargs>', const, refreturn, ifdef) -sub output_wrap_default_signal_handler_cc($$$$$$$$$) +# _SIGNAL_CC(signame, gtkname, rettype, crettype,`<cppargs>',`<cargs>', const, refreturn, ifdef, exceptionHandler) +sub output_wrap_default_signal_handler_cc($$$$$$$$$$$) { my ($self, $filename, $line_num, $objCppfunc, $objDefsSignal, $bImplement, - $bCustomCCallback, $bRefreturn, $ifdef, $deprecated) = @_; + $bCustomCCallback, $bRefreturn, $ifdef, $deprecated, $exceptionHandler) = @_; + my $cname = $$objDefsSignal{name}; # $cname = $1 if ($args[3] =~ /"(.*)"/); #TODO: What's this about? @@ -291,7 +295,8 @@ sub output_wrap_default_signal_handler_cc($$$$$$$$$) $conversions, $$objCppfunc{const}, $refreturn, - $ifdef); + $ifdef + ); $self->append($str); } @@ -313,7 +318,7 @@ sub output_wrap_default_signal_handler_cc($$$$$$$$$) convert_args_c_to_cpp($objDefsSignal, $objCppfunc, $line_num); #This is hidden by deprecation. - my $str = sprintf("_SIGNAL_PCC(%s,%s,%s,%s,\`%s\',\`%s\',\`%s\',\`%s\',%s,%s)dnl\n", + my $str = sprintf("_SIGNAL_PCC(%s,%s,%s,%s,\`%s\',\`%s\',\`%s\',\`%s\',%s,%s,%s)dnl\n", $$objCppfunc{name}, $cname, $$objCppfunc{rettype}, @@ -323,7 +328,8 @@ sub output_wrap_default_signal_handler_cc($$$$$$$$$) $conversions, ${$objDefsSignal->get_param_names()}[0], $ifdef, - $deprecated); + $deprecated, + $exceptionHandler); $self->append($str); } } @@ -572,15 +578,15 @@ sub output_wrap_create($$$) } } -# void output_wrap_sig_decl($filename, $line_num, $objCSignal, $objCppfunc, $signal_name, $bCustomCCallback, $ifdef, $commentblock, $deprecated, $deprecation_docs) +# void output_wrap_sig_decl($filename, $line_num, $objCSignal, $objCppfunc, $signal_name, $bCustomCCallback, $ifdef, $commentblock, $deprecated, $deprecation_docs, $exceptionHandler) # custom_signalproxy_name is "" when no type conversion is required - a normal templates SignalProxy will be used instead. -sub output_wrap_sig_decl($$$$$$$$$$) +sub output_wrap_sig_decl($$$$$$$$$$$) { - my ($self, $filename, $line_num, $objCSignal, $objCppfunc, $signal_name, $bCustomCCallback, $ifdef, $commentblock, $deprecated, $deprecation_docs) = @_; + my ($self, $filename, $line_num, $objCSignal, $objCppfunc, $signal_name, $bCustomCCallback, $ifdef, $commentblock, $deprecated, $deprecation_docs, $exceptionHandler) = @_; # _SIGNAL_PROXY(c_signal_name, c_return_type, `<c_arg_types_and_names>', # cpp_signal_name, cpp_return_type, `<cpp_arg_types>',`<c_args_to_cpp>', -# refdoc_comment) +# refdoc_comment, exceptionHandler) # Get the signal name with underscores only (to look up docs -- they are # stored that way). @@ -623,7 +629,7 @@ sub output_wrap_sig_decl($$$$$$$$$$) my $conversions = convert_args_c_to_cpp($objCSignal, $objCppfunc, $line_num); - my $str = sprintf("_SIGNAL_PROXY(%s,%s,\`%s\',%s,%s,\`%s\',\`%s\',\`%s\',%s,\`%s\',%s)dnl\n", + my $str = sprintf("_SIGNAL_PROXY(%s,%s,\`%s\',%s,%s,\`%s\',\`%s\',\`%s\',%s,\`%s\',%s,%s)dnl\n", $signal_name, $$objCSignal{rettype}, $objCSignal->args_types_and_names_without_object(), @@ -634,7 +640,8 @@ sub output_wrap_sig_decl($$$$$$$$$$) $bCustomCCallback, #When this is true, it will not write the *_callback implementation for you. $deprecated, $doxycomment, - $ifdef + $ifdef, + $exceptionHandler ); $self->append($str); diff --git a/tools/pm/WrapParser.pm b/tools/pm/WrapParser.pm index 1ef5cbce..a52769c2 100644 --- a/tools/pm/WrapParser.pm +++ b/tools/pm/WrapParser.pm @@ -1198,6 +1198,7 @@ sub on_wrap_signal($$) my $ifdef; my $argDeprecated = ""; my $deprecation_docs = ""; + my $exceptionHandler = ""; while($#args >= 2) # If optional arguments are there. { @@ -1236,11 +1237,16 @@ sub on_wrap_signal($$) { $ifdef = $1; } + + elsif($argRef =~ /^exception_handler\s+(.*)/) #If exception_handler at the start. + { + $exceptionHandler = $1; + } } $self->output_wrap_signal($argCppDecl, $argCName, $$self{filename}, $$self{line_num}, $bCustomDefaultHandler, $bNoDefaultHandler, $bCustomCCallback, - $bRefreturn, $ifdef, $commentblock, $argDeprecated, $deprecation_docs); + $bRefreturn, $ifdef, $commentblock, $argDeprecated, $deprecation_docs, $exceptionHandler); } # void on_wrap_vfunc() @@ -1265,6 +1271,7 @@ sub on_wrap_vfunc($) my $refreturn = 0; my $refreturn_ctype = 0; my $returnValue = ""; + my $exceptionHandler = ""; my $custom_vfunc = 0; my $custom_vfunc_callback = 0; my $ifdef = ""; @@ -1293,6 +1300,12 @@ sub on_wrap_vfunc($) { $returnValue = $1; } + # If exception handler is not defined, then Glib::exception_handlers_invoke + # method will be used for exception handling. + elsif($argRef =~ /^exception_handler\s+(.*)/) + { + $exceptionHandler = $1; + } elsif($argRef eq "custom_vfunc") { $custom_vfunc = 1; @@ -1333,7 +1346,7 @@ sub on_wrap_vfunc($) $self->output_wrap_vfunc($argCppDecl, $argCName, $$self{filename}, $$self{line_num}, $refreturn, $refreturn_ctype, $custom_vfunc, $custom_vfunc_callback, $ifdef, $errthrow, - $slot_name, $slot_callback, $no_slot_copy, $returnValue); + $slot_name, $slot_callback, $no_slot_copy, $returnValue, $exceptionHandler); } sub on_wrap_enum($) @@ -1492,12 +1505,12 @@ sub output_wrap_check($$$$$$) # void output_wrap($CppDecl, $signal_name, $filename, $line_num, $bCustomDefaultHandler, # $bNoDefaultHandler, $bCustomCCallback, $bRefreturn, $ifdef, -# $commentblock, $deprecated, $deprecation_docs) -sub output_wrap_signal($$$$$$$$$$$) +# $commentblock, $deprecated, $deprecation_docs, $exceptionHandler) +sub output_wrap_signal($$$$$$$$$$$$) { my ($self, $CppDecl, $signal_name, $filename, $line_num, $bCustomDefaultHandler, $bNoDefaultHandler, $bCustomCCallback, $bRefreturn, $ifdef, - $commentblock, $deprecated, $deprecation_docs) = @_; + $commentblock, $deprecated, $deprecation_docs, $exceptionHandler) = @_; #Some checks: return if ($self->output_wrap_check($CppDecl, $signal_name, @@ -1531,30 +1544,30 @@ sub output_wrap_signal($$$$$$$$$$$) $objOutputter->output_wrap_sig_decl($filename, $line_num, $objCSignal, $objCppSignal, $signal_name, $bCustomCCallback, $ifdef, $commentblock, - $deprecated, $deprecation_docs); + $deprecated, $deprecation_docs, $exceptionHandler); if($bNoDefaultHandler eq 0) { $objOutputter->output_wrap_default_signal_handler_h($filename, $line_num, - $objCppSignal, $objCSignal, $ifdef, $deprecated); + $objCppSignal, $objCSignal, $ifdef, $deprecated, $exceptionHandler); my $bImplement = 1; if($bCustomDefaultHandler) { $bImplement = 0; } $objOutputter->output_wrap_default_signal_handler_cc($filename, $line_num, $objCppSignal, $objCSignal, $bImplement, $bCustomCCallback, $bRefreturn, - $ifdef, $deprecated); + $ifdef, $deprecated, $exceptionHandler); } } # void output_wrap_vfunc($CppDecl, $vfunc_name, $filename, $line_num, # $refreturn, $refreturn_ctype, # $custom_vfunc, $custom_vfunc_callback, $ifdef, $errthrow, -# $slot_name, $slot_callback, $no_slot_copy, $returnValue) -sub output_wrap_vfunc($$$$$$$$$$$$$) +# $slot_name, $slot_callback, $no_slot_copy, $returnValue, $exceptionHandler) +sub output_wrap_vfunc($$$$$$$$$$$$$$) { my ($self, $CppDecl, $vfunc_name, $filename, $line_num, $refreturn, $refreturn_ctype, $custom_vfunc, $custom_vfunc_callback, $ifdef, $errthrow, - $slot_name, $slot_callback, $no_slot_copy, $returnValue) = @_; + $slot_name, $slot_callback, $no_slot_copy, $returnValue, $exceptionHandler) = @_; #Some checks: return if ($self->output_wrap_check($CppDecl, $vfunc_name, $filename, $line_num, '_WRAP_VFUNC')); @@ -1586,6 +1599,7 @@ sub output_wrap_vfunc($$$$$$$$$$$$$) $$objCppVfunc{rettype_needs_ref} = $refreturn; $$objCppVfunc{return_value} = $returnValue; + $$objCppVfunc{exception_handler} = $exceptionHandler; $$objCppVfunc{name} .= "_vfunc"; #All vfuncs should have the "_vfunc" suffix, and a separate easily-named invoker method. # Store the slot information in the vfunc if specified. |