r21457: Cope with anonymous nested types in the NDR layer. This doesn't handled
authorJelmer Vernooij <jelmer@samba.org>
Mon, 19 Feb 2007 22:10:23 +0000 (22:10 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:48:38 +0000 (14:48 -0500)
named nested types yet, as these have to be registered.

source/pidl/lib/Parse/Pidl/NDR.pm
source/pidl/tests/ndr.pl

index d55df7a452f09e492d334b0f775197294d8c3b12..a921e5cbe5018112593a2ccbdafbd9b22aa8b351 100644 (file)
@@ -257,8 +257,6 @@ sub GetElementLevelTable($)
 
        push (@$order, {
                TYPE => "DATA",
-               CONVERT_TO => has_property($e, ""),
-               CONVERT_FROM => has_property($e, ""),
                DATA_TYPE => $e->{TYPE},
                IS_DEFERRED => $is_deferred,
                CONTAINS_DEFERRED => can_contain_deferred($e),
@@ -360,12 +358,16 @@ sub align_type($)
        die("Unknown data type type $dt->{TYPE}");
 }
 
-sub ParseElement($)
+sub ParseElement($$)
 {
-       my $e = shift;
+       my ($e, $pointer_default) = @_;
 
        $e->{TYPE} = expandAlias($e->{TYPE});
 
+       if (ref($e->{TYPE}) eq "HASH") {
+               $e->{TYPE} = ParseType($e->{TYPE}, $pointer_default);
+       }
+
        return {
                NAME => $e->{NAME},
                TYPE => $e->{TYPE},
@@ -379,14 +381,13 @@ sub ParseElement($)
 
 sub ParseStruct($$)
 {
-       my ($ndr,$struct) = @_;
+       my ($struct, $pointer_default) = @_;
        my @elements = ();
        my $surrounding = undef;
 
-
        foreach my $x (@{$struct->{ELEMENTS}}) 
        {
-               my $e = ParseElement($x);
+               my $e = ParseElement($x, $pointer_default);
                if ($x != $struct->{ELEMENTS}[-1] and 
                        $e->{LEVELS}[0]->{IS_SURROUNDING}) {
                        fatal($x, "conformant member not at end of struct");
@@ -423,7 +424,7 @@ sub ParseStruct($$)
 
 sub ParseUnion($$)
 {
-       my ($ndr,$e) = @_;
+       my ($e, $pointer_default) = @_;
        my @elements = ();
        my $switch_type = has_property($e, "switch_type");
        unless (defined($switch_type)) { $switch_type = "uint32"; }
@@ -437,7 +438,7 @@ sub ParseUnion($$)
                if ($x->{TYPE} eq "EMPTY") {
                        $t = { TYPE => "EMPTY" };
                } else {
-                       $t = ParseElement($x);
+                       $t = ParseElement($x, $pointer_default);
                }
                if (has_property($x, "default")) {
                        $t->{CASE} = "default";
@@ -463,7 +464,7 @@ sub ParseUnion($$)
 
 sub ParseEnum($$)
 {
-       my ($ndr,$e) = @_;
+       my ($e, $pointer_default) = @_;
 
        return {
                TYPE => "ENUM",
@@ -477,7 +478,7 @@ sub ParseEnum($$)
 
 sub ParseBitmap($$)
 {
-       my ($ndr,$e) = @_;
+       my ($e, $pointer_default) = @_;
 
        return {
                TYPE => "BITMAP",
@@ -491,10 +492,10 @@ sub ParseBitmap($$)
 
 sub ParseType($$)
 {
-       my ($ndr, $d) = @_;
+       my ($d, $pointer_default) = @_;
 
        if ($d->{TYPE} eq "STRUCT" or $d->{TYPE} eq "UNION") {
-               CheckPointerTypes($d, $ndr->{PROPERTIES}->{pointer_default});
+               CheckPointerTypes($d, $pointer_default);
        }
 
        my $data = {
@@ -503,20 +504,20 @@ sub ParseType($$)
                ENUM => \&ParseEnum,
                BITMAP => \&ParseBitmap,
                TYPEDEF => \&ParseTypedef,
-       }->{$d->{TYPE}}->($ndr, $d);
+       }->{$d->{TYPE}}->($d, $pointer_default);
 
        return $data;
 }
 
 sub ParseTypedef($$)
 {
-       my ($ndr,$d) = @_;
+       my ($d, $pointer_default) = @_;
 
        if (defined($d->{DATA}->{PROPERTIES}) && !defined($d->{PROPERTIES})) {
                $d->{PROPERTIES} = $d->{DATA}->{PROPERTIES};
        }
 
-       my $data = ParseType($ndr, $d->{DATA});
+       my $data = ParseType($d->{DATA}, $pointer_default);
        $data->{ALIGN} = align_type($d->{NAME});
 
        return {
@@ -550,7 +551,7 @@ sub ParseFunction($$$)
        }
 
        foreach my $x (@{$d->{ELEMENTS}}) {
-               my $e = ParseElement($x);
+               my $e = ParseElement($x, $ndr->{PROPERTIES}->{pointer_default});
                push (@{$e->{DIRECTION}}, "in") if (has_property($x, "in"));
                push (@{$e->{DIRECTION}}, "out") if (has_property($x, "out"));
 
@@ -618,7 +619,7 @@ sub ParseInterface($)
                } elsif ($d->{TYPE} eq "CONST") {
                        push (@consts, ParseConst($idl, $d));
                } else {
-                       push (@types, ParseType($idl, $d));
+                       push (@types, ParseType($d, $idl->{PROPERTIES}->{pointer_default}));
                }
        }
 
index baf06b1eae5ba34529e0d7e85d40c755b2065efc..26fb6c290b1ff75fa50f0255f0b8548a301f6ae5 100755 (executable)
@@ -27,15 +27,13 @@ is_deeply(GetElementLevelTable($e), [
                'IS_DEFERRED' => 0,
                'LEVEL_INDEX' => 0,
                'DATA_TYPE' => 'uint8',
-               'CONVERT_FROM' => undef,
                'CONTAINS_DEFERRED' => 0,
                'TYPE' => 'DATA',
                'IS_SURROUNDING' => 0,
-               'CONVERT_TO' => undef
        }
 ]);
 
-my $ne = ParseElement($e);
+my $ne = ParseElement($e, undef);
 is($ne->{ORIGINAL}, $e);
 is($ne->{NAME}, "v");
 is($ne->{ALIGN}, 1);
@@ -45,11 +43,9 @@ is_deeply($ne->{LEVELS},  [
                'IS_DEFERRED' => 0,
                'LEVEL_INDEX' => 0,
                'DATA_TYPE' => 'uint8',
-               'CONVERT_FROM' => undef,
                'CONTAINS_DEFERRED' => 0,
                'TYPE' => 'DATA',
                'IS_SURROUNDING' => 0,
-               'CONVERT_TO' => undef
        }
 ]);
 
@@ -77,11 +73,9 @@ is_deeply(GetElementLevelTable($e), [
                'IS_DEFERRED' => 1,
                'LEVEL_INDEX' => 1,
                'DATA_TYPE' => 'uint8',
-               'CONVERT_FROM' => undef,
                'CONTAINS_DEFERRED' => 0,
                'TYPE' => 'DATA',
                'IS_SURROUNDING' => 0,
-               'CONVERT_TO' => undef
        }
 ]);
 
@@ -117,11 +111,9 @@ is_deeply(GetElementLevelTable($e), [
                'IS_DEFERRED' => 1,
                'LEVEL_INDEX' => 2,
                'DATA_TYPE' => 'uint8',
-               'CONVERT_FROM' => undef,
                'CONTAINS_DEFERRED' => 0,
                'TYPE' => 'DATA',
                'IS_SURROUNDING' => 0,
-               'CONVERT_TO' => undef
        }
 ]);
 
@@ -149,11 +141,9 @@ is_deeply(GetElementLevelTable($e), [
                'IS_DEFERRED' => 1,
                'LEVEL_INDEX' => 1,
                'DATA_TYPE' => 'uint8',
-               'CONVERT_FROM' => undef,
                'CONTAINS_DEFERRED' => 0,
                'TYPE' => 'DATA',
                'IS_SURROUNDING' => 0,
-               'CONVERT_TO' => undef
        }
 ]);
 
@@ -182,11 +172,9 @@ is_deeply(GetElementLevelTable($e), [
                'IS_DEFERRED' => 0,
                'LEVEL_INDEX' => 1,
                'DATA_TYPE' => 'uint8',
-               'CONVERT_FROM' => undef,
                'CONTAINS_DEFERRED' => 0,
                'TYPE' => 'DATA',
                'IS_SURROUNDING' => 0,
-               'CONVERT_TO' => undef
        }
 ]);
 
@@ -200,7 +188,7 @@ $e = {
        'PARENT' => { TYPE => 'STRUCT' },
        'LINE' => 42 };
 
-$ne = ParseElement($e);
+$ne = ParseElement($e, undef);
 is($ne->{REPRESENTATION_TYPE}, "bar");
 
 # representation_type
@@ -213,5 +201,5 @@ $e = {
        'PARENT' => { TYPE => 'STRUCT' },
        'LINE' => 42 };
 
-$ne = ParseElement($e);
+$ne = ParseElement($e, undef);
 is($ne->{REPRESENTATION_TYPE}, "uint8");