summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorJosé Alburquerque <jaalburqu@svn.gnome.org>2012-11-19 11:22:56 -0500
committerJosé Alburquerque <jaalburqu@svn.gnome.org>2012-11-19 11:24:01 -0500
commitb05333e9119a4548da0db0705b930a37ae7d7fce (patch)
tree6bc2b2b973238768917ec9d18bd917bf466fa8f8 /tools
parent2e7d6462178c54a94741ac58196f65157b205112 (diff)
downloadglibmm-b05333e9119a4548da0db0705b930a37ae7d7fce.tar.gz
gmmproc: _WRAP_METHOD: Support wrapping methods with slots.
* tools/pm/WrapParser.pm (on_wrap_method): Add code to parse the additional 'slot_name', 'slot_callback' and 'no_slot_copy' options. - The 'slot_name' options specifies the name of the slot parameter in the C++ method declaration. - The 'slot_callback' option specifies the name of the callback to pass to the C function. - The 'no_slot_copy' option specifies that the actual slot should be passed to the C function in the data parameter and not a copy. By default, a copy is used. * tools/pm/Output.pm (output_wrap_meth): Pass the new slot options along to the *METHOD() m4 macros. (convert_args_cpp_to_c): - If there is a slot parameter, ignore the final user_data parameter in the C function when comparing the argument count in the C++ method and the C function. - Convert a possible slot parameter to the address of the specified slot callback (with the 'slot_callback' option). Report an error if no callback has been specified. - Pass a 'slot_copy' variable as the final user data parameter to the C function. The variable is declared by the _*METHOD() m4 macros. * tools/m4/method.m4 (_METHOD): (_STATIC_METHOD): - Accept the new 'slot_type', 'slot_name' and 'no_slot_copy' options which specify the C++ slot type (without the const and the &), the C++ slot parameter name and whether to create a copy of the slot or not respectively. - Insert code to declare a 'slot_copy' variable that is either a copy of the slot or a pointer to the actual C++ slot based on the 'no_slot_copy' option. Bug #688587.
Diffstat (limited to 'tools')
-rw-r--r--tools/m4/method.m462
-rw-r--r--tools/pm/Output.pm52
-rw-r--r--tools/pm/WrapParser.pm19
3 files changed, 122 insertions, 11 deletions
diff --git a/tools/m4/method.m4 b/tools/m4/method.m4
index 41a5e765..3c48b3e1 100644
--- a/tools/m4/method.m4
+++ b/tools/m4/method.m4
@@ -9,8 +9,8 @@ dnl
dnl
dnl method
-dnl $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18
-dnl _METHOD(cppname,cname,cpprettype,crettype,arglist,cdeclarations,cargs,cinitializations,const,refreturn,errthrow,deprecated,constversion,ifdef,arglist_without_types,out_param,out_param_cpptype,wrap_line)
+dnl $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21
+dnl _METHOD(cppname,cname,cpprettype,crettype,arglist,cdeclarations,cargs,cinitializations,const,refreturn,errthrow,deprecated,constversion,ifdef,arglist_without_types,out_param,out_param_cpptype,slot_type,slot_name,no_slot_copy,wrap_line)
define(`_METHOD',`dnl
_PUSH(SECTION_CC)
ifelse(`$12',,,`_DEPRECATE_IFDEF_START
@@ -21,8 +21,19 @@ $3 __CPPNAME__::$1`'($5)ifelse(`$9',1,` const')
{
ifelse(`$13',,dnl
`ifelse(`$10'`$11',,dnl If it is not errthrow or refreturn
+dnl If a slot type has been specified insert a slot copy declaration.
+`ifelse(`$18',,,dnl
+dnl See if the slot should or should not be copied
+`ifelse(`$20',,dnl
+` // Create a copy of the slot.
+ $18* slot_copy = new $18($19); ',dnl
+dnl
+` // Use the original slot (not a copy).
+ $18* slot_copy = const_cast<$18*>(&$19);')
+
+')`'dnl
dnl Insert the declarations for C output parameters
-`ifelse(`$6',,,`$6
+ifelse(`$6',,,`$6
')`'dnl
ifelse(`$16',,dnl If no C++ output parameter is specified
`ifelse(`$3',void,dnl If the C function returns voids:
@@ -41,7 +52,7 @@ ifelse(`$6',,,` return retvalue;
')dnl
')'dnl End if it returns voids.
dnl A C++ output parameter is specified:
-,` _INITIALIZE($17,$4,`$16',`$2`'(ifelse(`$9',1,const_cast<__CNAME__*>(gobj()),gobj())`'ifelse(`$7',,,`, ')$7)',$18);
+,` _INITIALIZE($17,$4,`$16',`$2`'(ifelse(`$9',1,const_cast<__CNAME__*>(gobj()),gobj())`'ifelse(`$7',,,`, ')$7)',$21);
dnl
dnl Insert the initializations for the C output parameters
ifelse(`$8',,,`$8
@@ -50,6 +61,17 @@ ifelse(`$8',,,`$8
dnl If is errthrow or refreturn
`ifelse(`$11',,,` GError* gerror = 0;
')dnl
+dnl If a slot type has been specified insert a slot copy declaration.
+ifelse(`$18',,,dnl
+dnl See if the slot should or should not be copied
+`ifelse(`$20',,dnl
+` // Create a copy of the slot.
+ $18* slot_copy = new $18($19); ',dnl
+dnl
+` // Use the original slot (not a copy).
+ $18* slot_copy = const_cast<$18*>(&$19);')
+
+')`'dnl
dnl Insert the declarations for C output parameters
ifelse(`$6',,,`$6
')`'dnl
@@ -57,7 +79,7 @@ ifelse(`$16',,dnl If no C++ output parameter is specified:
` ifelse(`$3',void,,``$3' retvalue = ')_CONVERT($4,`$3',`$2`'(ifelse(`$9',1,const_cast<__CNAME__*>(gobj()),gobj())`'ifelse(`$7',,,`, ')$7)');
'dnl
,dnl A C++ output parameter is specified:
-` _INITIALIZE($17,$4,`$16',`$2`'(ifelse(`$9',1,const_cast<__CNAME__*>(gobj()),gobj())`'ifelse(`$7',,,`, ')$7)',$18);
+` _INITIALIZE($17,$4,`$16',`$2`'(ifelse(`$9',1,const_cast<__CNAME__*>(gobj()),gobj())`'ifelse(`$7',,,`, ')$7)',$21);
'dnl
)dnl
ifelse(`$11',,,`dnl
@@ -87,8 +109,8 @@ _POP()')
dnl
dnl static method
-dnl $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
-dnl _STATIC_METHOD(cppname,cname,cpprettype,crettype,arglist,cdeclarations,cargs,cinitializations,refreturn,errthrow,deprecated,ifdef,out_param,out_param_type,wrap_line)
+dnl $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18
+dnl _STATIC_METHOD(cppname,cname,cpprettype,crettype,arglist,cdeclarations,cargs,cinitializations,refreturn,errthrow,deprecated,ifdef,out_param,out_param_type,slot_type,slot_name,no_slot_copy,wrap_line)
define(`_STATIC_METHOD',`dnl
_PUSH(SECTION_CC)
ifelse(`$11',,,`_DEPRECATE_IFDEF_START
@@ -98,6 +120,17 @@ ifelse(`$12',,,`#ifdef $12'
$3 __CPPNAME__::$1($5)
{
ifelse(`$9'`$10',,dnl
+dnl If a slot type has been specified insert a slot copy declaration.
+ifelse(`$15',,,dnl
+dnl See if the slot should or should not be copied
+`ifelse(`$17',,dnl
+` // Create a copy of the slot.
+ $15* slot_copy = new $15($16); ',dnl
+dnl
+` // Use the original slot (not a copy).
+ $15* slot_copy = const_cast<$15*>(&$16);')
+
+')`'dnl
dnl Insert declarations for C the output parameters
ifelse(`$6',,,`$6
')`'dnl
@@ -108,7 +141,7 @@ dnl Returns non-void:
dnl Store the return if there are C output parameters
ifelse(`$6',,`return ',``$3' retval = '))_CONVERT($4,`$3',`$2`'($7)');'dnl
dnl A C++ output parameter is specified so initialize it from C return
-,` _INITIALIZE($14,$4,`$13',`$2`'($7)',$15);'dnl
+,` _INITIALIZE($14,$4,`$13',`$2`'($7)',$18);'dnl
)
dnl Insert the initializations for the C output parameters if there are any
ifelse(`$8',,,`$8
@@ -118,13 +151,24 @@ ifelse(`$3',void,,`ifelse(`$6',,,` return retval;
')')dnl
',dnl End if a C++ output parameter is specified.
`ifelse(`$10',,,` GError* gerror = 0;')
+dnl If a slot type has been specified insert a slot copy declaration.
+ifelse(`$15',,,dnl
+dnl See if the slot should or should not be copied
+`ifelse(`$17',,dnl
+` // Create a copy of the slot.
+ $15* slot_copy = new $15($16); ',dnl
+dnl
+` // Use the original slot (not a copy).
+ $15* slot_copy = const_cast<$15*>(&$16);')
+
+')`'dnl
dnl Insert the declarations for the C output parameters
ifelse(`$6',,,`$6
')`'dnl
ifelse(`$13',,dnl If no C++ output parameter is specified:
ifelse(`$3',void,,``$3' retvalue = ')_CONVERT($4,`$3',`$2`'($7)');dnl
dnl A C++ output parameter is specified:
-,` _INITIALIZE($14,$4,`$13',`$2`'($7)',$15);'dnl
+,` _INITIALIZE($14,$4,`$13',`$2`'($7)',$18);'dnl
)dnl
ifelse(`$10',,,`
if(gerror)
diff --git a/tools/pm/Output.pm b/tools/pm/Output.pm
index 1efad7b3..a9943257 100644
--- a/tools/pm/Output.pm
+++ b/tools/pm/Output.pm
@@ -390,7 +390,10 @@ sub output_wrap_meth($$$$$$$)
convert_args_cpp_to_c($objCppfunc, $objCDefsFunc, 1, $line_num,
$errthrow, $arg_list); #1 means it's static, so it has 'object'.
- $str = sprintf("_STATIC_METHOD(%s,%s,\`%s\',%s,\`%s\',\`%s\',\`%s\',\`%s\',%s,%s,%s,%s,%s,%s,%s)dnl\n",
+ my $no_slot_copy = "";
+ $no_slot_copy = "no_slot_copy" if ($$objCppfunc{no_slot_copy});
+
+ $str = sprintf("_STATIC_METHOD(%s,%s,\`%s\',%s,\`%s\',\`%s\',\`%s\',\`%s\',%s,%s,%s,%s,%s,%s,`%s',`%s',`%s',%s)dnl\n",
$$objCppfunc{name},
$$objCDefsFunc{c_name},
$$objCppfunc{rettype},
@@ -405,6 +408,9 @@ sub output_wrap_meth($$$$$$$)
$ifdef,
$output_var_name,
$output_var_type,
+ $$objCppfunc{slot_type},
+ $$objCppfunc{slot_name},
+ $no_slot_copy,
$line_num
);
} else {
@@ -412,7 +418,10 @@ sub output_wrap_meth($$$$$$$)
convert_args_cpp_to_c($objCppfunc, $objCDefsFunc, 0, $line_num,
$errthrow, $arg_list);
- $str = sprintf("_METHOD(%s,%s,\`%s\',%s,\`%s\',\`%s\',\`%s\',\`%s\',%s,%s,%s,%s,%s,\`%s\',%s,%s,%s,%s)dnl\n",
+ my $no_slot_copy = "";
+ $no_slot_copy = "no_slot_copy" if ($$objCppfunc{no_slot_copy});
+
+ $str = sprintf("_METHOD(%s,%s,\`%s\',%s,\`%s\',\`%s\',\`%s\',\`%s\',%s,%s,%s,%s,%s,\`%s\',%s,%s,%s,`%s',`%s',`%s',%s)dnl\n",
$$objCppfunc{name},
$$objCDefsFunc{c_name},
$$objCppfunc{rettype},
@@ -430,6 +439,9 @@ sub output_wrap_meth($$$$$$$)
$ifdef,
$output_var_name,
$output_var_type,
+ $$objCppfunc{slot_type},
+ $$objCppfunc{slot_name},
+ $no_slot_copy,
$line_num
);
}
@@ -926,6 +938,11 @@ sub convert_args_cpp_to_c($$$$$)
$$cpp_param_mappings{@$c_param_names[$num_c_args_expected]} = $cpp_index;
}
+ # If the method has a slot temporarily decrement the C arg count when
+ # comparing the C++ and C argument count because the C function would
+ # have a final 'gpointer data' parameter.
+ $num_c_args_expected-- if ($$objCppfunc{slot_name});
+
if ( $num_cpp_args != $num_c_args_expected )
{
Output::error( "convert_args_cpp_to_c(): Incorrect number of arguments. (%d != %d)\n",
@@ -937,6 +954,9 @@ sub convert_args_cpp_to_c($$$$$)
return ("", "", "");
}
+ # Reincrement the expected C argument count if there is a slot.
+ $num_c_args_expected++ if ($$objCppfunc{slot_name});
+
# If there is an output parameter it must be processed so re-increment (now)
# the number of C++ arguments.
$num_cpp_args++ if($has_output_param);
@@ -1018,6 +1038,29 @@ sub convert_args_cpp_to_c($$$$$)
next;
}
+ # If dealing with a slot.
+ if ($$objCppfunc{slot_name} eq $cppParamName)
+ {
+ if ($$objCppfunc{slot_callback})
+ {
+ # The conversion for the slot is the address of the callback.
+ push(@conversions, "&" . $$objCppfunc{slot_callback});
+ }
+ else
+ {
+ Output::error(
+ "convert_args_cpp_to_c(): Missing a slot callback. " .
+ "Specify it with the 'slot_callback' option.\n",);
+ }
+
+ # Get the slot type without the const and the & and store it so
+ # it can be passed to the m4 _*METHOD macros.
+ $cppParamType =~ /^const\s+(.*)&/;
+ $$objCppfunc{slot_type} = $1;
+
+ next;
+ }
+
if ($cppParamType ne $cParamType) #If a type conversion is needed.
{
@@ -1034,6 +1077,11 @@ sub convert_args_cpp_to_c($$$$$)
}
}
+ # Append the final slot copy parameter to the C function if the
+ # method has a slot. The parameter name is consistent with the name
+ # in the _*METHOD() m4 macros.
+ push(@conversions, "slot_copy") if ($$objCppfunc{slot_name});
+
return ( join(", ", @conversions), join("\n", @declarations),
join("\n ", @initializations) );
}
diff --git a/tools/pm/WrapParser.pm b/tools/pm/WrapParser.pm
index 4ce03a74..f538b96d 100644
--- a/tools/pm/WrapParser.pm
+++ b/tools/pm/WrapParser.pm
@@ -942,6 +942,25 @@ sub on_wrap_method($)
{
$ifdef = $1;
}
+ # The "slot_name" option tells gmmproc the name of the parameter
+ # that is a slot in the method if there is one.
+ elsif($argRef =~ /^slot_name\s+(\w+)/)
+ {
+ $$objCppfunc{slot_name} = $1;
+ }
+ # The "slot_callback" option tells gmmproc the name of the
+ # callback function that should be passed to the C function if the
+ # method has a slot.
+ elsif($argRef =~ /^slot_callback\s+(\w+)/)
+ {
+ $$objCppfunc{slot_callback} = $1;
+ }
+ # The "no_slot_copy" options tells gmmproc to pass the actual slot
+ # and not a copy of it to the C function in the data parameter.
+ if($argRef eq "no_slot_copy")
+ {
+ $$objCppfunc{no_slot_copy} = 1;
+ }
}
if ($commentblock ne '')