summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2012-03-15 15:07:08 +0100
committerKarolin Seeger <kseeger@samba.org>2012-04-10 20:35:47 +0200
commit785e1647d41232b1724cd4a4e82b71689f10113e (patch)
tree5b3158f1f69a3abe1fbdca041b5583348c4b50e6
parent7b711ce91a01dae266e4acaa5ab6487109e1264f (diff)
downloadsamba-785e1647d41232b1724cd4a4e82b71689f10113e.tar.gz
pidl/NDR/Parser: remember if we already know the array length
metze (cherry picked from commit 3e89dbfa0dd0c8cd4bcec8ea868a401f9b132aa3)
-rw-r--r--pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm8
1 files changed, 7 insertions, 1 deletions
diff --git a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index 77223b63916..5c4150aeb6e 100644
--- a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -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);
@@ -1111,10 +1113,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) {