1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

r21428: Handle representation types in Needed().

(This used to be commit 34517c69e6)
This commit is contained in:
Jelmer Vernooij 2007-02-18 13:44:01 +00:00 committed by Gerald (Jerry) Carter
parent ae76a5a928
commit 2b43de2ed8
4 changed files with 82 additions and 18 deletions

View File

@ -371,7 +371,7 @@ sub ParseElement($)
TYPE => $e->{TYPE},
PROPERTIES => $e->{PROPERTIES},
LEVELS => GetElementLevelTable($e),
REPRESENTATION_TYPE => $e->{PROPERTIES}->{represent_as},
REPRESENTATION_TYPE => ($e->{PROPERTIES}->{represent_as} or $e->{TYPE}),
ALIGN => align_type($e->{TYPE}),
ORIGINAL => $e
};
@ -388,7 +388,7 @@ sub ParseStruct($$)
my $e = ParseElement($x);
if ($x != $struct->{ELEMENTS}[-1] and
$e->{LEVELS}[0]->{IS_SURROUNDING}) {
print "$x->{FILE}:$x->{LINE}: error: conformant member not at end of struct\n";
fatal($x, "conformant member not at end of struct");
}
push @elements, $e;
}

View File

@ -703,7 +703,7 @@ sub ParseElementPush($$$$$)
return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0]));
# Representation type is different from transmit_as
if ($e->{REPRESENTATION_TYPE}) {
if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) {
pidl "{";
indent;
my $transmit_name = "_transmit_$e->{NAME}";
@ -724,7 +724,7 @@ sub ParseElementPush($$$$$)
end_flags($e);
if ($e->{REPRESENTATION_TYPE}) {
if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) {
deindent;
pidl "}";
}
@ -760,7 +760,7 @@ sub ParseElementPrint($$$)
return if (has_property($e, "noprint"));
if ($e->{REPRESENTATION_TYPE}) {
if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) {
pidl "ndr_print_$e->{REPRESENTATION_TYPE}(ndr, \"$e->{NAME}\", $var_name);";
return;
}
@ -1110,7 +1110,7 @@ sub ParseElementPull($$$$$)
return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0]));
if ($e->{REPRESENTATION_TYPE}) {
if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) {
pidl "{";
indent;
$represent_name = $var_name;
@ -1128,7 +1128,7 @@ sub ParseElementPull($$$$$)
end_flags($e);
# Representation type is different from transmit_as
if ($e->{REPRESENTATION_TYPE}) {
if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) {
pidl "NDR_CHECK(ndr_$e->{TYPE}_to_$e->{REPRESENTATION_TYPE}($transmit_name, ".get_pointer_to($represent_name)."));";
deindent;
pidl "}";
@ -2488,8 +2488,28 @@ sub NeededElement($$$)
{
my ($e, $dir, $needed) = @_;
return if (defined($needed->{"$dir\_$e->{TYPE}"}));
$needed->{"$dir\_$e->{TYPE}"} = 1;
return if ($e->{TYPE} eq "EMPTY");
my @fn = ();
if ($dir eq "print") {
push(@fn, "print_$e->{REPRESENTATION_TYPE}");
} elsif ($dir eq "pull") {
push (@fn, "pull_$e->{TYPE}");
push (@fn, "ndr_$e->{TYPE}_to_$e->{REPRESENTATION_TYPE}")
if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE});
} elsif ($dir eq "push") {
push (@fn, "push_$e->{TYPE}");
push (@fn, "ndr_$e->{REPRESENTATION_TYPE}_to_$e->{TYPE}")
if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE});
} else {
die("invalid direction `$dir'");
}
foreach (@fn) {
unless (defined($needed->{$_})) {
$needed->{$_} = 1;
}
}
}
sub NeededFunction($$)

View File

@ -4,7 +4,7 @@
use strict;
use warnings;
use Test::More tests => 10;
use Test::More tests => 12;
use FindBin qw($RealBin);
use lib "$RealBin";
use Util;
@ -189,3 +189,29 @@ is_deeply(GetElementLevelTable($e), [
'CONVERT_TO' => undef
}
]);
# representation_type
$e = {
'FILE' => 'foo.idl',
'NAME' => 'v',
'PROPERTIES' => { represent_as => "bar" },
'POINTERS' => 0,
'TYPE' => 'uint8',
'PARENT' => { TYPE => 'STRUCT' },
'LINE' => 42 };
$ne = ParseElement($e);
is($ne->{REPRESENTATION_TYPE}, "bar");
# representation_type
$e = {
'FILE' => 'foo.idl',
'NAME' => 'v',
'PROPERTIES' => { },
'POINTERS' => 0,
'TYPE' => 'uint8',
'PARENT' => { TYPE => 'STRUCT' },
'LINE' => 42 };
$ne = ParseElement($e);
is($ne->{REPRESENTATION_TYPE}, "uint8");

View File

@ -4,7 +4,7 @@
use strict;
use warnings;
use Test::More tests => 29;
use Test::More tests => 31;
use FindBin qw($RealBin);
use lib "$RealBin";
use Util;
@ -176,27 +176,27 @@ EnvSubstituteValue($env, $fn);
is_deeply($env, { foo => 0, this => "r" });
my $needed = {};
NeededElement({ TYPE => "foo" }, "pull", $needed);
NeededElement({ TYPE => "foo", REPRESENTATION_TYPE => "foo" }, "pull", $needed);
is_deeply($needed, { pull_foo => 1 });
# old settings should be kept
$needed = { pull_foo => 0 };
NeededElement({ TYPE => "foo" }, "pull", $needed);
NeededElement({ TYPE => "foo", REPRESENTATION_TYPE => "foo" }, "pull", $needed);
is_deeply($needed, { pull_foo => 0 });
# print/pull/push are independent of each other
$needed = { pull_foo => 0 };
NeededElement({ TYPE => "foo" }, "print", $needed);
NeededElement({ TYPE => "foo", REPRESENTATION_TYPE => "foo" }, "print", $needed);
is_deeply($needed, { pull_foo => 0, print_foo => 1 });
$needed = { };
NeededFunction({ NAME => "foo", ELEMENTS => [ { TYPE => "bar" } ] }, $needed);
NeededFunction({ NAME => "foo", ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] }, $needed);
is_deeply($needed, { pull_foo => 1, print_foo => 1, push_foo => 1,
pull_bar => 1, print_bar => 1, push_bar => 1});
# push/pull/print are always set for functions
$needed = { pull_foo => 0 };
NeededFunction({ NAME => "foo", ELEMENTS => [ { TYPE => "bar" } ] }, $needed);
NeededFunction({ NAME => "foo", ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] }, $needed);
is_deeply($needed, { pull_foo => 1, print_foo => 1, push_foo => 1,
pull_bar => 1, push_bar => 1, print_bar => 1});
@ -216,7 +216,7 @@ is_deeply($needed, { pull_bla => 1, print_bla => 1, push_bla => 1 });
$needed = {};
NeededTypedef({ PROPERTIES => { public => 1 }, NAME => "bla",
DATA => { TYPE => "STRUCT",
ELEMENTS => [ { TYPE => "bar" } ] } },
ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } },
$needed);
is_deeply($needed, { pull_bla => 1, print_bla => 1, push_bla => 1,
pull_bar => 1, print_bar => 1, push_bar => 1});
@ -224,7 +224,25 @@ is_deeply($needed, { pull_bla => 1, print_bla => 1, push_bla => 1,
$needed = {};
NeededTypedef({ PROPERTIES => { gensize => 1}, NAME => "bla",
DATA => { TYPE => "STRUCT",
ELEMENTS => [ { TYPE => "bar" } ] } },
ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } },
$needed);
is_deeply($needed, { ndr_size_bla => 1 });
# make sure types for elements are set too
$needed = { pull_bla => 1 };
NeededTypedef({ NAME => "bla",
DATA => { TYPE => "STRUCT",
ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } },
$needed);
is_deeply($needed, { pull_bla => 1, pull_bar => 1 });
$needed = {};
NeededTypedef({ PROPERTIES => { public => 1},
NAME => "bla",
DATA => { TYPE => "STRUCT",
ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "rep" } ] } },
$needed);
is_deeply($needed, { pull_bla => 1, push_bla => 1, print_bla => 1, print_rep => 1,
pull_bar => 1, push_bar => 1,
ndr_bar_to_rep => 1, ndr_rep_to_bar => 1});