diff options
| -rw-r--r-- | source4/pidl/lib/Parse/Pidl/NDR.pm | 30 | ||||
| -rwxr-xr-x | source4/pidl/tests/ndr.pl | 17 | 
2 files changed, 28 insertions, 19 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/NDR.pm b/source4/pidl/lib/Parse/Pidl/NDR.pm index 0ec4e6523b..033217c8bf 100644 --- a/source4/pidl/lib/Parse/Pidl/NDR.pm +++ b/source4/pidl/lib/Parse/Pidl/NDR.pm @@ -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; diff --git a/source4/pidl/tests/ndr.pl b/source4/pidl/tests/ndr.pl index 043d2b9905..6e91ad2a6a 100755 --- a/source4/pidl/tests/ndr.pl +++ b/source4/pidl/tests/ndr.pl @@ -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" } ]}}));  | 
