Rev 11541: Cope with anonymous nested types in the NDR layer. This doesn't handled in file:///home/jelmer/bzr.samba/SAMBA_4_0/

Jelmer Vernooij jelmer at samba.org
Mon Feb 19 22:07:44 GMT 2007


At file:///home/jelmer/bzr.samba/SAMBA_4_0/

------------------------------------------------------------
revno: 11541
revision-id: jelmer at samba.org-20070219220607-f2xy405hjsim9l4p
parent: svn-v2:21456 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: SAMBA_4_0
timestamp: Mon 2007-02-19 23:06:07 +0100
message:
  Cope with anonymous nested types in the NDR layer. This doesn't handled 
  named nested types yet, as these have to be registered.
modified:
  source/pidl/lib/Parse/Pidl/NDR.pm svn-v2:9460 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2flib%2fParse%2fPidl%2fNDR.pm
  source/pidl/tests/ndr.pl       svn-v2:20631 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2ftests%2fndr.pl
=== modified file 'source/pidl/lib/Parse/Pidl/NDR.pm'
--- a/source/pidl/lib/Parse/Pidl/NDR.pm	2007-02-18 16:21:28 +0000
+++ b/source/pidl/lib/Parse/Pidl/NDR.pm	2007-02-19 22:06:07 +0000
@@ -257,8 +257,6 @@
 
 	push (@$order, {
 		TYPE => "DATA",
-		CONVERT_TO => has_property($e, ""),
-		CONVERT_FROM => has_property($e, ""),
 		DATA_TYPE => $e->{TYPE},
 		IS_DEFERRED => $is_deferred,
 		CONTAINS_DEFERRED => can_contain_deferred($e),
@@ -360,12 +358,16 @@
 	die("Unknown data type type $dt->{TYPE}");
 }
 
-sub ParseElement($)
+sub ParseElement($$)
 {
-	my $e = shift;
+	my ($e, $pointer_default) = @_;
 
 	$e->{TYPE} = expandAlias($e->{TYPE});
 
+	if (ref($e->{TYPE}) eq "HASH") {
+		$e->{TYPE} = ParseType($e->{TYPE}, $pointer_default);
+	}
+
 	return {
 		NAME => $e->{NAME},
 		TYPE => $e->{TYPE},
@@ -379,14 +381,13 @@
 
 sub ParseStruct($$)
 {
-	my ($ndr,$struct) = @_;
+	my ($struct, $pointer_default) = @_;
 	my @elements = ();
 	my $surrounding = undef;
 
-
 	foreach my $x (@{$struct->{ELEMENTS}}) 
 	{
-		my $e = ParseElement($x);
+		my $e = ParseElement($x, $pointer_default);
 		if ($x != $struct->{ELEMENTS}[-1] and 
 			$e->{LEVELS}[0]->{IS_SURROUNDING}) {
 			fatal($x, "conformant member not at end of struct");
@@ -423,7 +424,7 @@
 
 sub ParseUnion($$)
 {
-	my ($ndr,$e) = @_;
+	my ($e, $pointer_default) = @_;
 	my @elements = ();
 	my $switch_type = has_property($e, "switch_type");
 	unless (defined($switch_type)) { $switch_type = "uint32"; }
@@ -437,7 +438,7 @@
 		if ($x->{TYPE} eq "EMPTY") {
 			$t = { TYPE => "EMPTY" };
 		} else {
-			$t = ParseElement($x);
+			$t = ParseElement($x, $pointer_default);
 		}
 		if (has_property($x, "default")) {
 			$t->{CASE} = "default";
@@ -463,7 +464,7 @@
 
 sub ParseEnum($$)
 {
-	my ($ndr,$e) = @_;
+	my ($e, $pointer_default) = @_;
 
 	return {
 		TYPE => "ENUM",
@@ -477,7 +478,7 @@
 
 sub ParseBitmap($$)
 {
-	my ($ndr,$e) = @_;
+	my ($e, $pointer_default) = @_;
 
 	return {
 		TYPE => "BITMAP",
@@ -491,10 +492,10 @@
 
 sub ParseType($$)
 {
-	my ($ndr, $d) = @_;
+	my ($d, $pointer_default) = @_;
 
 	if ($d->{TYPE} eq "STRUCT" or $d->{TYPE} eq "UNION") {
-		CheckPointerTypes($d, $ndr->{PROPERTIES}->{pointer_default});
+		CheckPointerTypes($d, $pointer_default);
 	}
 
 	my $data = {
@@ -503,20 +504,20 @@
 		ENUM => \&ParseEnum,
 		BITMAP => \&ParseBitmap,
 		TYPEDEF => \&ParseTypedef,
-	}->{$d->{TYPE}}->($ndr, $d);
+	}->{$d->{TYPE}}->($d, $pointer_default);
 
 	return $data;
 }
 
 sub ParseTypedef($$)
 {
-	my ($ndr,$d) = @_;
+	my ($d, $pointer_default) = @_;
 
 	if (defined($d->{DATA}->{PROPERTIES}) && !defined($d->{PROPERTIES})) {
 		$d->{PROPERTIES} = $d->{DATA}->{PROPERTIES};
 	}
 
-	my $data = ParseType($ndr, $d->{DATA});
+	my $data = ParseType($d->{DATA}, $pointer_default);
 	$data->{ALIGN} = align_type($d->{NAME});
 
 	return {
@@ -550,7 +551,7 @@
 	}
 
 	foreach my $x (@{$d->{ELEMENTS}}) {
-		my $e = ParseElement($x);
+		my $e = ParseElement($x, $ndr->{PROPERTIES}->{pointer_default});
 		push (@{$e->{DIRECTION}}, "in") if (has_property($x, "in"));
 		push (@{$e->{DIRECTION}}, "out") if (has_property($x, "out"));
 
@@ -618,7 +619,7 @@
 		} elsif ($d->{TYPE} eq "CONST") {
 			push (@consts, ParseConst($idl, $d));
 		} else {
-			push (@types, ParseType($idl, $d));
+			push (@types, ParseType($d, $idl->{PROPERTIES}->{pointer_default}));
 		}
 	}
 

=== modified file 'source/pidl/tests/ndr.pl'
--- a/source/pidl/tests/ndr.pl	2007-02-18 13:44:01 +0000
+++ b/source/pidl/tests/ndr.pl	2007-02-19 22:06:07 +0000
@@ -27,15 +27,13 @@
 		'IS_DEFERRED' => 0,
 		'LEVEL_INDEX' => 0,
 		'DATA_TYPE' => 'uint8',
-		'CONVERT_FROM' => undef,
 		'CONTAINS_DEFERRED' => 0,
 		'TYPE' => 'DATA',
 		'IS_SURROUNDING' => 0,
-		'CONVERT_TO' => undef
 	}
 ]);
 
-my $ne = ParseElement($e);
+my $ne = ParseElement($e, undef);
 is($ne->{ORIGINAL}, $e);
 is($ne->{NAME}, "v");
 is($ne->{ALIGN}, 1);
@@ -45,11 +43,9 @@
 		'IS_DEFERRED' => 0,
 		'LEVEL_INDEX' => 0,
 		'DATA_TYPE' => 'uint8',
-		'CONVERT_FROM' => undef,
 		'CONTAINS_DEFERRED' => 0,
 		'TYPE' => 'DATA',
 		'IS_SURROUNDING' => 0,
-		'CONVERT_TO' => undef
 	}
 ]);
 
@@ -77,11 +73,9 @@
 		'IS_DEFERRED' => 1,
 		'LEVEL_INDEX' => 1,
 		'DATA_TYPE' => 'uint8',
-		'CONVERT_FROM' => undef,
 		'CONTAINS_DEFERRED' => 0,
 		'TYPE' => 'DATA',
 		'IS_SURROUNDING' => 0,
-		'CONVERT_TO' => undef
 	}
 ]);
 
@@ -117,11 +111,9 @@
 		'IS_DEFERRED' => 1,
 		'LEVEL_INDEX' => 2,
 		'DATA_TYPE' => 'uint8',
-		'CONVERT_FROM' => undef,
 		'CONTAINS_DEFERRED' => 0,
 		'TYPE' => 'DATA',
 		'IS_SURROUNDING' => 0,
-		'CONVERT_TO' => undef
 	}
 ]);
 
@@ -149,11 +141,9 @@
 		'IS_DEFERRED' => 1,
 		'LEVEL_INDEX' => 1,
 		'DATA_TYPE' => 'uint8',
-		'CONVERT_FROM' => undef,
 		'CONTAINS_DEFERRED' => 0,
 		'TYPE' => 'DATA',
 		'IS_SURROUNDING' => 0,
-		'CONVERT_TO' => undef
 	}
 ]);
 
@@ -182,11 +172,9 @@
 		'IS_DEFERRED' => 0,
 		'LEVEL_INDEX' => 1,
 		'DATA_TYPE' => 'uint8',
-		'CONVERT_FROM' => undef,
 		'CONTAINS_DEFERRED' => 0,
 		'TYPE' => 'DATA',
 		'IS_SURROUNDING' => 0,
-		'CONVERT_TO' => undef
 	}
 ]);
 
@@ -200,7 +188,7 @@
 	'PARENT' => { TYPE => 'STRUCT' },
 	'LINE' => 42 };
 
-$ne = ParseElement($e);
+$ne = ParseElement($e, undef);
 is($ne->{REPRESENTATION_TYPE}, "bar");
 
 # representation_type
@@ -213,5 +201,5 @@
 	'PARENT' => { TYPE => 'STRUCT' },
 	'LINE' => 42 };
 
-$ne = ParseElement($e);
+$ne = ParseElement($e, undef);
 is($ne->{REPRESENTATION_TYPE}, "uint8");



More information about the samba-cvs mailing list