File Coverage

blib/lib/Safe/World/select.pm
Criterion Covered Total %
statement 39 86 45.3
branch 6 40 15.0
condition 1 3 33.3
subroutine 6 10 60.0
pod 0 5 0.0
total 52 144 36.1


line stmt bran cond sub pod time code
1             #############################################################################
2             ## Name: select.pm
3             ## Purpose: Safe::World::select
4             ## Author: Graciliano M. P.
5             ## Modified by:
6             ## Created: 08/09/2003
7             ## RCS-ID:
8             ## Copyright: (c) 2003 Graciliano M. P.
9             ## Licence: This program is free software; you can redistribute it and/or
10             ## modify it under the same terms as Perl itself
11             #############################################################################
12            
13             package Safe::World::select ;
14            
15 1     1   5 use strict qw(vars);
  1         2  
  1         35  
16            
17 1     1   6 use vars qw($VERSION @ISA) ;
  1         2  
  1         61  
18             $VERSION = '0.02' ;
19            
20 1     1   5 no warnings ;
  1         4  
  1         34  
21            
22             ##########
23             # SCOPES #
24             ##########
25            
26 1     1   6 use Safe::World::Scope ;
  1         1  
  1         54  
27            
28             my $SCOPE_Safe_World = new Safe::World::Scope('Safe::World',undef,1) ;
29            
30 1     1   5 use vars qw($Safe_World_NOW $Safe_World_EVALX) ;
  1         2  
  1         1411  
31            
32             *Safe_World_NOW = \$Safe::World::NOW ;
33             *Safe_World_EVALX = \$Safe::World::EVALX ;
34            
35             #######
36             # NEW #
37             #######
38            
39             sub new {
40            
41             ## my @call = caller(4) ; print main::STDOUT "SELECT NEW>> $_[1] [$Safe_World_NOW][$Safe_World_NOW->{SELECT}] @call\n" ;
42 1 50   1 0 7 return undef if $_[1]->{DESTROIED} ;
43            
44 1         4 my $eval_err = $@ ;
45            
46 1         4 my $this = bless({} , __PACKAGE__) ;
47            
48 1         9 $this->{PREVWORLD} = $Safe_World_NOW ;
49 1         4 $Safe_World_NOW = $this->{WORLD} = $_[1] ;
50            
51 1 50       6 $this->{WORLD}->{SELECT} = {} if !$this->{WORLD}->{SELECT} ;
52 1 50       21 $this->{WORLD}->{SHARING} = {} if !$this->{WORLD}->{SHARING} ;
53            
54 1         10 my $prevstdout = &Safe::World::SELECT( "$this->{WORLD}->{ROOT}\::STDOUT" ) ;
55 1         2 $this->{WORLD}->{SELECT}{PREVSTDOUT} = $this->{PREVSTDOUT} = [$prevstdout , \*{$prevstdout}] ;
  1         97  
56            
57 1         7 $this->{WORLD}->{SELECT}{PREVSTDERR} = $this->{PREVSTDERR} = *main::STDERR{IO} ;
58 1         5 $this->{WORLD}->{SELECT}{PREVSUBWARN} = $this->{PREVSUBWARN} = $SIG{__WARN__} ;
59 1         5 $this->{WORLD}->{SELECT}{PREVSUBDIE} = $this->{PREVSUBDIE} = $SIG{__DIE__} ;
60            
61 1         8 open (STDERR,">&$this->{WORLD}->{ROOT}::STDERR") ;
62 1         6 $SIG{__WARN__} = \&print_stderr ;
63 1         5 $SIG{__DIE__} = \&handle_die ;
64            
65 1         2 foreach my $var ( keys %{ $this->{WORLD}->{SHARING} } ) {
  1         6  
66 0         0 $this->{WORLD}->{SHARING}{$var}{OUT} = &out_get_ref_copy($var) ;
67 0 0       0 if ( $this->{WORLD}->{SHARING}{$var}{IN} ) {
68 0         0 &out_set($var , $this->{WORLD}->{SHARING}{$var}{IN}) ;
69 0         0 $this->{WORLD}->{SHARING}{$var}{IN} = undef ;
70             }
71             }
72            
73 1 50 33     7 if ( $this->{WORLD}->{TIESTDOUT} && $this->{WORLD}->{TIESTDOUT}->{AUTO_FLUSH} ) { $| = 1 ;}
  0         0  
74            
75 1 50       13 $this->{WORLD}->set('$SAFEWORLD', $this->{WORLD} , 1 ) if !$this->{WORLD}->{NO_SET_SAFEWORLD} ;
76            
77 1 50       13 if ( $this->{WORLD}->{ONSELECT} ) {
78 0         0 my $sub = $this->{WORLD}->{ONSELECT} ;
79 0         0 &$sub($this->{WORLD}) ;
80             }
81            
82 1         6 $SCOPE_Safe_World->call('sync_evalx') ; ## Safe::World::sync_evalx() ;
83            
84 1         2 $@ = $eval_err ;
85            
86 1         6 return $this ;
87             }
88            
89             ###########
90             # DESTROY #
91             ###########
92            
93             sub DESTROY {
94             my $this = shift ;
95            
96             ##print main::STDOUT "SELECT DESTROY>> $this\n" ;
97            
98             my $eval_err = $@ ;
99            
100             %{$this->{WORLD}->{SELECT}} = () ;
101            
102             $this->{WORLD}->set('$SAFEWORLD', \undef) if !$this->{WORLD}->{NO_SET_SAFEWORLD} ;
103            
104             if ( $this->{WORLD}->{ONUNSELECT} ) {
105             my $sub = $this->{WORLD}->{ONUNSELECT} ;
106             &$sub($this->{WORLD}) ;
107             }
108            
109             *main::STDERR = $this->{PREVSTDERR} ;
110             $SIG{__WARN__} = $this->{PREVSUBWARN} ;
111             $SIG{__DIE__} = $this->{PREVSUBDIE} ;
112            
113             foreach my $var ( keys %{ $this->{WORLD}->{SHARING} } ) {
114             $this->{WORLD}->{SHARING}{$var}{IN} = &out_get_ref_copy($var) ;
115             if ( $this->{WORLD}->{SHARING}{$var}{OUT} ) {
116             &out_set($var , $this->{WORLD}->{SHARING}{$var}{OUT}) ;
117             $this->{WORLD}->{SHARING}{$var}{OUT} = undef ;
118             }
119             }
120            
121             &Safe::World::SELECT($this->{PREVSTDOUT}) ;
122            
123             $Safe_World_NOW = (ref($this->{PREVWORLD}) eq 'Safe::World') ? $this->{PREVWORLD} : undef ;
124            
125             $SCOPE_Safe_World->call('sync_evalx') ; ## Safe::World::sync_evalx() ;
126            
127             $@ = $eval_err ;
128            
129             return ;
130             }
131            
132             ####################
133             # OUT_GET_REF_COPY #
134             ####################
135            
136             sub out_get_ref_copy {
137 0     0 0   my ( $varfull ) = @_ ;
138            
139 0           my ($var_tp,$var) = ( $varfull =~ /([\$\@\%\*])(\S+)/ ) ;
140 0           $var =~ s/^{'(\S+)'}$/$1/ ;
141 0           $var =~ s/^main::// ;
142            
143 0 0         if ($var_tp eq '$') { return ${'main::'.$var} ;}
  0 0          
  0 0          
    0          
144 0           elsif ($var_tp eq '@') { return [@{'main::'.$var}] ;}
  0            
145 0           elsif ($var_tp eq '%') { return {%{'main::'.$var}} ;}
  0            
146 0           elsif ($var_tp eq '*') { return \*{'main::'.$var} ;}
  0            
147 0           else { ++$Safe_World_EVALX ; return eval("package main ; \\$varfull") ;}
  0            
148             }
149            
150             ###########
151             # OUT_SET #
152             ###########
153            
154             sub out_set {
155 0     0 0   my ( $var , $val ) = @_ ;
156            
157 0           my ($var_tp,$name) = ( $var =~ /([\$\@\%\*])(\S+)/ );
158 0           $name =~ s/^{'(\S+)'}$/$1/ ;
159 0           $name =~ s/^main::// ;
160            
161 0 0         if ($var_tp eq '$') { ${'main::'.$name} = $val ;}
  0 0          
  0 0          
    0          
162 0           elsif ($var_tp eq '@') { @{'main::'.$name} = @{$val} ;}
  0            
  0            
163 0           elsif ($var_tp eq '%') { %{'main::'.$name} = %{$val} ;}
  0            
  0            
164 0           elsif ($var_tp eq '*') { *{'main::'.$name} = $val ;}
  0            
165 0           else { ++$Safe_World_EVALX ; eval("$var = \$val ;") ;}
  0            
166             }
167            
168             ################
169             # PRINT_STDERR #
170             ################
171            
172             sub print_stderr {
173 0     0 0   $Safe_World_NOW->print_stderr(@_) ; return ;
  0            
174             }
175            
176             ##############
177             # HANDLE_DIE #
178             ##############
179            
180             sub handle_die {
181 0 0   0 0   my $core_exit = ($_[0] =~ /#CORE::GLOBAL::exit#/) ? 1 : undef ;
182            
183 0 0         $Safe_World_NOW->{EXIT} = 1 if $core_exit ;
184 0 0         $Safe_World_NOW->print_stderr(@_) if !$core_exit ;
185 0 0         $Safe_World_NOW->close if $core_exit ;
186            
187 0 0         $@ = undef if $core_exit ;
188            
189 0           return ;
190             }
191            
192             #######
193             # END #
194             #######
195            
196             1;
197