stas 02/03/05 04:22:19 Modified: src/docs/2.0/devel/core_explained core_explained.pod Log: - new section "Adding Typemaps for new Data Types" Revision Changes Path 1.14 +71 -1 modperl-docs/src/docs/2.0/devel/core_explained/core_explained.pod Index: core_explained.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/2.0/devel/core_explained/core_explained.pod,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- core_explained.pod 3 Jan 2002 07:21:04 -0000 1.13 +++ core_explained.pod 5 Mar 2002 12:22:19 -0000 1.14 @@ -197,6 +197,8 @@ MODULE=APR::IO PACKAGE=APR::IO BOOT=1 +Notice that the C<PACKAGE=> declaration is a must. + When I<make xs_generate> is run (after running I<make source_scan>), it autogenerates I<Wrap/APR/IO/IO.xs> and amongst other things will include: @@ -435,7 +437,75 @@ In all other cases use normal functions. -=head1 Importing Constants and Enums into Perl API +=head1 Adding New Interfaces + + + +=head2 Adding Typemaps for new Data Types + +Sometimes when a new interface is added it may include C data types +for which we don't yet have a Perl typemap. In such a case, the first +thing to do is to provide the required typemaps. + +Let's add a prototype for the I<typedef struct scoreboard> data type +defined in I<httpd-2.0/include/scoreboard.h>. + +First we include the relevant header files in +I<src/modules/perl/modperl_apache_includes.h>: + + #include "scoreboard.h" + +If you want to specify your own type and don't have a header file for +it (e.g. if you extend some existing datatype within mod_perl) you may +add the I<typedef> to I<src/modules/perl/modperl_types.h>. + +After deciding that C<Apache::Scoreboard> is the Perl class will be +used for manipulating C I<scoreboard> data structures, we map the +I<scoreboard> data structure to the C<Apache::Scoreboard> +class. Therefore we add to I<xs/maps/apache_types.map>: + + struct scoreboard | Apache::Scoreboard + +Since we want the I<scoreboard> data structure to be an opaque object +on the perl side, we simply let mod_perl use the default C<T_PTROBJ> +typemap. After running C<make xs_generate> you can check the assigned +typemap in the autogenerated I<WrapXS/typemap> file. + +If you need to do some special handling while converting from C to +Perl and back, you need to add the conversion functions to the +I<xs/typemap> file. For example the C<Apache::RequestRec> objects need +special handling, so you can see the special C<INPUT> and C<OUTPUT> +typemappings for the corresponding C<T_APACHEOBJ> object type. + +Now we run C<make xs_generate> and find the following definitions in +the autogenerated files: + + file:xs/modperl_xs_typedefs.h + ----------------------------- + typedef scoreboard * Apache__Scoreboard; + + file:xs/modperl_xs_sv_convert.h + ------------------------------- + #define mp_xs_sv2_Apache__Scoreboard(sv) \ + ((SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG)) \ + || (Perl_croak(aTHX_ "argument is not a blessed reference \ + (expecting an Apache::Scoreboard derived object)"),0) ? \ + (scoreboard *)SvIV((SV*)SvRV(sv)) : (scoreboard *)NULL) + + #define mp_xs_Apache__Scoreboard_2obj(ptr) \ + sv_setref_pv(sv_newmortal(), "Apache::Scoreboard", (void*)ptr) + +The file I<xs/modperl_xs_typedefs.h> declares the typemapping from C +to Perl and equivalent to the C<TYPEMAP> section of the XS's +I<typemap> file. The second file I<xs/modperl_xs_sv_convert.h> +generates two macros. The first macro is used to convert from Perl to +C datatype and equivalent to the I<typemap> file's C<INPUT> +section. The second macro is used to convert from C to Perl datatype +and equivalent to the I<typemap>'s <OUTPUT> section. + +Now proceed on adding the glue code for the new interface. + +=head2 Importing Constants and Enums into Perl API To I<import> httpd and APR constants and enums into Perl API, edit I<lib/Apache/ParseSource.pm>. To add a new type of C<DEFINE> constants
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]