Rev 11529: Handle non-typedef top-level types in file:///home/jelmer/bzr.samba/4.0-nestedpidl/

Jelmer Vernooij jelmer at samba.org
Mon Feb 19 02:25:44 GMT 2007


At file:///home/jelmer/bzr.samba/4.0-nestedpidl/

------------------------------------------------------------
revno: 11529
revision-id: jelmer at samba.org-20070219022523-imfojpling7tb3jh
parent: jelmer at samba.org-20070218232408-0odp1ps0a4ary309
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 4.0-nestedpidl
timestamp: Mon 2007-02-19 03:25:23 +0100
message:
  Handle non-typedef top-level types
modified:
  source/pidl/lib/Parse/Pidl/Samba4/EJS.pm svn-v2:12463 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2flib%2fParse%2fPidl%2fSamba4%2fEJS.pm
=== modified file 'source/pidl/lib/Parse/Pidl/Samba4/EJS.pm'
--- a/source/pidl/lib/Parse/Pidl/Samba4/EJS.pm	2007-02-18 18:44:56 +0000
+++ b/source/pidl/lib/Parse/Pidl/Samba4/EJS.pm	2007-02-19 02:25:23 +0000
@@ -157,7 +157,9 @@
 	    and (defined($pl) and $pl->{TYPE} eq "POINTER")) {
                 $var = get_pointer_to($var);
         }
-	pidl "NDR_CHECK(ejs_pull_$e->{TYPE}(ejs, v, $name, $var));";
+	my $t = $e->{TYPE};
+	if (ref($t) eq "HASH") { $t = $t->{NAME}; }
+	pidl "NDR_CHECK(ejs_pull_$t(ejs, v, $name, $var));";
 }
 
 ###########################
@@ -392,20 +394,24 @@
 
 ###########################
 # generate a structure pull
-sub EjsTypedefPull($)
+sub EjsTypePull($)
 {
 	my $d = shift;
 	return if (has_property($d, "noejs"));
-	if ($d->{DATA}->{TYPE} eq 'STRUCT') {
-		EjsStructPull($d->{NAME}, $d->{DATA});
-	} elsif ($d->{DATA}->{TYPE} eq 'UNION') {
-		EjsUnionPull($d->{NAME}, $d->{DATA});
-	} elsif ($d->{DATA}->{TYPE} eq 'ENUM') {
-		EjsEnumPull($d->{NAME}, $d->{DATA});
-	} elsif ($d->{DATA}->{TYPE} eq 'BITMAP') {
-		EjsBitmapPull($d->{NAME}, $d->{DATA});
+	
+	my $name = $d->{NAME};
+	if ($d->{TYPE} eq "TYPEDEF") { $d = $d->{DATA}; }
+
+	if ($d->{TYPE} eq 'STRUCT') {
+		EjsStructPull($name, $d);
+	} elsif ($d->{TYPE} eq 'UNION') {
+		EjsUnionPull($name, $d);
+	} elsif ($d->{TYPE} eq 'ENUM') {
+		EjsEnumPull($name, $d);
+	} elsif ($d->{TYPE} eq 'BITMAP') {
+		EjsBitmapPull($name, $d);
 	} else {
-		warn "Unhandled pull typedef $d->{NAME} of type $d->{DATA}->{TYPE}";
+		warn "Unhandled pull typedef $name of type $d->{TYPE}";
 	}
 }
 
@@ -455,7 +461,9 @@
 	    or (defined($pl) and $pl->{TYPE} eq "POINTER")) {
                 $var = get_pointer_to($var);
         }
-	pidl "NDR_CHECK(ejs_push_$e->{TYPE}(ejs, v, $name, $var));";
+	my $t = $e->{TYPE};
+	if (ref($t) eq "HASH") { $t = $t->{NAME}; }
+	pidl "NDR_CHECK(ejs_push_$t(ejs, v, $name, $var));";
 }
 
 ###########################
@@ -668,21 +676,26 @@
 
 ###########################
 # generate a structure push
-sub EjsTypedefPush($)
+sub EjsTypePush($)
 {
 	my $d = shift;
 	return if (has_property($d, "noejs"));
 
-	if ($d->{DATA}->{TYPE} eq 'STRUCT') {
-		EjsStructPush($d->{NAME}, $d->{DATA});
-	} elsif ($d->{DATA}->{TYPE} eq 'UNION') {
-		EjsUnionPush($d->{NAME}, $d->{DATA});
-	} elsif ($d->{DATA}->{TYPE} eq 'ENUM') {
-		EjsEnumPush($d->{NAME}, $d->{DATA});
-	} elsif ($d->{DATA}->{TYPE} eq 'BITMAP') {
-		EjsBitmapPush($d->{NAME}, $d->{DATA});
+	my $name = $d->{NAME};
+	if ($d->{TYPE} eq "TYPEDEF") {
+		$d = $d->{DATA};
+	}
+
+	if ($d->{TYPE} eq 'STRUCT') {
+		EjsStructPush($name, $d);
+	} elsif ($d->{TYPE} eq 'UNION') {
+		EjsUnionPush($name, $d);
+	} elsif ($d->{TYPE} eq 'ENUM') {
+		EjsEnumPush($name, $d);
+	} elsif ($d->{TYPE} eq 'BITMAP') {
+		EjsBitmapPush($name, $d);
 	} else {
-		warn "Unhandled push typedef $d->{NAME} of type $d->{DATA}->{TYPE}";
+		warn "Unhandled push typedef $name of type $d->{TYPE}";
 	}
 }
 
@@ -767,8 +780,8 @@
 	pidl_hdr "\n";
 
 	foreach my $d (@{$interface->{TYPES}}) {
-		($needed->{"push_$d->{NAME}"}) && EjsTypedefPush($d);
-		($needed->{"pull_$d->{NAME}"}) && EjsTypedefPull($d);
+		($needed->{"push_$d->{NAME}"}) && EjsTypePush($d);
+		($needed->{"pull_$d->{NAME}"}) && EjsTypePull($d);
 	}
 
 	foreach my $d (@{$interface->{FUNCTIONS}}) {
@@ -875,7 +888,7 @@
 	}
 }
 
-sub NeededTypedef($$)
+sub NeededType($$)
 {
 	my ($t,$needed) = @_;
 
@@ -884,16 +897,20 @@
 		$needed->{"push_$t->{NAME}"} = not has_property($t, "noejs");
 	}
 
-	return if (($t->{DATA}->{TYPE} ne "STRUCT") and 
-			   ($t->{DATA}->{TYPE} ne "UNION"));
-
-	foreach (@{$t->{DATA}->{ELEMENTS}}) {
+	my $name = $t->{NAME};
+
+	if ($t->{TYPE} eq "TYPEDEF") { $t = $t->{DATA}; }
+
+	return if (($t->{TYPE} ne "STRUCT") and 
+			   ($t->{TYPE} ne "UNION"));
+
+	foreach (@{$t->{ELEMENTS}}) {
 		next if (has_property($_, "subcontext")); #FIXME: Support subcontexts
 		unless (defined($needed->{"pull_$_->{TYPE}"})) {
-			$needed->{"pull_$_->{TYPE}"} = $needed->{"pull_$t->{NAME}"};
+			$needed->{"pull_$_->{TYPE}"} = $needed->{"pull_$name"};
 		}
 		unless (defined($needed->{"push_$_->{TYPE}"})) {
-			$needed->{"push_$_->{TYPE}"} = $needed->{"push_$t->{NAME}"};
+			$needed->{"push_$_->{TYPE}"} = $needed->{"push_$name"};
 		}
 	}
 }
@@ -905,7 +922,7 @@
 	my ($interface,$needed) = @_;
 
 	NeededFunction($_, $needed) foreach (@{$interface->{FUNCTIONS}});
-	NeededTypedef($_, $needed) foreach (reverse @{$interface->{TYPES}});
+	NeededType($_, $needed) foreach (reverse @{$interface->{TYPES}});
 }
 
 1;



More information about the samba-cvs mailing list