diff options
author | Stefan Metzmacher <metze@samba.org> | 2007-08-15 10:23:28 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 15:01:53 -0500 |
commit | 449c9f1f1c03fdc026c56a900dd23b9506dbabf1 (patch) | |
tree | 73437a1da0f9628ef1894ff556b7e62c8155a3ee | |
parent | eab315fe1e584e96fc84cee96ec842610b2dcdce (diff) | |
download | samba-449c9f1f1c03fdc026c56a900dd23b9506dbabf1.tar.gz samba-449c9f1f1c03fdc026c56a900dd23b9506dbabf1.tar.bz2 samba-449c9f1f1c03fdc026c56a900dd23b9506dbabf1.zip |
r24454: when level 0 is a pointer we need to look for an array in level 1...
metze
(This used to be commit ca50b1ad3afbf02fef7c6d1fcbe11d23c515d340)
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm b/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm index 5352e41f24..42120bec78 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm @@ -83,31 +83,35 @@ sub ParseFunction($$$) $self->pidl("/* Return variables */"); foreach my $e (@{$fn->{ELEMENTS}}) { next unless (grep(/out/, @{$e->{DIRECTION}})); + my $level = 0; fatal($e, "[out] argument is not a pointer or array") if ($e->{LEVELS}[0]->{TYPE} ne "POINTER" and $e->{LEVELS}[0]->{TYPE} ne "ARRAY"); - if ( ($e->{LEVELS}[0]->{TYPE} eq "POINTER") and - ($e->{LEVELS}[0]->{POINTER_TYPE} ne "ref") ) { - $self->pidl("if ( $e->{NAME} ) {"); - $self->indent; + if ($e->{LEVELS}[0]->{TYPE} eq "POINTER") { + $level = 1; + if ($e->{LEVELS}[0]->{POINTER_TYPE} ne "ref") { + $self->pidl("if ( $e->{NAME} ) {"); + $self->indent; + } } - if ($e->{LEVELS}[0]->{TYPE} eq "ARRAY") { + if ($e->{LEVELS}[$level]->{TYPE} eq "ARRAY") { # This is a call to GenerateFunctionInEnv intentionally. # Since the data is being copied into a user-provided data # structure, the user should be able to know the size beforehand # to allocate a structure of the right size. my $env = GenerateFunctionInEnv($fn, "r."); - my $size_is = ParseExpr($e->{LEVELS}[0]->{SIZE_IS}, $env, $e); + my $size_is = ParseExpr($e->{LEVELS}[$level]->{SIZE_IS}, $env, $e->{ORIGINAL}); $self->pidl("memcpy($e->{NAME}, r.out.$e->{NAME}, $size_is);"); } else { $self->pidl("*$e->{NAME} = *r.out.$e->{NAME};"); } - if ( ($e->{LEVELS}[0]->{TYPE} eq "POINTER") and - ($e->{LEVELS}[0]->{POINTER_TYPE} ne "ref") ) { - $self->deindent; - $self->pidl("}"); + if ($e->{LEVELS}[0]->{TYPE} eq "POINTER") { + if ($e->{LEVELS}[0]->{POINTER_TYPE} ne "ref") { + $self->deindent; + $self->pidl("}"); + } } } |