r14690: Support represent_as in headers, enable represent_as() test (which works...
authorJelmer Vernooij <jelmer@samba.org>
Fri, 24 Mar 2006 12:40:07 +0000 (12:40 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:59:09 +0000 (13:59 -0500)
(This used to be commit 31e847a0844a6871befc6091e813ae017cd6e4b4)

source4/pidl/lib/Parse/Pidl/Samba4/Header.pm
source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
source4/pidl/tests/ndr_represent.pl

index e082a74fc4334ed22b22ca70b0e99fa06ed76400..6fb3ee2eecb826ee65a9df590fc263c8e24ec269 100644 (file)
@@ -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));
     }
 }
 
index feab825a3f5d62fd1c1a86f512bddd0b60cac73d..d9666a20fe914706c4016f805ef3ac93886d0913 100644 (file)
@@ -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 "}";
        }
index e72fcf6a5041844d65e7bdc2858f934f944f3114..3c6b8cf6ab3188029d0fdcdb0cc2fd857c28de97 100644 (file)
@@ -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 <core/nterr.h>
-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;
 }
 '
 );
-
-}