From 146c85410946540571fcaf01c85c3a0bffed8cb6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 10 Jul 2005 00:08:48 +0000 Subject: r8268: added the 'needed' logic to ehs generation, so we don't generate 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 | 86 +++++++++++++++++++++++++----- source4/librpc/config.mk | 14 ++++- source4/librpc/idl/irpc.idl | 2 +- 3 files changed, 87 insertions(+), 15 deletions(-) (limited to 'source4') diff --git a/source4/build/pidl/Parse/Pidl/Samba/EJS.pm b/source4/build/pidl/Parse/Pidl/Samba/EJS.pm index 72f280add0..ed35d2d237 100644 --- a/source4/build/pidl/Parse/Pidl/Samba/EJS.pm +++ b/source4/build/pidl/Parse/Pidl/Samba/EJS.pm @@ -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; diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk index 113456c074..665c0920d7 100644 --- a/source4/librpc/config.mk +++ b/source4/librpc/config.mk @@ -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 ################################################ diff --git a/source4/librpc/idl/irpc.idl b/source4/librpc/idl/irpc.idl index c5977ba53e..0d4e305e98 100644 --- a/source4/librpc/idl/irpc.idl +++ b/source4/librpc/idl/irpc.idl @@ -13,7 +13,7 @@ IRPC_FLAG_REPLY = 0x0001 } irpc_flags; - typedef [public] struct { + typedef [public,noejs] struct { GUID uuid; uint32 if_version; uint32 callnum; -- cgit