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]

Reply via email to