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,