TODO: pidl fix frstrans_Update...
authorStefan Metzmacher <metze@samba.org>
Thu, 26 Sep 2013 05:41:45 +0000 (07:41 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 4 Jun 2019 11:15:20 +0000 (13:15 +0200)
pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm

index 1d102d8aec83867a19a14fceb66803f3a5bbff2a..91c62930ccce8d202fce40b36d3d0e1c0d2f99d1 100644 (file)
@@ -1066,12 +1066,26 @@ sub ParseMemCtxPullFlags($$$$)
 {
        my ($self, $e, $l) = @_;
 
+       my $alloc_array = 0;
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $alloc_array = 1;
+       }
+
        return undef unless ($l->{TYPE} eq "POINTER" or $l->{TYPE} eq "ARRAY");
        return undef if (($l->{TYPE} eq "POINTER") and ($l->{POINTER_TYPE} eq "ignore"));
 
        return undef unless ($l->{TYPE} ne "ARRAY" or ArrayDynamicallyAllocated($e,$l));
        return undef if has_fast_array($e, $l);
-       return undef if is_charset_array($e, $l);
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $self->pidl("/* METZE: $e->{NAME} ParseMemCtxPullFlags */");
+       }
+       return undef if is_charset_array($e, $l) and not $alloc_array;
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $self->pidl("/* METZE: $e->{NAME} ParseMemCtxPullFlags */");
+       }
 
        my $mem_flags = "0";
 
@@ -1097,8 +1111,16 @@ sub ParseMemCtxPullStart($$$$$)
        my $mem_c_ctx = $ptr_name;
        my $mem_c_flags = $self->ParseMemCtxPullFlags($e, $l);
 
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $self->pidl("/* METZE: $e->{NAME} ParseMemCtxPullStart ".defined($mem_c_flags)."*/");
+       }
        return unless defined($mem_c_flags);
 
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $self->pidl("/* METZE: $e->{NAME} ParseMemCtxPullStart ".defined($mem_c_flags)."*/");
+       }
        $self->pidl("$mem_r_ctx = NDR_PULL_GET_MEM_CTX($ndr);");
        $self->pidl("NDR_PULL_SET_MEM_CTX($ndr, $mem_c_ctx, $mem_c_flags);");
 }
@@ -1139,6 +1161,27 @@ sub ParseElementPullLevel
                return;
        }
 
+#'LEVELS' => [
+#              {
+#                'LEVEL_INDEX' => 0,
+#                'IS_VARYING' => 1,
+#                'IS_CONFORMANT' => 0,
+#                'SIZE_IS' => '261',
+#                'TYPE' => 'ARRAY',
+#                'IS_TO_NULL' => 0,
+#                'IS_FIXED' => 0,
+#                'IS_ZERO_TERMINATED' => 1,
+#                'IS_DEFERRED' => 0,
+#                'LENGTH_IS' => '261',
+#                'IS_INLINE' => 0,
+#                'IS_SURROUNDING' => 0
+#              },
+
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $self->pidl("/* METZE: $e->{NAME} ParseElementPullLevel*/");
+       }
+
        if ($l->{TYPE} eq "ARRAY" and ($l->{IS_VARYING} or $l->{IS_CONFORMANT})) {
                $var_name = get_pointer_to($var_name);
        }
@@ -1152,10 +1195,12 @@ sub ParseElementPullLevel
                } elsif ($l->{TYPE} eq "ARRAY") {
                        my $length = $self->ParseArrayPullHeader($e, $l, $ndr, $var_name, $env);
                        $array_length = $length;
+                       my $array_name = $var_name;
 
                        my $nl = GetNextLevel($e, $l);
 
                        if (is_charset_array($e,$l)) {
+                               $self->ParseMemCtxPullStart($e, $l, $ndr, $array_name);
                                if ($l->{IS_ZERO_TERMINATED}) {
                                        $self->CheckStringTerminator($ndr, $e, $l, $length);
                                }
@@ -1164,12 +1209,16 @@ sub ParseElementPullLevel
                                } else {
                                        $self->pidl("NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));");
                                }
+                               $self->ParseMemCtxPullEnd($e, $l, $ndr);
                                return;
                        } elsif (has_fast_array($e, $l)) {
+                               $self->ParseMemCtxPullStart($e, $l, $ndr, $array_name);
+
                                if ($l->{IS_ZERO_TERMINATED}) {
                                        $self->CheckStringTerminator($ndr,$e,$l,$length);
                                }
                                $self->pidl("NDR_CHECK(ndr_pull_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));");
+                               $self->ParseMemCtxPullEnd($e, $l, $ndr);
                                return;
                        }
                } elsif ($l->{TYPE} eq "POINTER") {