WORKS!!!...pidl/NDR: fix handling of multilevel pointers in function elements
authorStefan Metzmacher <metze@samba.org>
Fri, 1 Feb 2008 22:09:37 +0000 (23:09 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 1 Feb 2008 22:15:16 +0000 (23:15 +0100)
The 2nd or higher level of wire pointers needs to be marked as deferred.

metze

source/pidl/lib/Parse/Pidl/NDR.pm
source/pidl/tests/ndr.pl

index 7d8907c6b58bb9fa757fda60f3a92e7cb2618414..003eaf0ba74d34787818574f666f851ca91539f4 100644 (file)
@@ -173,9 +173,9 @@ sub GetElementLevelTable($$)
                #
                # --metze
                #
-               if ($i == 1) {
-                       $pt = pointer_type($e);
-               } else {
+               $pt = pointer_type($e);
+               if ($i > 1) {
+                       $is_deferred = 1 if ($pt ne "ref" and $e->{PARENT}->{TYPE} eq "FUNCTION");
                        $pt = $pointer_default;
                }
 
@@ -195,7 +195,7 @@ sub GetElementLevelTable($$)
                $pointer_idx++;
                
                # everything that follows will be deferred
-               $is_deferred = 1 if ($e->{PARENT}->{TYPE} ne "FUNCTION");
+               $is_deferred = 1 if ($level ne "TOP");
 
                my $array_size = shift @size_is;
                my $array_length;
index 758c3dddb7b536335f3704c1eb3b83831c130bfc..504b7ec8dedba221ad6676a9a81d37f96aadbdf4 100755 (executable)
@@ -299,14 +299,14 @@ is_deeply(GetElementLevelTable($e, "unique"), [
        },
        {
                LEVEL_INDEX => 2,
-               IS_DEFERRED => 0,
+               IS_DEFERRED => 1,
                TYPE => 'POINTER',
                POINTER_TYPE => "unique",
                POINTER_INDEX => 2,
                LEVEL => 'EMBEDDED'
        },
        {
-               'IS_DEFERRED' => 0,
+               'IS_DEFERRED' => 1,
                'LEVEL_INDEX' => 3,
                'DATA_TYPE' => 'uint8',
                'CONTAINS_DEFERRED' => 0,
@@ -337,7 +337,7 @@ is_deeply(GetElementLevelTable($e, "unique"), [
        },
        {
                LEVEL_INDEX => 1,
-               IS_DEFERRED => 0,
+               IS_DEFERRED => 1,
                TYPE => 'POINTER',
                POINTER_TYPE => "unique",
                POINTER_INDEX => 1,
@@ -345,14 +345,14 @@ is_deeply(GetElementLevelTable($e, "unique"), [
        },
        {
                LEVEL_INDEX => 2,
-               IS_DEFERRED => 0,
+               IS_DEFERRED => 1,
                TYPE => 'POINTER',
                POINTER_TYPE => "unique",
                POINTER_INDEX => 2,
                LEVEL => 'EMBEDDED'
        },
        {
-               'IS_DEFERRED' => 0,
+               'IS_DEFERRED' => 1,
                'LEVEL_INDEX' => 3,
                'DATA_TYPE' => 'uint8',
                'CONTAINS_DEFERRED' => 0,
@@ -383,7 +383,7 @@ is_deeply(GetElementLevelTable($e, "ref"), [
        },
        {
                LEVEL_INDEX => 1,
-               IS_DEFERRED => 0,
+               IS_DEFERRED => 1,
                TYPE => 'POINTER',
                POINTER_TYPE => "ref",
                POINTER_INDEX => 1,
@@ -391,14 +391,14 @@ is_deeply(GetElementLevelTable($e, "ref"), [
        },
        {
                LEVEL_INDEX => 2,
-               IS_DEFERRED => 0,
+               IS_DEFERRED => 1,
                TYPE => 'POINTER',
                POINTER_TYPE => "ref",
                POINTER_INDEX => 2,
                LEVEL => 'EMBEDDED'
        },
        {
-               'IS_DEFERRED' => 0,
+               'IS_DEFERRED' => 1,
                'LEVEL_INDEX' => 3,
                'DATA_TYPE' => 'uint8',
                'CONTAINS_DEFERRED' => 0,
@@ -437,14 +437,14 @@ is_deeply(GetElementLevelTable($e, "ref"), [
        },
        {
                LEVEL_INDEX => 2,
-               IS_DEFERRED => 0,
+               IS_DEFERRED => 1,
                TYPE => 'POINTER',
                POINTER_TYPE => "ref",
                POINTER_INDEX => 2,
                LEVEL => 'EMBEDDED'
        },
        {
-               'IS_DEFERRED' => 0,
+               'IS_DEFERRED' => 1,
                'LEVEL_INDEX' => 3,
                'DATA_TYPE' => 'uint8',
                'CONTAINS_DEFERRED' => 0,