summaryrefslogtreecommitdiff
path: root/pidl
diff options
context:
space:
mode:
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>2016-03-01 14:18:52 +1300
committerAndrew Bartlett <abartlet@samba.org>2016-03-22 08:00:31 +0100
commit59d530c0b692dae41ea271bfdb473f212615041b (patch)
tree8ef8cdcab782295a3890c0406183970474270e41 /pidl
parent7261433fe19fde19353ee42c17607cf04af47a1c (diff)
downloadsamba-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.pm26
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);