r8268: added the 'needed' logic to ehs generation, so we don't generate
authorAndrew Tridgell <tridge@samba.org>
Sun, 10 Jul 2005 00:08:48 +0000 (00:08 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:19:28 +0000 (13:19 -0500)
functions we don't need. That is a lot of functions, as ejs is only
client side, so it only needs push functions for [out] vars, and pull
functions for [in] vars

added irpc and srvsvc IDL to list of available pipes.
(This used to be commit c7a9dbe70a39156a20e56b4dd732fd838437eecd)

source4/build/pidl/Parse/Pidl/Samba/EJS.pm
source4/librpc/config.mk
source4/librpc/idl/irpc.idl

index 72f280add039f79c8f5511c21c4eb32df7f9b6df..ed35d2d2375df19a6e61f03c5d7a063f62a390ff 100644 (file)
@@ -122,11 +122,12 @@ sub EjsPullScalar($$$$$)
 
        return if (Parse::Pidl::Util::has_property($e, "value"));
 
-       $var = get_pointer_to($var);
-       # have to handle strings specially :(
-       if ($e->{TYPE} eq "string") {
-               $var = get_pointer_to($var);
-       }
+        my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l);
+        $var = get_pointer_to($var);
+        # have to handle strings specially :(
+        if ($e->{TYPE} eq "string" && $pl && $pl->{TYPE} eq "POINTER") {
+                $var = get_pointer_to($var);
+        }
        pidl "NDR_CHECK(ejs_pull_$e->{TYPE}(ejs, v, $name, $var));";
 }
 
@@ -369,7 +370,11 @@ sub EjsPullFunction($)
 sub EjsPushScalar($$$$$)
 {
        my ($e, $l, $var, $name, $env) = @_;
-       $var = get_pointer_to($var);
+        # have to handle strings specially :(
+        my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l);
+        if ($e->{TYPE} ne "string" || ($pl && $pl->{TYPE} eq "POINTER")) {
+                $var = get_pointer_to($var);
+        }
        pidl "NDR_CHECK(ejs_push_$e->{TYPE}(ejs, v, $name, $var));";
 }
 
@@ -645,17 +650,17 @@ sub EjsConst($)
 
 #####################################################################
 # parse the interface definitions
-sub EjsInterface($)
+sub EjsInterface($$)
 {
-       my($interface) = shift;
+       my($interface,$needed) = @_;
        my @fns = ();
        my $name = $interface->{NAME};
 
        %constants = ();
 
        foreach my $d (@{$interface->{TYPEDEFS}}) {
-               EjsTypedefPush($d);
-               EjsTypedefPull($d);
+               ($needed->{"push_$d->{NAME}"}) && EjsTypedefPush($d);
+               ($needed->{"pull_$d->{NAME}"}) && EjsTypedefPull($d);
        }
 
        foreach my $d (@{$interface->{FUNCTIONS}}) {
@@ -722,13 +727,68 @@ sub Parse($$)
 #include \"$ejs_hdr\"
 
 ";
+
+    my %needed = ();
+
+    foreach my $x (@{$ndr}) {
+           ($x->{TYPE} eq "INTERFACE") && NeededInterface($x, \%needed);
+    }
+
     foreach my $x (@{$ndr}) {
-           if ($x->{TYPE} eq "INTERFACE") {
-                   ($x->{TYPE} eq "INTERFACE") && EjsInterface($x);
-           }
+           ($x->{TYPE} eq "INTERFACE") && EjsInterface($x, \%needed);
     }
 
     return $res;
 }
 
+
+sub NeededFunction($$)
+{
+       my ($fn,$needed) = @_;
+       $needed->{"pull_$fn->{NAME}"} = 1;
+       $needed->{"push_$fn->{NAME}"} = 1;
+       foreach my $e (@{$fn->{ELEMENTS}}) {
+               if (grep (/in/, @{$e->{DIRECTION}})) {
+                       $needed->{"pull_$e->{TYPE}"} = 1;
+               }
+               if (grep (/out/, @{$e->{DIRECTION}})) {
+                       $needed->{"push_$e->{TYPE}"} = 1;
+               }
+       }
+}
+
+sub NeededTypedef($$)
+{
+       my ($t,$needed) = @_;
+       if (Parse::Pidl::Util::has_property($t, "public")) {
+               $needed->{"pull_$t->{NAME}"} = not Parse::Pidl::Util::has_property($t, "noejs");
+               $needed->{"push_$t->{NAME}"} = not Parse::Pidl::Util::has_property($t, "noejs");
+       }
+       if ($t->{DATA}->{TYPE} ne "STRUCT" && 
+           $t->{DATA}->{TYPE} ne "UNION") {
+               return;
+       }
+       for my $e (@{$t->{DATA}->{ELEMENTS}}) {
+               if ($needed->{"pull_$t->{NAME}"}) {
+                       $needed->{"pull_$e->{TYPE}"} = 1;
+               }
+               if ($needed->{"push_$t->{NAME}"}) {
+                       $needed->{"push_$e->{TYPE}"} = 1;
+               }
+       }
+}
+
+#####################################################################
+# work out what parse functions are needed
+sub NeededInterface($$)
+{
+       my ($interface,$needed) = @_;
+       foreach my $d (@{$interface->{FUNCTIONS}}) {
+           NeededFunction($d, $needed);
+       }
+       foreach my $d (reverse @{$interface->{TYPEDEFS}}) {
+           NeededTypedef($d, $needed);
+       }
+}
+
 1;
index 113456c0745b4a0b04a5e61828c9d4a7167d6b2e..665c0920d74586420c91874c73bb3ffdb32af196 100644 (file)
@@ -629,10 +629,22 @@ OBJ_FILES = librpc/gen_ndr/ndr_netlogon_ejs.o
 REQUIRED_SUBSYSTEMS = RPC NDR_NETLOGON
 NOPROTO = YES
 
+[SUBSYSTEM::RPC_EJS_SVCCTL]
+INIT_FUNCTION = ejs_init_svcctl
+OBJ_FILES = librpc/gen_ndr/ndr_svcctl_ejs.o
+REQUIRED_SUBSYSTEMS = RPC NDR_SVCCTL
+NOPROTO = YES
+
+[SUBSYSTEM::RPC_EJS_IRPC]
+INIT_FUNCTION = ejs_init_irpc
+OBJ_FILES = librpc/gen_ndr/ndr_irpc_ejs.o
+REQUIRED_SUBSYSTEMS = RPC NDR_IRPC
+NOPROTO = YES
+
 ################################################
 # Start SUBSYSTEM RPC_EJS
 [SUBSYSTEM::RPC_EJS]
 REQUIRED_SUBSYSTEMS = RPC_EJS_ECHO RPC_EJS_MISC RPC_EJS_SAMR RPC_EJS_SECURITY \
-       RPC_EJS_LSA 
+       RPC_EJS_LSA RPC_EJS_SRVSVC RPC_EJS_SVCCTL RPC_EJS_IRPC
 # End SUBSYSTEM RPC_EJS
 ################################################
index c5977ba53e94fa3099541ce91fb79309c1c5e956..0d4e305e988dac12e593e59d12be4e87d564d879 100644 (file)
@@ -13,7 +13,7 @@
                IRPC_FLAG_REPLY    = 0x0001
        } irpc_flags;
 
-       typedef [public] struct {
+       typedef [public,noejs] struct {
                GUID uuid;
                uint32 if_version;
                uint32 callnum;