mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
r10842: Fix some issues with [out] unions that have a discriminator that is only
[in]
(This used to be commit 3a4086d614
)
This commit is contained in:
parent
fa0fbb46b8
commit
36517c801c
@ -84,11 +84,12 @@ sub ParseFunction($$)
|
||||
pidl "/* Return variables */";
|
||||
foreach my $e (@{$fn->{ELEMENTS}}) {
|
||||
next unless (grep(/out/, @{$e->{DIRECTION}}));
|
||||
|
||||
|
||||
if ($e->{LEVELS}[0]->{TYPE} ne "POINTER") {
|
||||
warning($e->{ORIGINAL}, "First element not a pointer for [out] argument");
|
||||
next;
|
||||
}
|
||||
|
||||
CopyLevel($e, $e->{LEVELS}[1], $e->{NAME}, "r.$e->{NAME}");
|
||||
}
|
||||
|
||||
|
@ -103,9 +103,13 @@ sub ParseUnion($$$)
|
||||
{
|
||||
my ($if,$u,$n) = @_;
|
||||
|
||||
my $extra = {};
|
||||
|
||||
$extra->{switch_value} = $u->{SWITCH_TYPE};
|
||||
my $extra = {
|
||||
switch_value => $u->{SWITCH_TYPE}
|
||||
};
|
||||
|
||||
if (not defined($extra->{switch_value})) {
|
||||
$extra->{switch_value} = "uint32";
|
||||
}
|
||||
|
||||
foreach my $e (@{$u->{ELEMENTS}}) {
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
|
@ -71,25 +71,7 @@ sub ParseElementLevelData($$$$$$$)
|
||||
{
|
||||
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
|
||||
|
||||
my @args = ($e,$l,$varname,$what,$align);
|
||||
|
||||
# See if we need to add a level argument because we're parsing a union
|
||||
foreach (@{$e->{LEVELS}}) {
|
||||
next unless ($_->{TYPE} eq "SWITCH");
|
||||
my $t = getType($l->{DATA_TYPE});
|
||||
|
||||
# Set 0 here because one of the variables referenced in SWITCH_IS
|
||||
# might be an in variable while this one is [out]
|
||||
if (grep(/in/, @{$e->{DIRECTION}}) or
|
||||
not defined($t) or
|
||||
has_property($t->{DATA}, "nodiscriminant")) {
|
||||
push (@args, ParseExpr($_->{SWITCH_IS}, $env));
|
||||
} else {
|
||||
push (@args, -1);
|
||||
}
|
||||
}
|
||||
|
||||
my $c = DissectType(@args);
|
||||
my $c = DissectType($e,$l,$varname,$what,$align);
|
||||
return if not $c;
|
||||
|
||||
if (defined($e->{ALIGN})) {
|
||||
@ -261,6 +243,7 @@ sub InitLevel($$$$)
|
||||
pidl InitType($e, $l, ParseExpr($e->{NAME}, $env), $varname);
|
||||
} elsif ($l->{TYPE} eq "SWITCH") {
|
||||
InitLevel($e, GetNextLevel($e,$l), $varname, $env);
|
||||
pidl ParseExpr($e->{NAME}, $env) . ".switch_value = " . ParseExpr($l->{SWITCH_IS}, $env) . ";";
|
||||
}
|
||||
}
|
||||
|
||||
@ -397,20 +380,15 @@ sub ParseUnion($$$)
|
||||
my $pfn = "$fn\_p";
|
||||
my $dfn = "$fn\_d";
|
||||
|
||||
pidl "BOOL $pfn(const char *desc, $sn* v, uint32 level, prs_struct *ps, int depth)";
|
||||
pidl "BOOL $pfn(const char *desc, $sn* v, prs_struct *ps, int depth)";
|
||||
pidl "{";
|
||||
indent;
|
||||
DeclareArrayVariables($u->{ELEMENTS});
|
||||
|
||||
if (defined ($u->{SWITCH_TYPE})) {
|
||||
pidl "if (MARSHALLING(ps)) ";
|
||||
pidl "\tv->switch_value = level;";
|
||||
pidl "";
|
||||
pidl "if (!prs_$u->{SWITCH_TYPE}(\"switch_value\", ps, depth, &v->switch_value))";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
} else {
|
||||
pidl "v->switch_value = level;";
|
||||
}
|
||||
|
||||
# Maybe check here that level and v->switch_value are equal?
|
||||
@ -447,7 +425,7 @@ sub ParseUnion($$$)
|
||||
pidl "}";
|
||||
pidl "";
|
||||
|
||||
pidl "BOOL $dfn(const char *desc, $sn* v, uint32 level, prs_struct *ps, int depth)";
|
||||
pidl "BOOL $dfn(const char *desc, $sn* v, prs_struct *ps, int depth)";
|
||||
pidl "{";
|
||||
indent;
|
||||
DeclareArrayVariables($u->{ELEMENTS});
|
||||
@ -483,16 +461,14 @@ sub ParseUnion($$$)
|
||||
|
||||
}
|
||||
|
||||
sub CreateFnDirection($$$$)
|
||||
sub CreateFnDirection($$$$$)
|
||||
{
|
||||
my ($fn,$ifn, $s,$es) = @_;
|
||||
my ($fn,$ifn,$s,$all,$es) = @_;
|
||||
|
||||
my $args = "";
|
||||
foreach (@$es) {
|
||||
$args .= ", " . DeclLong($_);
|
||||
}
|
||||
foreach (@$all) { $args .= ", " . DeclLong($_); }
|
||||
|
||||
my $env = { "this" => "v" };
|
||||
my $env = { };
|
||||
GenerateEnvElement($_, $env) foreach (@$es);
|
||||
|
||||
pidl "BOOL $ifn($s *v$args)";
|
||||
@ -539,6 +515,7 @@ sub ParseFunction($$)
|
||||
|
||||
my @in = ();
|
||||
my @out = ();
|
||||
my @all = @{$fn->{ELEMENTS}};
|
||||
|
||||
foreach (@{$fn->{ELEMENTS}}) {
|
||||
push (@in, $_) if (grep(/in/, @{$_->{DIRECTION}}));
|
||||
@ -546,7 +523,7 @@ sub ParseFunction($$)
|
||||
}
|
||||
|
||||
if (defined($fn->{RETURN_TYPE})) {
|
||||
push (@out, {
|
||||
my $status = {
|
||||
NAME => "status",
|
||||
TYPE => $fn->{RETURN_TYPE},
|
||||
LEVELS => [
|
||||
@ -555,17 +532,20 @@ sub ParseFunction($$)
|
||||
DATA_TYPE => $fn->{RETURN_TYPE}
|
||||
}
|
||||
]
|
||||
} );
|
||||
};
|
||||
|
||||
push (@out, $status);
|
||||
push (@all, $status);
|
||||
}
|
||||
|
||||
CreateFnDirection("$if->{NAME}_io_q_$fn->{NAME}",
|
||||
"init_$if->{NAME}_q_$fn->{NAME}",
|
||||
uc("$if->{NAME}_q_$fn->{NAME}"),
|
||||
\@in);
|
||||
\@in, \@in);
|
||||
CreateFnDirection("$if->{NAME}_io_r_$fn->{NAME}",
|
||||
"init_$if->{NAME}_r_$fn->{NAME}",
|
||||
uc("$if->{NAME}_r_$fn->{NAME}"),
|
||||
\@out);
|
||||
\@all, \@out);
|
||||
}
|
||||
|
||||
sub ParseInterface($)
|
||||
|
@ -205,12 +205,6 @@ sub AddType($$)
|
||||
$known_types->{$t} = $d;
|
||||
}
|
||||
|
||||
sub GetType($)
|
||||
{
|
||||
my $e = shift;
|
||||
|
||||
}
|
||||
|
||||
# Return type without special stuff, as used in
|
||||
# declarations for internal structs
|
||||
sub DeclShort($)
|
||||
@ -305,14 +299,9 @@ sub InitType($$$$)
|
||||
}
|
||||
}
|
||||
|
||||
sub DissectType
|
||||
sub DissectType($$$$$)
|
||||
{
|
||||
my @args = @_;
|
||||
my $e = shift @_;
|
||||
my $l = shift @_;
|
||||
my $varname = shift @_;
|
||||
my $what = shift @_;
|
||||
my $align = shift @_;
|
||||
my ($e,$l,$varname,$what,$align) = @_;
|
||||
|
||||
my $t = $known_types->{$l->{DATA_TYPE}};
|
||||
|
||||
@ -332,7 +321,7 @@ sub DissectType
|
||||
|
||||
# DISSECT can be a function
|
||||
if (ref($dissect) eq "CODE") {
|
||||
return $dissect->(@args);
|
||||
return $dissect->($e,$l,$varname,$what,$align);
|
||||
} else {
|
||||
return $dissect;
|
||||
}
|
||||
@ -356,31 +345,18 @@ sub LoadTypes($)
|
||||
my $dissect_p;
|
||||
if ($td->{DATA}->{TYPE} eq "UNION") {
|
||||
$decl.="_CTR";
|
||||
$dissect_p = sub {
|
||||
my ($e,$l,$n,$w,$a,$s) = @_;
|
||||
}
|
||||
|
||||
return "$if->{NAME}_io_$td->{NAME}_p(\"$e->{NAME}\", &$n, $s, ps, depth)";
|
||||
};
|
||||
$dissect_p = sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
|
||||
$dissect_d = sub {
|
||||
my ($e,$l,$n,$w,$a,$s) = @_;
|
||||
return "$if->{NAME}_io_$td->{NAME}_p(\"$e->{NAME}\", &$n, ps, depth)";
|
||||
};
|
||||
$dissect_d = sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
|
||||
return "$if->{NAME}_io_$td->{NAME}_d(\"$e->{NAME}\", &$n, $s, ps, depth)";
|
||||
};
|
||||
|
||||
} else {
|
||||
$dissect_p = sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
|
||||
return "$if->{NAME}_io_$td->{NAME}_p(\"$e->{NAME}\", &$n, ps, depth)";
|
||||
};
|
||||
$dissect_d = sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
|
||||
return "$if->{NAME}_io_$td->{NAME}_d(\"$e->{NAME}\", &$n, ps, depth)";
|
||||
};
|
||||
|
||||
}
|
||||
return "$if->{NAME}_io_$td->{NAME}_d(\"$e->{NAME}\", &$n, ps, depth)";
|
||||
};
|
||||
|
||||
AddType($td->{NAME}, {
|
||||
DECL => $decl,
|
||||
|
Loading…
Reference in New Issue
Block a user