pidl/NDR/Parser: remember if we already know the array length
authorStefan Metzmacher <metze@samba.org>
Thu, 15 Mar 2012 14:07:08 +0000 (15:07 +0100)
committerKarolin Seeger <kseeger@samba.org>
Tue, 10 Apr 2012 18:19:49 +0000 (20:19 +0200)
metze
(cherry picked from commit 25f68811af3399c6148fa5d31d932465e27a2125)

pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm

index 09ba7232c21b1bdd8ed257dbfefd50d54eae22dc..8a69c25e9f035ad84844a1bc86cb43f8b012b38f 100644 (file)
@@ -1028,6 +1028,7 @@ sub ParseElementPullLevel
        my($self,$e,$l,$ndr,$var_name,$env,$primitives,$deferred) = @_;
 
        my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
+       my $array_length = undef;
 
        if ($l->{TYPE} eq "ARRAY" and ($l->{IS_VARYING} or $l->{IS_CONFORMANT})) {
                $var_name = get_pointer_to($var_name);
@@ -1041,6 +1042,7 @@ sub ParseElementPullLevel
                        $self->ParseSubcontextPullEnd($e, $l, $ndr, $env);
                } elsif ($l->{TYPE} eq "ARRAY") {
                        my $length = $self->ParseArrayPullHeader($e, $l, $ndr, $var_name, $env);
+                       $array_length = $length;
 
                        if (my $range = has_property($e, "range")) {
                                my ($low, $high) = split(/,/, $range, 2);
@@ -1120,10 +1122,14 @@ sub ParseElementPullLevel
                }
        } elsif ($l->{TYPE} eq "ARRAY" and 
                        not has_fast_array($e,$l) and not is_charset_array($e, $l)) {
-               my $length = $self->ParseArrayPullGetLength($e, $l, $ndr, $var_name, $env);
+               my $length = $array_length;
                my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
                my $array_name = $var_name;
 
+               if (not defined($length)) {
+                       $length = $self->ParseArrayPullGetLength($e, $l, $ndr, $var_name, $env);
+               }
+
                if (my $range = has_property($e, "range")) {
                        my ($low, $high) = split(/,/, $range, 2);
                        if ($low < 0) {