stas        2004/05/17 15:53:33

  Modified:    lib/ModPerl MapUtil.pm StructureMap.pm TypeMap.pm WrapXS.pm
  Log:
  add provision for making struct accessors readonly (with < marker in the
  map file)
  
  Revision  Changes    Path
  1.5       +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.4
  retrieving revision 1.5
  diff -u -u -r1.4 -r1.5
  --- MapUtil.pm        4 Mar 2004 06:01:06 -0000       1.4
  +++ MapUtil.pm        17 May 2004 22:53:33 -0000      1.5
  @@ -25,6 +25,7 @@
   
   our @ISA = qw(Exporter);
   
  +#    '<' => 'auto-generated but gives only a read-only access'
   my %disabled_map = (
       '!' => 'disabled or not yet implemented',
       '~' => 'implemented but not auto-generated',
  
  
  
  1.5       +10 -3     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.4
  retrieving revision 1.5
  diff -u -u -r1.4 -r1.5
  --- StructureMap.pm   4 Mar 2004 06:01:06 -0000       1.4
  +++ StructureMap.pm   17 May 2004 22:53:33 -0000      1.5
  @@ -117,11 +117,18 @@
           }
   
           if (s/^(\W)\s*// or $disabled) {
  -            $map->{$class}->{$_} = undef;
  -            push @{ $self->{disabled}->{ $1 || '!' } }, "$class.$_";
  +            # < denotes a read-only accessor
  +            if ($1 && $1 eq '<') {
  +                $map->{$class}->{$_} = 'ro';
  +            }
  +            else {
  +                $map->{$class}->{$_} = undef;
  +                push @{ $self->{disabled}->{ $1 || '!' } }, "$class.$_";
  +            }
  +
           }
           else {
  -            $map->{$class}->{$_} = 1;
  +            $map->{$class}->{$_} = 'rw';
           }
       }
   
  
  
  
  1.20      +11 -6     modperl-2.0/lib/ModPerl/TypeMap.pm
  
  Index: TypeMap.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/ModPerl/TypeMap.pm,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -u -r1.19 -r1.20
  --- TypeMap.pm        4 Mar 2004 06:01:06 -0000       1.19
  +++ TypeMap.pm        17 May 2004 22:53:33 -0000      1.20
  @@ -289,19 +289,24 @@
   
       return unless $class = $self->map_type($stype);
   
  +    use Apache::TestTrace;
  +
       for my $e (@{ $struct->{elts} }) {
           my($name, $type) = ($e->{name}, $e->{type});
           my $rtype;
   
  -        next unless $self->structure_map->{$stype}->{$name};
  +        # ro/rw/undef(disabled)
  +        my $access_mode = $self->structure_map->{$stype}->{$name};
  +        next unless $access_mode;
           next unless $rtype = $self->map_type($type);
   
           push @elts, {
  -           name    => $name,
  -           type    => $rtype,
  -           default => $self->null_type($type),
  -           pool    => $self->class_pool($class),
  -           class   => $self->{map}->{$type} || "",
  +           name        => $name,
  +           type        => $rtype,
  +           default     => $self->null_type($type),
  +           pool        => $self->class_pool($class),
  +           class       => $self->{map}->{$type} || "",
  +           access_mode => $access_mode,
           };
       }
   
  
  
  
  1.73      +23 -3     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.72
  retrieving revision 1.73
  diff -u -u -r1.72 -r1.73
  --- WrapXS.pm 14 May 2004 20:57:40 -0000      1.72
  +++ WrapXS.pm 17 May 2004 22:53:33 -0000      1.73
  @@ -195,8 +195,8 @@
           my $class = $struct->{class};
   
           for my $e (@{ $struct->{elts} }) {
  -            my($name, $default, $type) =
  -              @{$e}{qw(name default type)};
  +            my($name, $default, $type, $access_mode) =
  +              @{$e}{qw(name default type access_mode)};
   
               (my $cast = $type) =~ s/:/_/g;
               my $val = get_value($e);
  @@ -210,7 +210,25 @@
   
               my $attrs = $self->attrs($name);
   
  -            my $code = <<EOF;
  +            my $code;
  +            if ($access_mode eq 'ro') {
  +                $code = <<EOF;
  +$type
  +$name(obj)
  +    $class obj
  +
  +$attrs
  +
  +    CODE:
  +    RETVAL = ($cast) obj->$name;
  +
  +    OUTPUT:
  +    RETVAL
  +
  +EOF
  +            }
  +            elsif ($access_mode eq 'rw') {
  +                $code = <<EOF;
   $type
   $name(obj, val=$default)
       $class obj
  @@ -231,6 +249,8 @@
       RETVAL
   
   EOF
  +            }
  +
               push @{ $self->{XS}->{ $struct->{module} } }, {
                  code  => $code,
                  class => $class,
  
  
  

Reply via email to