File Coverage

blib/lib/CORBA/C/LengthVisitor.pm
Criterion Covered Total %
statement 6 156 3.8
branch 0 34 0.0
condition 0 111 0.0
subroutine 2 37 5.4
pod 0 33 0.0
total 8 371 2.1


line stmt bran cond sub pod time code
1            
2             #
3             # Interface Definition Language (OMG IDL CORBA v3.0)
4             #
5             # C Language Mapping Specification, New Edition June 1999
6             #
7            
8             package CORBA::C::LengthVisitor;
9            
10 1     1   5 use strict;
  1         1  
  1         31  
11 1     1   4 use warnings;
  1         1  
  1         1761  
12            
13             our $VERSION = '2.60';
14            
15             # builds $node->{length}
16            
17             sub new {
18 0     0 0   my $proto = shift;
19 0   0       my $class = ref($proto) || $proto;
20 0           my $self = {};
21 0           bless $self, $class;
22 0           my ($parser) = @_;
23 0           $self->{srcname} = $parser->YYData->{srcname};
24 0           $self->{symbtab} = $parser->YYData->{symbtab};
25 0           $self->{done_hash} = {};
26 0           $self->{key} = 'c_name';
27 0           return $self;
28             }
29            
30             sub _get_defn {
31 0     0     my $self = shift;
32 0           my ($defn) = @_;
33 0 0         if (ref $defn) {
34 0           return $defn;
35             }
36             else {
37 0           return $self->{symbtab}->Lookup($defn);
38             }
39             }
40            
41             # See 1.8 Mapping Considerations for Constructed Types
42             #
43            
44             sub _get_length {
45 0     0     my $self = shift;
46 0           my ($type) = @_;
47 0 0 0       if ( $type->isa('AnyType')
      0        
      0        
      0        
48             or $type->isa('SequenceType')
49             or $type->isa('StringType')
50             or $type->isa('WideStringType')
51             or $type->isa('ObjectType') ) {
52 0           return 'variable';
53             }
54 0 0 0       if ( $type->isa('StructType')
      0        
55             or $type->isa('UnionType')
56             or $type->isa('TypeDeclarator') ) {
57 0           return $type->{length};
58             }
59 0           return undef;
60             }
61            
62             #
63             # 3.5 OMG IDL Specification
64             #
65            
66             sub visitSpecification {
67 0     0 0   my $self = shift;
68 0           my ($node) = @_;
69 0 0         if (exists $node->{list_import}) {
70 0           foreach (@{$node->{list_import}}) {
  0            
71 0           $_->visit($self);
72             }
73             }
74 0           foreach (@{$node->{list_export}}) {
  0            
75 0           $self->{symbtab}->Lookup($_)->visit($self);
76             }
77             }
78            
79             #
80             # 3.6 Import Declaration
81             #
82            
83             sub visitImport {
84 0     0 0   my $self = shift;
85 0           my ($node) = @_;
86 0           foreach (@{$node->{list_decl}}) {
  0            
87 0           $self->{symbtab}->Lookup($_)->visit($self);
88             }
89             }
90            
91             #
92             # 3.7 Module Declaration
93             #
94            
95             sub visitModules {
96 0     0 0   my $self = shift;
97 0           my ($node) = @_;
98 0           foreach (@{$node->{list_export}}) {
  0            
99 0           $self->{symbtab}->Lookup($_)->visit($self);
100             }
101             }
102            
103             #
104             # 3.8 Interface Declaration
105             #
106            
107             sub visitBaseInterface {
108 0     0 0   my $self = shift;
109 0           my ($node) = @_;
110 0 0         return if (exists $node->{length});
111             # $node->{length} = 'variable';
112             # TODO : $self->{done}->{} ???
113 0           $node->{length} = q{}; # void* = CORBA_unsigned_long
114 0           foreach (@{$node->{list_export}}) {
  0            
115 0           $self->{symbtab}->Lookup($_)->visit($self);
116             }
117             }
118            
119             sub visitForwardBaseInterface {
120 0     0 0   my $self = shift;
121 0           my ($node) = @_;
122 0 0         return if (exists $node->{length});
123             # $node->{length} = 'variable';
124 0           $node->{length} = q{}; # void* = CORBA_unsigned_long
125             }
126            
127             #
128             # 3.9 Value Declaration
129             #
130            
131             sub visitStateMember {
132             # C mapping is aligned with CORBA 2.1
133 0     0 0   my $self = shift;
134 0           my ($node) = @_;
135 0           $self->_get_defn($node->{type})->visit($self);
136             }
137            
138             sub visitInitializer {
139             # C mapping is aligned with CORBA 2.1
140 0     0 0   my $self = shift;
141 0           my ($node) = @_;
142 0           foreach (@{$node->{list_param}}) {
  0            
143 0           $self->_get_defn($_->{type})->visit($self);
144             }
145             }
146            
147             #
148             # 3.10 Constant Declaration
149             #
150            
151 0     0 0   sub visitConstant {
152             }
153            
154             #
155             # 3.11 Type Declaration
156             #
157            
158             sub visitTypeDeclarator {
159 0     0 0   my $self = shift;
160 0           my ($node) = @_;
161 0           my $type = $self->_get_defn($node->{type});
162 0 0 0       if ( $type->isa('TypeDeclarator')
      0        
      0        
      0        
      0        
163             or $type->isa('StructType')
164             or $type->isa('UnionType')
165             or $type->isa('EnumType')
166             or $type->isa('SequenceType')
167             or $type->isa('FixedPtType') ) {
168 0           $type->visit($self);
169             }
170 0           $node->{length} = $self->_get_length($type);
171             }
172            
173 0     0 0   sub visitNativeType {
174             # C mapping is aligned with CORBA 2.1
175             }
176            
177             #
178             # 3.11.1 Basic Types
179             #
180            
181 0     0 0   sub visitBasicType {
182             # fixed length
183             }
184            
185             #
186             # 3.11.2 Constructed Types
187             #
188             # 3.11.2.1 Structures
189             #
190            
191             sub visitStructType {
192 0     0 0   my $self = shift;
193 0           my ($node) = @_;
194 0 0         return if (exists $self->{done_hash}->{$node->{$self->{key}}});
195 0           $self->{done_hash}->{$node->{$self->{key}}} = 1;
196 0           $node->{length} = undef;
197 0           foreach (@{$node->{list_expr}}) {
  0            
198 0           my $type = $self->_get_defn($_->{type});
199 0 0 0       if ( $type->isa('TypeDeclarator')
      0        
      0        
      0        
      0        
      0        
200             or $type->isa('StructType')
201             or $type->isa('UnionType')
202             or $type->isa('SequenceType')
203             or $type->isa('StringType')
204             or $type->isa('WideStringType')
205             or $type->isa('FixedPtType') ) {
206 0           $type->visit($self);
207             }
208 0   0       $node->{length} ||= $self->_get_length($type);
209             }
210             }
211            
212             # 3.11.2.2 Discriminated Unions
213             #
214            
215             sub visitUnionType {
216 0     0 0   my $self = shift;
217 0           my ($node) = @_;
218 0 0         return if (exists $self->{done_hash}->{$node->{$self->{key}}});
219 0           $self->{done_hash}->{$node->{$self->{key}}} = 1;
220 0           $node->{length} = undef;
221 0           foreach (@{$node->{list_expr}}) {
  0            
222 0           my $type = $self->_get_defn($_->{element}->{type});
223 0 0 0       if ( $type->isa('TypeDeclarator')
      0        
      0        
      0        
      0        
      0        
224             or $type->isa('StructType')
225             or $type->isa('UnionType')
226             or $type->isa('SequenceType')
227             or $type->isa('StringType')
228             or $type->isa('WideStringType')
229             or $type->isa('FixedPtType') ) {
230 0           $type->visit($self);
231             }
232 0   0       $node->{length} ||= $self->_get_length($type);
233             }
234 0           my $type = $self->_get_defn($node->{type});
235 0 0         if ($type->isa('EnumType')) {
236 0           $type->visit($self);
237             }
238             }
239            
240             # 3.11.2.4 Enumerations
241             #
242            
243 0     0 0   sub visitEnumType {
244             # fixed length
245             }
246            
247             #
248             # 3.11.3 Template Types
249             #
250            
251             sub visitSequenceType {
252 0     0 0   my $self = shift;
253 0           my ($node) = @_;
254 0           $node->{length} = 'variable';
255 0           my $type = $self->_get_defn($node->{type});
256 0 0 0       if ( $type->isa('TypeDeclarator')
      0        
      0        
      0        
      0        
      0        
257             or $type->isa('StructType')
258             or $type->isa('UnionType')
259             or $type->isa('SequenceType')
260             or $type->isa('StringType')
261             or $type->isa('WideStringType')
262             or $type->isa('FixedPtType') ) {
263 0           $type->visit($self);
264             }
265             }
266            
267             sub visitStringType {
268 0     0 0   my $self = shift;
269 0           my ($node) = @_;
270 0           $node->{length} = 'variable';
271             }
272            
273             sub visitWideStringType {
274 0     0 0   my $self = shift;
275 0           my ($node) = @_;
276 0           $node->{length} = 'variable';
277             }
278            
279 0     0 0   sub visitFixedPtType {
280             # fixed length
281             }
282            
283 0     0 0   sub visitFixedPtConstType {
284             # fixed length
285             }
286            
287             #
288             # 3.12 Exception Declaration
289             #
290            
291             sub visitException {
292 0     0 0   my $self = shift;
293 0           my ($node) = @_;
294 0           $node->{length} = undef;
295 0 0         if (exists $node->{list_expr}) {
296 0           warn __PACKAGE__,"::visitException $node->{idf} : empty list_expr.\n"
297 0 0         unless (@{$node->{list_expr}});
298 0           foreach (@{$node->{list_expr}}) {
  0            
299 0           my $type = $self->_get_defn($_->{type});
300 0 0 0       if ( $type->isa('TypeDeclarator')
      0        
      0        
      0        
301             or $type->isa('StructType')
302             or $type->isa('UnionType')
303             or $type->isa('SequenceType')
304             or $type->isa('FixedPtType') ) {
305 0           $type->visit($self);
306             }
307 0   0       $node->{length} ||= $self->_get_length($type);
308             }
309             }
310             }
311            
312             #
313             # 3.13 Operation Declaration
314             #
315            
316             sub visitOperation {
317 0     0 0   my $self = shift;
318 0           my ($node) = @_;
319 0           my $type = $self->_get_defn($node->{type});
320 0           $type->visit($self);
321 0           foreach (@{$node->{list_param}}) {
  0            
322 0           $self->_get_defn($_->{type})->visit($self);
323             }
324             }
325            
326 0     0 0   sub visitVoidType {
327             # empty
328             }
329            
330             #
331             # 3.14 Attribute Declaration
332             #
333            
334             sub visitAttribute {
335 0     0 0   my $self = shift;
336 0           my ($node) = @_;
337 0           $node->{_get}->visit($self);
338 0 0         $node->{_set}->visit($self) if (exists $node->{_set});
339             }
340            
341             #
342             # 3.15 Repository Identity Related Declarations
343             #
344            
345 0     0 0   sub visitTypeId {
346             # empty
347             }
348            
349 0     0 0   sub visitTypePrefix {
350             # empty
351             }
352            
353             #
354             # 3.16 Event Declaration
355             #
356            
357             #
358             # 3.17 Component Declaration
359             #
360            
361 0     0 0   sub visitProvides {
362             # empty
363             }
364            
365 0     0 0   sub visitUses {
366             # empty
367             }
368            
369 0     0 0   sub visitPublishes {
370             # empty
371             }
372            
373 0     0 0   sub visitEmits {
374             # empty
375             }
376            
377 0     0 0   sub visitConsumes {
378             # empty
379             }
380            
381             #
382             # 3.18 Home Declaration
383             #
384            
385             sub visitFactory {
386             # C mapping is aligned with CORBA 2.1
387 0     0 0   my $self = shift;
388 0           my ($node) = @_;
389 0           foreach (@{$node->{list_param}}) {
  0            
390 0           $self->_get_defn($_->{type})->visit($self);
391             }
392             }
393            
394             sub visitFinder {
395             # C mapping is aligned with CORBA 2.1
396 0     0 0   my $self = shift;
397 0           my ($node) = @_;
398 0           foreach (@{$node->{list_param}}) {
  0            
399 0           $self->_get_defn($_->{type})->visit($self);
400             }
401             }
402            
403             1;
404