summaryrefslogtreecommitdiff
path: root/source4/pidl
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2008-02-01 23:09:37 +0100
committerStefan Metzmacher <metze@samba.org>2008-02-07 08:33:18 +0100
commitc713b58a00b7cb5ef34b101ba5b74c8d9ec505ba (patch)
tree3a1d2778c8251e5a7aa101d03758f2b50d33289b /source4/pidl
parent1ea5b06307b6057297700ce2b65b2055994869e2 (diff)
downloadsamba-c713b58a00b7cb5ef34b101ba5b74c8d9ec505ba.tar.gz
samba-c713b58a00b7cb5ef34b101ba5b74c8d9ec505ba.tar.bz2
samba-c713b58a00b7cb5ef34b101ba5b74c8d9ec505ba.zip
pidl/NDR: fix handling of multilevel pointers in function elements
The 2nd or higher level of wire pointers needs to be marked as deferred. metze (This used to be commit d7970d70329e0d4f9de30ccfcedd03e583817fa2)
Diffstat (limited to 'source4/pidl')
-rw-r--r--source4/pidl/lib/Parse/Pidl/NDR.pm8
-rwxr-xr-xsource4/pidl/tests/ndr.pl20
2 files changed, 14 insertions, 14 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/NDR.pm b/source4/pidl/lib/Parse/Pidl/NDR.pm
index 1106247355..86ed1a8d10 100644
--- a/source4/pidl/lib/Parse/Pidl/NDR.pm
+++ b/source4/pidl/lib/Parse/Pidl/NDR.pm
@@ -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;
diff --git a/source4/pidl/tests/ndr.pl b/source4/pidl/tests/ndr.pl
index 758c3dddb7..504b7ec8de 100755
--- a/source4/pidl/tests/ndr.pl
+++ b/source4/pidl/tests/ndr.pl
@@ -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,