r25166: Simplify can_contain_deferred and add tests for it.
authorJelmer Vernooij <jelmer@samba.org>
Fri, 14 Sep 2007 18:06:51 +0000 (18:06 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 20:06:45 +0000 (15:06 -0500)
(This used to be commit 1afc7dd4d33f05d58121defed88faf8fcee3df8f)

source4/pidl/lib/Parse/Pidl/NDR.pm
source4/pidl/tests/ndr.pl

index 0ec4e6523b86a24f32bd1032b53aa7e7d3365495..033217c8bfb8f8e188629e82bd441f331be9e400 100644 (file)
@@ -35,7 +35,7 @@ use vars qw($VERSION);
 $VERSION = '0.01';
 @ISA = qw(Exporter);
 @EXPORT = qw(GetPrevLevel GetNextLevel ContainsDeferred ContainsString);
-@EXPORT_OK = qw(GetElementLevelTable ParseElement ValidElement align_type mapToScalar ParseType);
+@EXPORT_OK = qw(GetElementLevelTable ParseElement ValidElement align_type mapToScalar ParseType can_contain_deferred);
 
 use strict;
 use Parse::Pidl qw(warning fatal);
@@ -264,7 +264,7 @@ sub GetElementLevelTable($)
                TYPE => "DATA",
                DATA_TYPE => $e->{TYPE},
                IS_DEFERRED => $is_deferred,
-               CONTAINS_DEFERRED => can_contain_deferred($e),
+               CONTAINS_DEFERRED => can_contain_deferred($e->{TYPE}),
                IS_SURROUNDING => 0 #FIXME
        });
 
@@ -279,29 +279,25 @@ sub GetElementLevelTable($)
 sub can_contain_deferred($)
 {
        sub can_contain_deferred($);
-       my $e = shift;
+       my ($type) = @_;
+
+       return 1 unless (hasType($type)); # assume the worst
 
-       return 0 if (Parse::Pidl::Typelist::is_scalar($e->{TYPE}));
-       return 1 unless (hasType($e->{TYPE})); # assume the worst
+       $type = getType($type);
 
-       my $type = getType($e->{TYPE});
+       return 0 if (Parse::Pidl::Typelist::is_scalar($type));
 
        return 1 if ($type->{TYPE} eq "DECLARE"); # assume the worst
 
        if ($type->{TYPE} eq "TYPEDEF") {
-               return 0 unless defined($type->{DATA}->{ELEMENTS});
+               return can_contain_deferred($type->{DATA});
+       } 
 
-               foreach my $x (@{$type->{DATA}->{ELEMENTS}}) {
-                       return 1 if ($x->{POINTERS});
-                       return 1 if (can_contain_deferred ($x));
-               }
-       } else {
-               return 0 unless defined($type->{ELEMENTS});
+       return 0 unless defined($type->{ELEMENTS});
 
-               foreach my $x (@{$type->{ELEMENTS}}) {
-                       return 1 if ($x->{POINTERS});
-                       return 1 if (can_contain_deferred ($x));
-               }
+       foreach my $x (@{$type->{ELEMENTS}}) {
+               return 1 if ($x->{POINTERS});
+               return 1 if (can_contain_deferred ($x));
        }
        
        return 0;
index 043d2b9905caa9597248c050985d263725a1f31f..6e91ad2a6ab071f325db660c8690e0546c8b5b7f 100755 (executable)
@@ -4,12 +4,12 @@
 use strict;
 use warnings;
 
-use Test::More tests => 27;
+use Test::More tests => 33;
 use FindBin qw($RealBin);
 use lib "$RealBin";
 use Util;
 use Parse::Pidl::Util qw(MyDumper);
-use Parse::Pidl::NDR qw(GetElementLevelTable ParseElement align_type mapToScalar ParseType);
+use Parse::Pidl::NDR qw(GetElementLevelTable ParseElement align_type mapToScalar ParseType can_contain_deferred);
 
 # Case 1
 
@@ -253,3 +253,16 @@ $t = {
        }
 };
 is_deeply(ParseType($t->{ORIGINAL}, "ref"), $t); 
+
+ok(not can_contain_deferred("uint32"));
+ok(can_contain_deferred("some_unknown_type"));
+ok(can_contain_deferred({ TYPE => "STRUCT", 
+               ELEMENTS => [ { TYPE => "uint32", POINTERS => 40 } ]}));
+ok(can_contain_deferred({ TYPE => "TYPEDEF", 
+                       DATA => { TYPE => "STRUCT", 
+               ELEMENTS => [ { TYPE => "uint32", POINTERS => 40 } ]}}));
+ok(not can_contain_deferred({ TYPE => "STRUCT", 
+               ELEMENTS => [ { TYPE => "uint32" } ]}));
+ok(not can_contain_deferred({ TYPE => "TYPEDEF",
+                       DATA => { TYPE => "STRUCT", 
+               ELEMENTS => [ { TYPE => "uint32" } ]}}));