r9519: Use the value() value of an element when that element is used in
authorJelmer Vernooij <jelmer@samba.org>
Tue, 23 Aug 2005 13:19:33 +0000 (13:19 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:34:26 +0000 (13:34 -0500)
limited expressions (size_is,length_is,subcontext_size,etc)

source/librpc/idl/drsuapi.idl
source/pidl/lib/Parse/Pidl/Samba/NDR/Parser.pm

index 289f5110e2ca3d8c7ca922db34bd1b8f5640b3c0..66aa527039a95d6621138b28c5bd21e14f8bbe8a 100644 (file)
@@ -444,7 +444,7 @@ interface drsuapi
 
        typedef struct {
                [range(0,10485760),value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(object, ndr->flags))] uint32 __ndr_size;
-               [subcontext(4)] drsuapi_DsReplicaObjectIdentifier3 *object;
+               [subcontext(4),subcontext_size(__ndr_size)] drsuapi_DsReplicaObjectIdentifier3 *object;
        } drsuapi_DsAttributeValueDNString;
 
        typedef struct {
index ef22ff97886e1f04149e2eba2862da4bdbb986aa..513fa0826ddcedaf6ed5c15089fc6df3cd043c7c 100644 (file)
@@ -235,6 +235,20 @@ sub GenerateStructEnv($)
        return \%env;
 }
 
+sub EnvSubstituteValue($$)
+{
+       my ($env,$s) = @_;
+
+       # Substitute the value() values in the env
+       foreach my $e (@{$s->{ELEMENTS}}) {
+               next unless (my $v = has_property($e, "value"));
+               
+               $env->{$e->{NAME}} = ParseExpr($v, $env);
+       }
+
+       return $env;
+}
+
 sub GenerateFunctionInEnv($)
 {
        my $fn = shift;
@@ -1095,6 +1109,8 @@ sub ParseStructPush($$)
 
        my $env = GenerateStructEnv($struct);
 
+       EnvSubstituteValue($env, $struct);
+
        # save the old relative_base_offset
        pidl "uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);" if defined($struct->{PROPERTIES}{relative_base});
 
@@ -1326,6 +1342,8 @@ sub ParseStructPrint($$)
 
        my $env = GenerateStructEnv($struct);
 
+       EnvSubstituteValue($env, $struct);
+
        foreach my $e (@{$struct->{ELEMENTS}}) {
                DeclareArrayVariables($e);
        }
@@ -1870,6 +1888,7 @@ sub ParseFunctionPrint($)
        pidl "ndr->depth++;";
 
        my $env = GenerateFunctionInEnv($fn);
+       EnvSubstituteValue($env, $fn);
 
        foreach my $e (@{$fn->{ELEMENTS}}) {
                if (grep(/in/,@{$e->{DIRECTION}})) {
@@ -1925,6 +1944,8 @@ sub ParseFunctionPush($)
 
        my $env = GenerateFunctionInEnv($fn);
 
+       EnvSubstituteValue($env, $fn);
+
        foreach my $e (@{$fn->{ELEMENTS}}) {
                if (grep(/in/,@{$e->{DIRECTION}})) {
                        ParseElementPush($e, "ndr", "r->in.", $env, 1, 1);