pidl/NDR: give anonymous structs and unions a name
authorStefan Metzmacher <metze@samba.org>
Sat, 18 Sep 2010 17:40:52 +0000 (19:40 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 4 Jun 2019 11:14:55 +0000 (13:14 +0200)
metze

pidl/lib/Parse/Pidl/NDR.pm

index 003156e3a11ef7efce7195afe0cb4e12c4ba183d..60428c99a7ee541499ff2cf3ed362ac492bdb6be 100644 (file)
@@ -521,15 +521,39 @@ sub ParseElement($$$)
        };
 }
 
+sub ParseName($)
+{
+       my ($e) = @_;
+       my $name = $e->{NAME};
+
+       return $name if defined($name);
+
+       my $parent = $e->{PARENT};
+       my $parent_name = undef;
+
+       while (not defined($parent_name)) {
+               last unless defined($parent);
+
+               $parent_name = $parent->{NAME};
+               $parent = $parent->{PARENT};
+       }
+
+       $parent_name = "global" unless defined($parent_name);
+       $name = "__pidl_".$e->{TYPE}."_".$parent_name."_".$e->{LINE};
+
+       return $name;
+}
+
 sub ParseStruct($$$)
 {
        my ($struct, $pointer_default, $ms_union) = @_;
        my @elements = ();
        my $surrounding = undef;
+       my $name = ParseName($struct);
 
        return {
                TYPE => "STRUCT",
-               NAME => $struct->{NAME},
+               NAME => $name,
                SURROUNDING_ELEMENT => undef,
                ELEMENTS => undef,
                PROPERTIES => $struct->{PROPERTIES},
@@ -560,14 +584,11 @@ sub ParseStruct($$$)
                $surrounding = $struct->{ELEMENTS}[-1];
        }
 
-       my $align = undef;
-       if ($struct->{NAME}) {
-               $align = align_type($struct->{NAME});
-       }
-               
+       my $align = align_type($name);
+
        return {
                TYPE => "STRUCT",
-               NAME => $struct->{NAME},
+               NAME => $name,
                SURROUNDING_ELEMENT => $surrounding,
                ELEMENTS => \@elements,
                PROPERTIES => $struct->{PROPERTIES},
@@ -586,10 +607,11 @@ sub ParseUnion($$)
        my $switch_type = has_property($e, "switch_type");
        unless (defined($switch_type)) { $switch_type = "uint32"; }
        if (has_property($e, "nodiscriminant")) { $switch_type = undef; }
+       my $name = ParseName($e);
 
        return {
                TYPE => "UNION",
-               NAME => $e->{NAME},
+               NAME => $name,
                SWITCH_TYPE => $switch_type,
                ELEMENTS => undef,
                PROPERTIES => $e->{PROPERTIES},
@@ -620,14 +642,11 @@ sub ParseUnion($$)
                push @elements, $t;
        }
 
-       my $align = undef;
-       if ($e->{NAME}) {
-               $align = align_type($e->{NAME});
-       }
+       my $align = align_type($name);
 
        return {
                TYPE => "UNION",
-               NAME => $e->{NAME},
+               NAME => $name,
                SWITCH_TYPE => $switch_type,
                ELEMENTS => \@elements,
                PROPERTIES => $e->{PROPERTIES},
@@ -641,10 +660,11 @@ sub ParseUnion($$)
 sub ParseEnum($$)
 {
        my ($e, $pointer_default, $ms_union) = @_;
+       my $name = ParseName($e);
 
        return {
                TYPE => "ENUM",
-               NAME => $e->{NAME},
+               NAME => $name,
                BASE_TYPE => Parse::Pidl::Typelist::enum_type_fn($e),
                ELEMENTS => $e->{ELEMENTS},
                PROPERTIES => $e->{PROPERTIES},
@@ -655,10 +675,11 @@ sub ParseEnum($$)
 sub ParseBitmap($$$)
 {
        my ($e, $pointer_default, $ms_union) = @_;
+       my $name = ParseName($e);
 
        return {
                TYPE => "BITMAP",
-               NAME => $e->{NAME},
+               NAME => $name,
                BASE_TYPE => Parse::Pidl::Typelist::bitmap_type_fn($e),
                ELEMENTS => $e->{ELEMENTS},
                PROPERTIES => $e->{PROPERTIES},