diff options
author | Douglas Bagnall <douglas.bagnall@catalyst.net.nz> | 2016-03-01 14:18:52 +1300 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2016-03-22 08:00:31 +0100 |
commit | 59d530c0b692dae41ea271bfdb473f212615041b (patch) | |
tree | 8ef8cdcab782295a3890c0406183970474270e41 /pidl | |
parent | 7261433fe19fde19353ee42c17607cf04af47a1c (diff) | |
download | samba-59d530c0b692dae41ea271bfdb473f212615041b.tar.gz |
ndr: Use ndr_steal to avoid long lists
When pulling complex structures like nt-acls, a long list of tokens may
be produced. By removing tokens along the way with ndr_token_steal,
future calls to retrieve from the token list are not as expensive.
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
Diffstat (limited to 'pidl')
-rw-r--r-- | pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm index c53ec4a8690..29cdfa9123b 100644 --- a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm +++ b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm @@ -2093,7 +2093,7 @@ sub ParseUnionPull($$$$) { my ($self,$e,$ndr,$varname) = @_; my $switch_type = $e->{SWITCH_TYPE}; - + my $needs_deferred_switch = is_deferred_switch_non_empty($e); $self->pidl("uint32_t level;"); if (defined($switch_type)) { if (Parse::Pidl::Typelist::typeIs($switch_type, "ENUM")) { @@ -2117,18 +2117,24 @@ sub ParseUnionPull($$$$) $self->pidl("NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);"); $self->pidl("if (ndr_flags & NDR_SCALARS) {"); $self->indent; - $self->pidl("level = ndr_pull_get_switch_value($ndr, $varname);"); + if (! $needs_deferred_switch) { + $self->pidl("/* This token is not used again */"); + $self->pidl("level = ndr_pull_steal_switch_value($ndr, $varname);"); + } else { + $self->pidl("level = ndr_pull_get_switch_value($ndr, $varname);"); + } $self->ParseUnionPullPrimitives($e,$ndr,$varname,$switch_type); $self->deindent; $self->pidl("}"); - if (is_deferred_switch_non_empty($e)) { - $self->pidl("if (ndr_flags & NDR_BUFFERS) {"); - $self->indent; - $self->pidl("level = ndr_pull_get_switch_value($ndr, $varname);"); - $self->ParseUnionPullDeferred($e,$ndr,$varname); - $self->deindent; - $self->pidl("}"); - } + if ($needs_deferred_switch) { + $self->pidl("if (ndr_flags & NDR_BUFFERS) {"); + $self->indent; + $self->pidl("/* The token is not needed after this. */"); + $self->pidl("level = ndr_pull_steal_switch_value($ndr, $varname);"); + $self->ParseUnionPullDeferred($e,$ndr,$varname); + $self->deindent; + $self->pidl("}"); + } $self->add_deferred(); $self->end_flags($e, $ndr); |