File Coverage

blib/lib/Ref/Store/Attribute.pm
Criterion Covered Total %
statement 51 138 36.9
branch 0 18 0.0
condition n/a
subroutine 17 36 47.2
pod 0 11 0.0
total 68 203 33.5


line stmt bran cond sub pod time code
1             package Ref::Store::Attribute;
2 1     1   6 use strict;
  1         2  
  1         32  
3 1     1   5 use warnings;
  1         1  
  1         27  
4 1     1   5 use Scalar::Util qw(weaken isweak);
  1         2  
  1         46  
5 1     1   5 use Ref::Store::Common;
  1         2  
  1         162  
6 1     1   6 use Data::Dumper;
  1         2  
  1         46  
7 1     1   6 use Log::Fu;
  1         2  
  1         8  
8              
9              
10             sub new {
11 0     0 0   my ($cls,$scalar,$ref,$table) = @_;
12 0           my $self = [];
13 0           $#{$self} = HR_KFLD_ATTRHASH;
  0            
14            
15 0           bless $self, $cls;
16            
17 0           @{$self}[HR_KFLD_STRSCALAR, HR_KFLD_REFSCALAR,
  0            
18             HR_KFLD_TABLEREF, HR_KFLD_ATTRHASH] =
19             ($scalar, $ref, $table, {});
20            
21 0           return $self;
22             }
23              
24             sub link_value {
25 0     0 0   my ($self,$value) = @_;
26            
27 0           $self->[HR_KFLD_TABLEREF]->dref_add_ptr(
28             $value,
29             $self->[HR_KFLD_ATTRHASH],
30             $value + 0
31             );
32             }
33              
34             sub unlink_value {
35 0     0 0   my ($self,$value) = @_;
36            
37 0           $self->[HR_KFLD_TABLEREF]->dref_del_ptr(
38             $value,
39             $self->[HR_KFLD_ATTRHASH],
40             $value + 0
41             );
42            
43 0           delete $self->[HR_KFLD_ATTRHASH]->{$value+0};
44             }
45              
46 0     0 0   sub weaken_encapsulated {
47             }
48              
49             sub store_weak {
50 0     0 0   my ($self,$k,$v) = @_;
51 0           weaken($self->[HR_KFLD_ATTRHASH]->{$k} = $v);
52             }
53              
54             sub store_strong {
55 0     0 0   my ($self,$k,$v) = @_;
56 0           $self->[HR_KFLD_ATTRHASH]->{$k} = $v;
57             }
58              
59             sub get_hash {
60 0     0 0   $_[0]->[HR_KFLD_ATTRHASH];
61             }
62              
63             sub kstring {
64 0     0 0   my $self = shift;
65 0           $self->[HR_KFLD_STRSCALAR];
66             }
67              
68             sub dump {
69 0     0 0   my ($self,$hrd) = @_;
70 0           my $h = $self->[HR_KFLD_ATTRHASH];
71 0           foreach my $v (values %$h) {
72 0           $hrd->iprint("V: %s", $hrd->fmt_ptr($v));
73             }
74             }
75              
76 1     1   1017 use Ref::Store::ThreadUtil;
  1         2  
  1         504  
77 0     0 0   sub ithread_predup { }
78             sub ithread_postdup {
79 0     0 0   my ($self,$newtable,$ptr_map,$old_taddr) = @_;
80 0           my $attrhash = $self->[HR_KFLD_ATTRHASH];
81 0           my @old_keys = keys %$attrhash;
82 0           foreach my $vaddr (@old_keys) {
83 0           my $new_v = $ptr_map->{$vaddr};
84 0           $newtable->dref_del_ptr($new_v, $attrhash, $vaddr);
85 0           $newtable->dref_add_str($new_v, $attrhash, $new_v + 0);
86 0           my $was_weak = isweak($attrhash->{$vaddr});
87 0           $attrhash->{$new_v+0} = $new_v;
88 0 0         if($was_weak) {
89 0           weaken($attrhash->{$new_v+0});
90             }
91 0           delete $attrhash->{$vaddr};
92             }
93             }
94              
95             sub DESTROY {
96 0     0     my $self = shift;
97 0           my $attrhash = $self->[HR_KFLD_ATTRHASH];
98 0           my $table = $self->[HR_KFLD_TABLEREF];
99 0 0         return unless $table;
100             #log_err("Will iterate over contained values..");
101 0           foreach my $v (values %$attrhash) {
102 0 0         next unless defined $v;
103 0           $table->dref_del_ptr($v, $attrhash, $v+0);
104            
105 0           my $vhash = $table->reverse->{$v+0};
106 0           my $vaddr = $v+0;
107 0 0         next unless defined $vhash;
108 0           delete $vhash->{$self+0};
109            
110 0 0         if(! %$vhash) {
111 0           delete $table->reverse->{$vaddr};
112 0 0         if(defined $v) {
113 0           $table->dref_del_ptr($v, $table->reverse, $vaddr);
114             }
115             }
116             }
117            
118 0           delete $table->attr_lookup->{ $self->[HR_KFLD_STRSCALAR] };
119             }
120              
121             package Ref::Store::Attribute::Encapsulating;
122 1     1   7 use strict;
  1         2  
  1         30  
123 1     1   5 use warnings;
  1         1  
  1         41  
124 1     1   5 use base qw(Ref::Store::Attribute);
  1         3  
  1         205  
125 1     1   7 use Scalar::Util qw(weaken);
  1         2  
  1         1147  
126 1     1   8 use Ref::Store::Common;
  1         3  
  1         216  
127 1     1   7 use Log::Fu;
  1         2  
  1         9  
128 1     1   53 use Ref::Store::ThreadUtil;
  1         2  
  1         85  
129 1     1   6 use Data::Dumper;
  1         2  
  1         47  
130 1     1   1092 use Devel::GlobalDestruction;
  1         2574  
  1         7  
131              
132              
133             sub new {
134 0     0     my ($cls,$astr,$encapsulated,$table) = @_;
135 0           my $self = $cls->SUPER::new($astr, $encapsulated, $table);
136 0           $table->dref_add($encapsulated, \&_encap_destroy_hook, $self);
137 0           return $self;
138             }
139              
140              
141             sub weaken_encapsulated {
142 0     0     my $self = shift;
143 0           weaken($self->[HR_KFLD_REFSCALAR]);
144             }
145              
146             sub dump {
147 0     0     my ($self,$hrd) = @_;
148 0           $hrd->iprint("ENCAP: %s", $self->[HR_KFLD_REFSCALAR]);
149 0           $self->SUPER::dump($hrd);
150             }
151              
152             sub ithread_predup {
153 0     0     my ($self,$table,$ptr_map) = @_;
154 0           hr_thrutil_store_kinfo(HR_THR_AENCAP_PREFIX, $self->[HR_KFLD_STRSCALAR],
155             $ptr_map, [ $self->[HR_KFLD_REFSCALAR]+0, $self + 0 ] );
156             }
157              
158             sub ithread_postdup {
159 0     0     my ($self,$table,$ptr_map,$old_taddr) = @_;
160 0           my $old = hr_thrutil_get_kinfo(HR_THR_AENCAP_PREFIX,
161             $self->[HR_KFLD_STRSCALAR], $ptr_map);
162 0           my ($old_encap_addr,$old_self_addr) = @$old;
163              
164 0           my $new_encap_addr = $self->[HR_KFLD_REFSCALAR]+0;
165              
166 0           $self->[HR_KFLD_STRSCALAR] =~ s/\Q$old_encap_addr\E/$new_encap_addr/gi;
167              
168 0           $table->dref_del_ptr($self->[HR_KFLD_REFSCALAR],
169             $table->attr_lookup, $self->[HR_KFLD_STRSCALAR]);
170              
171 0           my $attrhash = $self->[HR_KFLD_ATTRHASH];
172 0           foreach my $v (values %$attrhash) {
173 0           my $vhash = $table->reverse->{$v+0};
174 0           $table->dref_del_ptr($self->[HR_KFLD_REFSCALAR],
175             $vhash, $old_self_addr);
176 0           $table->dref_add_str($self->[HR_KFLD_REFSCALAR],
177             $vhash, $self + 0);
178             }
179 0           $self->SUPER::ithread_postdup($table,$ptr_map,$old_taddr);
180             }
181              
182 1     1   681 use Carp qw(cluck);
  1         2  
  1         220  
183             sub _encap_destroy_hook {
184 0     0     my ($encapped, $attr) = @_;
185 0 0         return if in_global_destruction;
186 0           $attr->DESTROY();
187             }
188              
189             sub DESTROY {
190 0     0     my $self = shift;
191 0 0         return if in_global_destruction;
192 0           $self->SUPER::DESTROY();
193 0           my $table = $self->[HR_KFLD_TABLEREF];
194            
195 0 0         if($self->[HR_KFLD_REFSCALAR]) {
196 0           $table->dref_del_ptr(
197             $self->[HR_KFLD_REFSCALAR],
198             \&_encap_destroy_hook,
199             $self
200             );
201 0           $self->[HR_KFLD_REFSCALAR] = undef;
202             }
203             }
204             1;