Rev 11534: Refactor some of the NDR code in preparation of nested data structure support. in file:///home/jelmer/bzr.samba/SAMBA_4_0/

Jelmer Vernooij jelmer at samba.org
Mon Feb 19 01:48:10 GMT 2007


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

------------------------------------------------------------
revno: 11534
revision-id: jelmer at samba.org-20070219014759-jv5otc3ij03d89va
parent: svn-v2:21442 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 02:47:59 +0100
message:
  Refactor some of the NDR code in preparation of nested data structure support.
modified:
  source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm svn-v2:12463 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2flib%2fParse%2fPidl%2fSamba4%2fNDR%2fParser.pm
=== modified file 'source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm'
--- a/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm	2007-02-19 00:48:05 +0000
+++ b/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm	2007-02-19 01:47:59 +0000
@@ -1190,6 +1190,32 @@
 	pidl "}";
 }
 
+sub ParseStructPushPrimitives($$$$)
+{
+	my ($struct, $name, $varname, $env) = @_;
+
+	pidl "NDR_CHECK(ndr_push_align(ndr, $struct->{ALIGN}));";
+
+	if (defined($struct->{PROPERTIES}{relative_base})) {
+		# set the current offset as base for relative pointers
+		# and store it based on the toplevel struct/union
+		pidl "NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, $varname, ndr->offset));";
+	}
+
+	ParseElementPush($_, "ndr", $env, 1, 0) foreach (@{$struct->{ELEMENTS}});
+}
+
+sub ParseStructPushDeferred($$$$)
+{
+	my ($struct, $name, $varname, $env) = @_;
+	if (defined($struct->{PROPERTIES}{relative_base})) {
+		# retrieve the current offset as base for relative pointers
+		# based on the toplevel struct/union
+		pidl "NDR_CHECK(ndr_push_setup_relative_base_offset2(ndr, $varname));";
+	}
+	ParseElementPush($_, "ndr", $env, 0, 1) foreach (@{$struct->{ELEMENTS}});
+}
+
 #####################################################################
 # parse a struct
 sub ParseStructPush($$$)
@@ -1202,12 +1228,7 @@
 
 	EnvSubstituteValue($env, $struct);
 
-	# save the old relative_base_offset
-	pidl "uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);" if defined($struct->{PROPERTIES}{relative_base});
-
-	foreach my $e (@{$struct->{ELEMENTS}}) { 
-		DeclareArrayVariables($e);
-	}
+	DeclareArrayVariables($_) foreach (@{$struct->{ELEMENTS}});
 
 	start_flags($struct);
 
@@ -1241,39 +1262,17 @@
 
 	pidl "if (ndr_flags & NDR_SCALARS) {";
 	indent;
-
-	pidl "NDR_CHECK(ndr_push_align(ndr, $struct->{ALIGN}));";
-
-	if (defined($struct->{PROPERTIES}{relative_base})) {
-		# set the current offset as base for relative pointers
-		# and store it based on the toplevel struct/union
-		pidl "NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, $varname, ndr->offset));";
-	}
-
-	foreach my $e (@{$struct->{ELEMENTS}}) {
-		ParseElementPush($e, "ndr", $env, 1, 0);
-	}	
-
+	ParseStructPushPrimitives($struct, $name, $varname, $env);
 	deindent;
 	pidl "}";
 
 	pidl "if (ndr_flags & NDR_BUFFERS) {";
 	indent;
-	if (defined($struct->{PROPERTIES}{relative_base})) {
-		# retrieve the current offset as base for relative pointers
-		# based on the toplevel struct/union
-		pidl "NDR_CHECK(ndr_push_setup_relative_base_offset2(ndr, $varname));";
-	}
-	foreach my $e (@{$struct->{ELEMENTS}}) {
-		ParseElementPush($e, "ndr", $env, 0, 1);
-	}
-
+	ParseStructPushDeferred($struct, $name, $varname, $env);
 	deindent;
 	pidl "}";
 
 	end_flags($struct);
-	# restore the old relative_base_offset
-	pidl "ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined($struct->{PROPERTIES}{relative_base});
 }
 
 #####################################################################
@@ -1514,30 +1513,9 @@
 	}
 }
 
-#####################################################################
-# parse a struct - pull side
-sub ParseStructPull($$$)
+sub ParseStructPullPrimitives($$$$)
 {
-	my($struct,$name,$varname) = @_;
-
-	return unless defined $struct->{ELEMENTS};
-
-	my $env = GenerateStructEnv($struct, $varname);
-
-	# declare any internal pointers we need
-	foreach my $e (@{$struct->{ELEMENTS}}) {
-		DeclarePtrVariables($e);
-		DeclareArrayVariables($e);
-		DeclareMemCtxVariables($e);
-	}
-
-	# save the old relative_base_offset
-	pidl "uint32_t _save_relative_base_offset = ndr_pull_get_relative_base_offset(ndr);" if defined($struct->{PROPERTIES}{relative_base});
-
-	start_flags($struct);
-
-	pidl "if (ndr_flags & NDR_SCALARS) {";
-	indent;
+	my($struct,$name,$varname,$env) = @_;
 
 	if (defined $struct->{SURROUNDING_ELEMENT}) {
 		pidl "NDR_CHECK(ndr_pull_array_size(ndr, &$varname->$struct->{SURROUNDING_ELEMENT}->{NAME}));";
@@ -1551,16 +1529,15 @@
 		pidl "NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, $varname, ndr->offset));";
 	}
 
-	foreach my $e (@{$struct->{ELEMENTS}}) {
-		ParseElementPull($e, "ndr", $env, 1, 0);
-	}	
+	ParseElementPull($_, "ndr", $env, 1, 0) foreach (@{$struct->{ELEMENTS}});
 
 	add_deferred();
-
-	deindent;
-	pidl "}";
-	pidl "if (ndr_flags & NDR_BUFFERS) {";
-	indent;
+}
+
+sub ParseStructPullDeferred($$$$)
+{
+	my ($struct,$name,$varname,$env) = @_;
+
 	if (defined($struct->{PROPERTIES}{relative_base})) {
 		# retrieve the current offset as base for relative pointers
 		# based on the toplevel struct/union
@@ -1571,13 +1548,39 @@
 	}
 
 	add_deferred();
-
+}
+
+#####################################################################
+# parse a struct - pull side
+sub ParseStructPull($$$)
+{
+	my($struct,$name,$varname) = @_;
+
+	return unless defined $struct->{ELEMENTS};
+
+	# declare any internal pointers we need
+	foreach my $e (@{$struct->{ELEMENTS}}) {
+		DeclarePtrVariables($e);
+		DeclareArrayVariables($e);
+		DeclareMemCtxVariables($e);
+	}
+
+	start_flags($struct);
+
+	my $env = GenerateStructEnv($struct, $varname);
+
+	pidl "if (ndr_flags & NDR_SCALARS) {";
+	indent;
+	ParseStructPullPrimitives($struct,$name,$varname,$env);
+	deindent;
+	pidl "}";
+	pidl "if (ndr_flags & NDR_BUFFERS) {";
+	indent;
+	ParseStructPullDeferred($struct,$name,$varname,$env);
 	deindent;
 	pidl "}";
 
 	end_flags($struct);
-	# restore the old relative_base_offset
-	pidl "ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined($struct->{PROPERTIES}{relative_base});
 }
 
 #####################################################################
@@ -1635,8 +1638,6 @@
 	my ($e,$name,$varname) = @_;
 	my $have_default = 0;
 
-	# save the old relative_base_offset
-	pidl "uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);" if defined($e->{PROPERTIES}{relative_base});
 	pidl "int level;";
 
 	start_flags($e);
@@ -1710,8 +1711,6 @@
 	deindent;
 	pidl "}";
 	end_flags($e);
-	# restore the old relative_base_offset
-	pidl "ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined($e->{PROPERTIES}{relative_base});
 }
 
 #####################################################################
@@ -1757,16 +1756,93 @@
 	end_flags($e);
 }
 
+sub ParseUnionPullPrimitives($$$$)
+{
+	my ($e,$name,$varname,$switch_type) = @_;
+	my $have_default = 0;
+
+	if (defined($switch_type)) {
+		pidl "NDR_CHECK(ndr_pull_$switch_type(ndr, NDR_SCALARS, &_level));";
+		pidl "if (_level != level) {"; 
+		pidl "\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value %u for $name\", _level);";
+		pidl "}";
+	}
+
+	pidl "switch (level) {";
+	indent;
+	foreach my $el (@{$e->{ELEMENTS}}) {
+		if ($el->{CASE} eq "default") {
+			$have_default = 1;
+		} 
+		pidl "$el->{CASE}: {";
+
+		if ($el->{TYPE} ne "EMPTY") {
+			indent;
+			DeclarePtrVariables($el);
+			DeclareArrayVariables($el);
+			if (defined($e->{PROPERTIES}{relative_base})) {
+				pidl "NDR_CHECK(ndr_pull_align(ndr, $el->{ALIGN}));";
+				# set the current offset as base for relative pointers
+				# and store it based on the toplevel struct/union
+				pidl "NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, $varname, ndr->offset));";
+			}
+			ParseElementPull($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 1, 0);
+			deindent;
+		}
+		pidl "break; }";
+		pidl "";
+	}
+	if (! $have_default) {
+		pidl "default:";
+		pidl "\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);";
+	}
+	deindent;
+	pidl "}";
+}
+
+sub ParseUnionPullDeferred($$$)
+{
+	my ($e,$name,$varname) = @_;
+	my $have_default = 0;
+
+	if (defined($e->{PROPERTIES}{relative_base})) {
+		# retrieve the current offset as base for relative pointers
+		# based on the toplevel struct/union
+		pidl "NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, $varname));";
+	}
+	pidl "switch (level) {";
+	indent;
+	foreach my $el (@{$e->{ELEMENTS}}) {
+		if ($el->{CASE} eq "default") {
+			$have_default = 1;
+		} 
+
+		pidl "$el->{CASE}:";
+		if ($el->{TYPE} ne "EMPTY") {
+			indent;
+			ParseElementPull($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 0, 1);
+			deindent;
+		}
+		pidl "break;";
+		pidl "";
+	}
+	if (! $have_default) {
+		pidl "default:";
+		pidl "\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);";
+	}
+	deindent;
+	pidl "}";
+
+
+}
+
 #####################################################################
 # parse a union - pull side
 sub ParseUnionPull($$$)
 {
 	my ($e,$name,$varname) = @_;
-	my $have_default = 0;
 	my $switch_type = $e->{SWITCH_TYPE};
 
-	# save the old relative_base_offset
-	pidl "uint32_t _save_relative_base_offset = ndr_pull_get_relative_base_offset(ndr);" if defined($e->{PROPERTIES}{relative_base});
 	pidl "int level;";
 	if (defined($switch_type)) {
 		if (Parse::Pidl::Typelist::typeIs($switch_type, "ENUM")) {
@@ -1789,80 +1865,19 @@
 
 	pidl "if (ndr_flags & NDR_SCALARS) {";
 	indent;
-
-	if (defined($switch_type)) {
-		pidl "NDR_CHECK(ndr_pull_$switch_type(ndr, NDR_SCALARS, &_level));";
-		pidl "if (_level != level) {"; 
-		pidl "\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value %u for $name\", _level);";
-		pidl "}";
-	}
-
-	pidl "switch (level) {";
-	indent;
-	foreach my $el (@{$e->{ELEMENTS}}) {
-		if ($el->{CASE} eq "default") {
-			$have_default = 1;
-		} 
-		pidl "$el->{CASE}: {";
-
-		if ($el->{TYPE} ne "EMPTY") {
-			indent;
-			DeclarePtrVariables($el);
-			DeclareArrayVariables($el);
-			if (defined($e->{PROPERTIES}{relative_base})) {
-				pidl "NDR_CHECK(ndr_pull_align(ndr, $el->{ALIGN}));";
-				# set the current offset as base for relative pointers
-				# and store it based on the toplevel struct/union
-				pidl "NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, $varname, ndr->offset));";
-			}
-			ParseElementPull($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 1, 0);
-			deindent;
-		}
-		pidl "break; }";
-		pidl "";
-	}
-	if (! $have_default) {
-		pidl "default:";
-		pidl "\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);";
-	}
-	deindent;
-	pidl "}";
-	deindent;
-	pidl "}";
+	ParseUnionPullPrimitives($e,$name,$varname,$switch_type);
+	deindent;
+	pidl "}";
+
 	pidl "if (ndr_flags & NDR_BUFFERS) {";
 	indent;
-	if (defined($e->{PROPERTIES}{relative_base})) {
-		# retrieve the current offset as base for relative pointers
-		# based on the toplevel struct/union
-		pidl "NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, $varname));";
-	}
-	pidl "switch (level) {";
-	indent;
-	foreach my $el (@{$e->{ELEMENTS}}) {
-		pidl "$el->{CASE}:";
-		if ($el->{TYPE} ne "EMPTY") {
-			indent;
-			ParseElementPull($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 0, 1);
-			deindent;
-		}
-		pidl "break;";
-		pidl "";
-	}
-	if (! $have_default) {
-		pidl "default:";
-		pidl "\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);";
-	}
-	deindent;
-	pidl "}";
-
+	ParseUnionPullDeferred($e,$name,$varname);
 	deindent;
 	pidl "}";
 
 	add_deferred();
 
 	end_flags($e);
-	# restore the old relative_base_offset
-	pidl "ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined($e->{PROPERTIES}{relative_base});
 }
 
 sub DeclUnion($$$$)
@@ -2371,7 +2386,11 @@
 
 	pidl "{";
 	indent;
+	# save the old relative_base_offset
+	pidl "uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);" if defined(has_property($e, "relative_base"));
 	$typefamily{$e->{TYPE}}->{PUSH_FN_BODY}->($e, $e->{NAME}, $varname);
+	# restore the old relative_base_offset
+	pidl "ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined(has_property($e, "relative_base"));
 	pidl "return NT_STATUS_OK;";
 	deindent;
 	pidl "}";
@@ -2389,7 +2408,11 @@
 
 	pidl "{";
 	indent;
+	# save the old relative_base_offset
+	pidl "uint32_t _save_relative_base_offset = ndr_pull_get_relative_base_offset(ndr);" if defined(has_property($e, "relative_base"));
 	$typefamily{$e->{TYPE}}->{PULL_FN_BODY}->($e, $e->{NAME}, $varname);
+	# restore the old relative_base_offset
+	pidl "ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined(has_property($e, "relative_base"));
 	pidl "return NT_STATUS_OK;";
 	deindent;
 	pidl "}";



More information about the samba-cvs mailing list