Author: jelmer
Date: 2007-02-18 13:44:01 +0000 (Sun, 18 Feb 2007)
New Revision: 21428

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=21428

Log:
Handle representation types in Needed().

Modified:
   branches/SAMBA_4_0/
   branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/NDR.pm
   branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
   branches/SAMBA_4_0/source/pidl/tests/ndr.pl
   branches/SAMBA_4_0/source/pidl/tests/samba-ndr.pl


Changeset:

Property changes on: branches/SAMBA_4_0
___________________________________________________________________
Name: bzr:merge
   - [EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]

   + [EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]
[EMAIL PROTECTED]


Modified: branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/NDR.pm
===================================================================
--- branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/NDR.pm        2007-02-18 
12:54:03 UTC (rev 21427)
+++ branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/NDR.pm        2007-02-18 
13:44:01 UTC (rev 21428)
@@ -371,7 +371,7 @@
                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 @@
                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;
        }

Modified: branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
===================================================================
--- branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm  
2007-02-18 12:54:03 UTC (rev 21427)
+++ branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm  
2007-02-18 13:44:01 UTC (rev 21428)
@@ -703,7 +703,7 @@
        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 @@
 
        end_flags($e);
 
-       if ($e->{REPRESENTATION_TYPE}) {
+       if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) {
                deindent;
                pidl "}";
        }
@@ -760,7 +760,7 @@
 
        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 @@
 
        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 @@
        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 @@
 {
        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($$)

Modified: branches/SAMBA_4_0/source/pidl/tests/ndr.pl
===================================================================
--- branches/SAMBA_4_0/source/pidl/tests/ndr.pl 2007-02-18 12:54:03 UTC (rev 
21427)
+++ branches/SAMBA_4_0/source/pidl/tests/ndr.pl 2007-02-18 13:44:01 UTC (rev 
21428)
@@ -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 @@
                '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");

Modified: branches/SAMBA_4_0/source/pidl/tests/samba-ndr.pl
===================================================================
--- branches/SAMBA_4_0/source/pidl/tests/samba-ndr.pl   2007-02-18 12:54:03 UTC 
(rev 21427)
+++ branches/SAMBA_4_0/source/pidl/tests/samba-ndr.pl   2007-02-18 13:44:01 UTC 
(rev 21428)
@@ -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 @@
 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 @@
 $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 @@
 $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});
+       

Reply via email to