[SCM] Samba Shared Repository - branch v4-0-test updated - release-4-0-0alpha2-609-gec0ee2a

Stefan Metzmacher metze at samba.org
Sat Feb 2 10:29:59 GMT 2008


The branch, v4-0-test has been updated
       via  ec0ee2aa5f4bef32f09a426d91c28c985f843038 (commit)
       via  7c7acae817cd00ab5c915742338b019af79e9193 (commit)
       via  26d7f5bf96cd7e950ceb532402afd6b8a58871ea (commit)
      from  0bcc8e53d1470ba9dfe93e5d6925b8f4c20c7c66 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v4-0-test


- Log -----------------------------------------------------------------
commit ec0ee2aa5f4bef32f09a426d91c28c985f843038
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jan 31 14:57:35 2008 +0100

    pidl/Samba4::NDR::Parser: correctly get the name of an array element
    
    When we have "*r->out.ous"
    (char ***ous, a pointer to a pointer to an array of pointers).
    we need to use "(*r->out.ous)[3]" to access the 3rd
    element of the array "*r->out.ous[3]" was generated before,
    but that's the same as "*(r->out.ous[3])" which would mean
    the array would apply to a different level.
    
    This patch prepares support for:
    
    [out,ref,size_is(,num)] [string,charset(UTF16)] uint16 ***names;
    
    It means a [ref] pointer to a [unique] pointer to an array
    of [unique] pointers which point to an UTF16 string.
    
    metze

commit 7c7acae817cd00ab5c915742338b019af79e9193
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Feb 1 09:54:25 2008 +0100

    pidl/Samba4::NDR::Parser: fix $var_name for arrays of scalar reference types
    
    uint32 num;
    nstring strings[num];
    
    this should use 'r->strings' instead of
    '*r->strings' as the pointer to the array.
    
    metze

commit 26d7f5bf96cd7e950ceb532402afd6b8a58871ea
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Feb 1 09:49:54 2008 +0100

    pidl/Samba4::NDR::Parser: move logic for extra get_pointer_of() into a function
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 source/pidl/lib/Parse/Pidl/CUtil.pm             |   15 ++++-
 source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm |   82 ++++++++++++++---------
 2 files changed, 65 insertions(+), 32 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/pidl/lib/Parse/Pidl/CUtil.pm b/source/pidl/lib/Parse/Pidl/CUtil.pm
index bd7b168..9deb6ee 100644
--- a/source/pidl/lib/Parse/Pidl/CUtil.pm
+++ b/source/pidl/lib/Parse/Pidl/CUtil.pm
@@ -6,7 +6,7 @@ package Parse::Pidl::CUtil;
 
 require Exporter;
 @ISA = qw(Exporter);
- at EXPORT = qw(get_pointer_to get_value_of);
+ at EXPORT = qw(get_pointer_to get_value_of get_array_element);
 use vars qw($VERSION);
 $VERSION = '0.01';
 
@@ -36,4 +36,17 @@ sub get_value_of($)
 	}
 }
 
+sub get_array_element($$)
+{
+	my ($var_name, $idx) = @_;
+
+	if ($var_name =~ /^\*.*$/) {
+		$var_name = "($var_name)";
+	} elsif ($var_name =~ /^\&.*$/) {
+		$var_name = "($var_name)";
+	}
+
+	return "$var_name"."[$idx]";
+}
+
 1;
diff --git a/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index 8326ce5..81a8bf8 100644
--- a/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -14,7 +14,7 @@ require Exporter;
 use strict;
 use Parse::Pidl::Typelist qw(hasType getType mapTypeName typeHasBody);
 use Parse::Pidl::Util qw(has_property ParseExpr ParseExprExt print_uuid);
-use Parse::Pidl::CUtil qw(get_pointer_to get_value_of);
+use Parse::Pidl::CUtil qw(get_pointer_to get_value_of get_array_element);
 use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred is_charset_array);
 use Parse::Pidl::Samba4 qw(is_intree choose_header);
 use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv);
@@ -42,19 +42,21 @@ sub append_prefix($$)
 {
 	my ($e, $var_name) = @_;
 	my $pointers = 0;
+	my $arrays = 0;
 
 	foreach my $l (@{$e->{LEVELS}}) {
 		if ($l->{TYPE} eq "POINTER") {
 			$pointers++;
 		} elsif ($l->{TYPE} eq "ARRAY") {
+			$arrays++;
 			if (($pointers == 0) and 
 			    (not $l->{IS_FIXED}) and
 			    (not $l->{IS_INLINE})) {
-				return get_value_of($var_name); 
+				return get_value_of($var_name);
 			}
 		} elsif ($l->{TYPE} eq "DATA") {
 			if (Parse::Pidl::Typelist::scalar_is_reference($l->{DATA_TYPE})) {
-				return get_value_of($var_name) unless ($pointers);
+				return get_value_of($var_name) unless ($pointers or $arrays);
 			}
 		}
 	}
@@ -582,7 +584,7 @@ sub ParseElementPushLevel
 		my $length = ParseExpr($l->{LENGTH_IS}, $env, $e->{ORIGINAL});
 		my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
 
-		$var_name = $var_name . "[$counter]";
+		$var_name = get_array_element($var_name, $counter);
 
 		if (($primitives and not $l->{IS_DEFERRED}) or ($deferred and $l->{IS_DEFERRED})) {
 			$self->pidl("for ($counter = 0; $counter < $length; $counter++) {");
@@ -669,23 +671,48 @@ sub ParsePtrPush($$$$)
 	}
 }
 
+sub need_pointer_to($$$)
+{
+	my ($e, $l, $scalar_only) = @_;
+
+	my $t;
+	if (ref($l->{DATA_TYPE})) {
+		$t = "$l->{DATA_TYPE}->{TYPE}_$l->{DATA_TYPE}->{NAME}";
+	} else {
+		$t = $l->{DATA_TYPE};
+	}
+
+	if (not Parse::Pidl::Typelist::is_scalar($t)) {
+		return 1 if $scalar_only;
+	}
+
+	my $arrays = 0;
+
+	foreach my $tl (@{$e->{LEVELS}}) {
+		last if $l == $tl;
+		if ($tl->{TYPE} eq "ARRAY") {
+			$arrays++;
+		}
+	}
+
+	if (Parse::Pidl::Typelist::scalar_is_reference($t)) {
+		return 1 unless $arrays;
+	}
+
+	return 0;
+}
+
 sub ParseDataPrint($$$$)
 {
 	my ($self, $e, $l, $var_name) = @_;
 	
-	if (not ref($l->{DATA_TYPE}) or 
-		defined($l->{DATA_TYPE}->{NAME})) {
-		my $t;
-		if (ref($l->{DATA_TYPE})) {
-			$t = "$l->{DATA_TYPE}->{TYPE}_$l->{DATA_TYPE}->{NAME}";
-		} else {
-			$t = $l->{DATA_TYPE};
-		}
-		if (not Parse::Pidl::Typelist::is_scalar($t) or 
-			Parse::Pidl::Typelist::scalar_is_reference($t)) {
+	if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) {
+
+		if (need_pointer_to($e, $l, 1)) {
 			$var_name = get_pointer_to($var_name);
 		}
-		$self->pidl("ndr_print_$t(ndr, \"$e->{NAME}\", $var_name);");
+
+		$self->pidl(TypeFunctionName("ndr_print", $l->{DATA_TYPE})."(ndr, \"$e->{NAME}\", $var_name);");
 	} else {
 		$self->ParseTypePrint($l->{DATA_TYPE}, $var_name);
 	}
@@ -752,7 +779,7 @@ sub ParseElementPrint($$$$)
 				$self->pidl("if (idx_$l->{LEVEL_INDEX}) {");
 				$self->indent;
 
-				$var_name = $var_name . "[$counter]";
+				$var_name = get_array_element($var_name, $counter);
 			}
 		} elsif ($l->{TYPE} eq "DATA") {
 			$self->ParseDataPrint($e, $l, $var_name);
@@ -815,12 +842,11 @@ sub ParseDataPull($$$$$$$)
 {
 	my ($self,$e,$l,$ndr,$var_name,$primitives,$deferred) = @_;
 
-	if (not ref($l->{DATA_TYPE}) or 
-		defined($l->{DATA_TYPE}->{NAME})) {
+	if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) {
 
 		my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
 
-		if (Parse::Pidl::Typelist::scalar_is_reference($l->{DATA_TYPE})) {
+		if (need_pointer_to($e, $l, 0)) {
 			$var_name = get_pointer_to($var_name);
 		}
 
@@ -845,21 +871,15 @@ sub ParseDataPush($$$$$$$)
 	my ($self,$e,$l,$ndr,$var_name,$primitives,$deferred) = @_;
 
 	if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) {
-		my $t;
-		if (ref($l->{DATA_TYPE}) eq "HASH") {
-			$t = "$l->{DATA_TYPE}->{TYPE}_$l->{DATA_TYPE}->{NAME}";
-		} else {
-			$t = $l->{DATA_TYPE};
-		}
-				
+
+		my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
+
 		# strings are passed by value rather than reference
-		if (not Parse::Pidl::Typelist::is_scalar($t) or 
-			Parse::Pidl::Typelist::scalar_is_reference($t)) {
+		if (need_pointer_to($e, $l, 1)) {
 			$var_name = get_pointer_to($var_name);
 		}
 
-		my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
-		$self->pidl("NDR_CHECK(ndr_push_$t($ndr, $ndr_flags, $var_name));");
+		$self->pidl("NDR_CHECK(".TypeFunctionName("ndr_push", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
 	} else {
 		$self->ParseTypePush($l->{DATA_TYPE}, $var_name, $primitives, $deferred);
 	}
@@ -1028,7 +1048,7 @@ sub ParseElementPullLevel
 		my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
 		my $array_name = $var_name;
 
-		$var_name = $var_name . "[$counter]";
+		$var_name = get_array_element($var_name, $counter);
 
 		$self->ParseMemCtxPullStart($e, $l, $array_name);
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list