stas        2004/05/27 18:35:15

  Modified:    lib/ModPerl MapUtil.pm StructureMap.pm WrapXS.pm
  Log:
  Extended WrapXS code to support a new type of accessor: char * which
  accepts undef to set the C pointer to NULL and as such unset the
  member of the struct.
  
  Revision  Changes    Path
  1.6       +1 -0      modperl-2.0/lib/ModPerl/MapUtil.pm
  
  Index: MapUtil.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/ModPerl/MapUtil.pm,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -u -r1.5 -r1.6
  --- MapUtil.pm        17 May 2004 22:53:33 -0000      1.5
  +++ MapUtil.pm        28 May 2004 01:35:15 -0000      1.6
  @@ -26,6 +26,7 @@
   our @ISA = qw(Exporter);
   
   #    '<' => 'auto-generated but gives only a read-only access'
  +#    '&' => 'RDWR accessor to a char* field, supporting undef arg'
   my %disabled_map = (
       '!' => 'disabled or not yet implemented',
       '~' => 'implemented but not auto-generated',
  
  
  
  1.6       +7 -2      modperl-2.0/lib/ModPerl/StructureMap.pm
  
  Index: StructureMap.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/ModPerl/StructureMap.pm,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -u -r1.5 -r1.6
  --- StructureMap.pm   17 May 2004 22:53:33 -0000      1.5
  +++ StructureMap.pm   28 May 2004 01:35:15 -0000      1.6
  @@ -118,8 +118,13 @@
   
           if (s/^(\W)\s*// or $disabled) {
               # < denotes a read-only accessor
  -            if ($1 && $1 eq '<') {
  -                $map->{$class}->{$_} = 'ro';
  +            if ($1) {
  +                if ($1 eq '<') {
  +                    $map->{$class}->{$_} = 'ro';
  +                }
  +                elsif ($1 eq '&') {
  +                    $map->{$class}->{$_} = 'rw_char_undef';
  +                }
               }
               else {
                   $map->{$class}->{$_} = undef;
  
  
  
  1.74      +34 -0     modperl-2.0/lib/ModPerl/WrapXS.pm
  
  Index: WrapXS.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/ModPerl/WrapXS.pm,v
  retrieving revision 1.73
  retrieving revision 1.74
  diff -u -u -r1.73 -r1.74
  --- WrapXS.pm 17 May 2004 22:53:33 -0000      1.73
  +++ WrapXS.pm 28 May 2004 01:35:15 -0000      1.74
  @@ -250,6 +250,40 @@
   
   EOF
               }
  +            elsif ($access_mode eq 'rw_char_undef') {
  +                my $pool = $e->{pool} 
  +                    or die "rw_char_undef accessors need pool";
  +                $pool .= '(obj)';
  +# XXX: not sure where val=$default is coming from, but for now use
  +# hardcoded Nullsv
  +                $code = <<EOF;
  +$type
  +$name(obj, val_sv=Nullsv)
  +    $class obj
  +    SV *val_sv
  +
  +    PREINIT:
  +$attrs
  +
  +    CODE:
  +    RETVAL = ($cast) obj->$name;
  +
  +    if (val_sv) {
  +        if (SvOK(val_sv)) {
  +            STRLEN val_len;
  +            char *val = (char *)SvPV(val_sv, val_len);
  +            obj->$name = apr_pstrndup($pool, val, val_len);
  +        }
  +        else {
  +            obj->$name = NULL;
  +        }
  +    }
  +
  +    OUTPUT:
  +    RETVAL
  +
  +EOF
  +            }
   
               push @{ $self->{XS}->{ $struct->{module} } }, {
                  code  => $code,
  
  
  

Reply via email to