From 5d9ea9170d2e0fd816285bd460de05f800ce26e8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 24 Mar 2006 12:40:07 +0000 Subject: r14690: Support represent_as in headers, enable represent_as() test (which works now) (This used to be commit 31e847a0844a6871befc6091e813ae017cd6e4b4) --- source4/pidl/lib/Parse/Pidl/Samba4/Header.pm | 38 +++++++++++++----------- source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm | 12 ++++---- source4/pidl/tests/ndr_represent.pl | 14 +++------ 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm b/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm index e082a74fc4..6fb3ee2eec 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm @@ -55,19 +55,23 @@ sub HeaderElement($) my($element) = shift; pidl tabs(); - HeaderType($element, $element->{TYPE}, ""); - pidl " "; - my $numstar = $element->{POINTERS}; - if ($numstar >= 1) { - $numstar-- if Parse::Pidl::Typelist::scalar_is_reference($element->{TYPE}); - } - foreach (@{$element->{ARRAY_LEN}}) - { - next if is_constant($_) and - not has_property($element, "charset"); - $numstar++; + if (has_property($element, "represent_as")) { + pidl mapType($element->{PROPERTIES}->{represent_as})." "; + } else { + HeaderType($element, $element->{TYPE}, ""); + pidl " "; + my $numstar = $element->{POINTERS}; + if ($numstar >= 1) { + $numstar-- if Parse::Pidl::Typelist::scalar_is_reference($element->{TYPE}); + } + foreach (@{$element->{ARRAY_LEN}}) + { + next if is_constant($_) and + not has_property($element, "charset"); + $numstar++; + } + pidl "*" foreach (1..$numstar); } - pidl "*" foreach (1..$numstar); pidl $element->{NAME}; foreach (@{$element->{ARRAY_LEN}}) { next unless (is_constant($_) and @@ -91,8 +95,8 @@ sub HeaderStruct($$) $tab_depth++; my $el_count=0; if (defined $struct->{ELEMENTS}) { - foreach my $e (@{$struct->{ELEMENTS}}) { - HeaderElement($e); + foreach (@{$struct->{ELEMENTS}}) { + HeaderElement($_); $el_count++; } } @@ -237,10 +241,8 @@ sub HeaderFunctionInOut($$) { my($fn,$prop) = @_; - foreach my $e (@{$fn->{ELEMENTS}}) { - if (has_property($e, $prop)) { - HeaderElement($e); - } + foreach (@{$fn->{ELEMENTS}}) { + HeaderElement($_) if (has_property($_, $prop)); } } diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm index feab825a3f..d9666a20fe 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm @@ -670,8 +670,6 @@ sub ParseElementPush($$$$$$) my $var_name = $var_prefix.$e->{NAME}; - $var_name = append_prefix($e, $var_name); - return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0])); # Representation type is different from transmit_as @@ -680,10 +678,12 @@ sub ParseElementPush($$$$$$) indent; my $transmit_name = "_transmit_$e->{NAME}"; pidl mapType($e->{TYPE}) ." $transmit_name;"; - pidl "NDR_CHECK(ndr_$e->{REPRESENTATION_TYPE}_to_$e->{TYPE}($var_name, $transmit_name));"; + pidl "NDR_CHECK(ndr_$e->{REPRESENTATION_TYPE}_to_$e->{TYPE}($var_name, " . get_pointer_to($transmit_name) . "));"; $var_name = $transmit_name; } + $var_name = append_prefix($e, $var_name); + start_flags($e); if (my $value = has_property($e, "value")) { @@ -1073,6 +1073,7 @@ sub ParseElementPull($$$$$$) my $var_name = $var_prefix.$e->{NAME}; my $represent_name; + my $transmit_name; return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0])); @@ -1080,7 +1081,8 @@ sub ParseElementPull($$$$$$) pidl "{"; indent; $represent_name = $var_name; - $var_name = "_transmit_$e->{NAME}"; + $transmit_name = "_transmit_$e->{NAME}"; + $var_name = $transmit_name; pidl mapType($e->{TYPE})." $var_name;"; } @@ -1094,7 +1096,7 @@ sub ParseElementPull($$$$$$) # Representation type is different from transmit_as if ($e->{REPRESENTATION_TYPE}) { - pidl "NDR_CHECK(ndr_$e->{TYPE}_to_$e->{REPRESENTATION_TYPE}($var_name, $represent_name));"; + pidl "NDR_CHECK(ndr_$e->{TYPE}_to_$e->{REPRESENTATION_TYPE}($transmit_name, ".get_pointer_to($represent_name)."));"; deindent; pidl "}"; } diff --git a/source4/pidl/tests/ndr_represent.pl b/source4/pidl/tests/ndr_represent.pl index e72fcf6a50..3c6b8cf6ab 100644 --- a/source4/pidl/tests/ndr_represent.pl +++ b/source4/pidl/tests/ndr_represent.pl @@ -9,12 +9,9 @@ use lib "$RealBin/../lib"; use lib "$RealBin"; use Util qw(test_samba4_ndr); -SKIP: { - skip "represent_as() is not finished yet", 8; - test_samba4_ndr('represent_as-simple', ' - void bla([in,represent_as(foo)] uint8 x); + void bla([in,represent_as(uint32)] uint8 x); ', ' uint8_t expected[] = { 0x0D }; @@ -25,25 +22,22 @@ test_samba4_ndr('represent_as-simple', if (NT_STATUS_IS_ERR(ndr_pull_bla(ndr, NDR_SCALARS|NDR_BUFFERS, &r))) return 1; - if (r != 13) + if (r.in.x != 13) return 2; ', ' #include -typedef int foo; -NTSTATUS ndr_uint8_to_foo(uint8_t from, foo *to) +NTSTATUS ndr_uint8_to_uint32(uint8_t from, uint32_t *to) { *to = from; return NT_STATUS_OK; } -NTSTATUS ndr_foo_to_uint8(foo from, uint8_t *to) +NTSTATUS ndr_uint32_to_uint8(uint32_t from, uint8_t *to) { *to = from; return NT_STATUS_OK; } ' ); - -} -- cgit