summaryrefslogtreecommitdiff
path: root/source4/build/pidl
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build/pidl')
-rw-r--r--source4/build/pidl/ndr.pm50
-rw-r--r--source4/build/pidl/validator.pm11
2 files changed, 38 insertions, 23 deletions
diff --git a/source4/build/pidl/ndr.pm b/source4/build/pidl/ndr.pm
index 149d5f93b9..345141285d 100644
--- a/source4/build/pidl/ndr.pm
+++ b/source4/build/pidl/ndr.pm
@@ -199,7 +199,7 @@ sub find_sibling($$)
####################################################################
# work out the name of a size_is() variable
-sub find_size_var($$$)
+sub ParseExpr($$$)
{
my($e) = shift;
my($size) = shift;
@@ -242,7 +242,7 @@ sub find_size_var($$$)
}
#####################################################################
-# check that a variable we get from find_size_var isn't a null pointer
+# check that a variable we get from ParseExpr isn't a null pointer
sub check_null_pointer($)
{
my $size = shift;
@@ -253,7 +253,7 @@ sub check_null_pointer($)
}
#####################################################################
-# check that a variable we get from find_size_var isn't a null pointer
+# check that a variable we get from ParseExpr isn't a null pointer
# void return varient
sub check_null_pointer_void($)
{
@@ -345,19 +345,23 @@ sub align_type
my $dt = $typedefs{$e}->{DATA};
+ return $dt->{ALIGN} if ($dt->{ALIGN});
+
if ($dt->{TYPE} eq "STRUCT") {
- return struct_alignment($dt);
+ $dt->{ALIGN} = struct_alignment($dt);
} elsif($dt->{TYPE} eq "UNION") {
- return struct_alignment($dt);
+ $dt->{ALIGN} = struct_alignment($dt);
} elsif ($dt->{TYPE} eq "ENUM") {
- return align_type(util::enum_type_fn(util::get_enum($e)));
+ $dt->{ALIGN} = align_type(util::enum_type_fn(util::get_enum($e)));
} elsif ($dt->{TYPE} eq "BITMAP") {
- return align_type(util::bitmap_type_fn(util::get_bitmap($e)));
- } elsif ($dt->{TYPE} eq "SCALAR") {
- return $dt->{ALIGN};
- }
+ $dt->{ALIGN} = align_type(util::bitmap_type_fn(util::get_bitmap($e)));
+ }
- die("Internal pidl error. Typedef has unknown data type $dt->{TYPE}!");
+ if (not defined($dt->{ALIGN})) {
+ die("Internal pidl error. Unable to determine alignment for data type $dt->{TYPE}!");
+ }
+
+ return $dt->{ALIGN};
}
#####################################################################
@@ -368,7 +372,7 @@ sub ParseArrayPush($$$)
my $var_prefix = shift;
my $ndr_flags = shift;
- my $size = find_size_var($e, util::array_size($e), $var_prefix);
+ my $size = ParseExpr($e, util::array_size($e), $var_prefix);
if (defined $e->{CONFORMANT_SIZE}) {
# the conformant size has already been pushed
@@ -378,7 +382,7 @@ sub ParseArrayPush($$$)
}
if (my $length = util::has_property($e, "length_is")) {
- $length = find_size_var($e, $length, $var_prefix);
+ $length = ParseExpr($e, $length, $var_prefix);
pidl "\t\tNDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));\n";
pidl "\t\tNDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, $length));\n";
$size = $length;
@@ -397,11 +401,11 @@ sub ParseArrayPrint($$)
{
my $e = shift;
my $var_prefix = shift;
- my $size = find_size_var($e, util::array_size($e), $var_prefix);
+ my $size = ParseExpr($e, util::array_size($e), $var_prefix);
my $length = util::has_property($e, "length_is");
if (defined $length) {
- $size = find_size_var($e, $length, $var_prefix);
+ $size = ParseExpr($e, $length, $var_prefix);
}
if (is_scalar_type($e->{TYPE})) {
@@ -420,7 +424,7 @@ sub CheckArraySizes($$)
if (!defined $e->{CONFORMANT_SIZE} &&
util::has_property($e, "size_is")) {
- my $size = find_size_var($e, util::array_size($e), $var_prefix);
+ my $size = ParseExpr($e, util::array_size($e), $var_prefix);
pidl "\tif ($var_prefix$e->{NAME}) {\n";
check_null_pointer($size);
pidl "\t\tNDR_CHECK(ndr_check_array_size(ndr, (void*)&$var_prefix$e->{NAME}, $size));\n";
@@ -428,7 +432,7 @@ sub CheckArraySizes($$)
}
if (my $length = util::has_property($e, "length_is")) {
- $length = find_size_var($e, $length, $var_prefix);
+ $length = ParseExpr($e, $length, $var_prefix);
pidl "\tif ($var_prefix$e->{NAME}) {\n";
check_null_pointer($length);
pidl "\t\tNDR_CHECK(ndr_check_array_length(ndr, (void*)&$var_prefix$e->{NAME}, $length));\n";
@@ -445,7 +449,7 @@ sub ParseArrayPull($$$)
my $var_prefix = shift;
my $ndr_flags = shift;
- my $size = find_size_var($e, util::array_size($e), $var_prefix);
+ my $size = ParseExpr($e, util::array_size($e), $var_prefix);
my $alloc_size = $size;
# if this is a conformant array then we use that size to allocate, and make sure
@@ -571,7 +575,7 @@ sub ParseElementPullSwitch($$$$)
my($var_prefix) = shift;
my($ndr_flags) = shift;
my $switch = shift;
- my $switch_var = find_size_var($e, $switch, $var_prefix);
+ my $switch_var = ParseExpr($e, $switch, $var_prefix);
my $cprefix = c_pull_prefix($e);
@@ -624,7 +628,7 @@ sub ParseElementPushSwitch($$$$)
my($var_prefix) = shift;
my($ndr_flags) = shift;
my $switch = shift;
- my $switch_var = find_size_var($e, $switch, $var_prefix);
+ my $switch_var = ParseExpr($e, $switch, $var_prefix);
my $cprefix = c_push_prefix($e);
check_null_pointer($switch_var);
@@ -655,7 +659,7 @@ sub ParseElementPrintSwitch($$$)
my($e) = shift;
my($var_prefix) = shift;
my $switch = shift;
- my $switch_var = find_size_var($e, $switch, $var_prefix);
+ my $switch_var = ParseExpr($e, $switch, $var_prefix);
my $cprefix = c_push_prefix($e);
check_null_pointer_void($switch_var);
@@ -856,7 +860,7 @@ sub ParseStructPush($)
# alignment)
my $e = $struct->{ELEMENTS}[-1];
if (defined $e->{ARRAY_LEN} && $e->{ARRAY_LEN} eq "*") {
- my $size = find_size_var($e, util::array_size($e), "r->");
+ my $size = ParseExpr($e, util::array_size($e), "r->");
$e->{CONFORMANT_SIZE} = $size;
check_null_pointer($size);
pidl "\tNDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, $size));\n";
@@ -1673,7 +1677,7 @@ sub AllocateRefVars($)
}
# its an array
- my $size = find_size_var($e, $asize, "r->out.");
+ my $size = ParseExpr($e, $asize, "r->out.");
check_null_pointer($size);
pidl "\tNDR_ALLOC_N(ndr, r->out.$e->{NAME}, $size);\n";
if (util::has_property($e, "in")) {
diff --git a/source4/build/pidl/validator.pm b/source4/build/pidl/validator.pm
index 818611ea46..d496a02309 100644
--- a/source4/build/pidl/validator.pm
+++ b/source4/build/pidl/validator.pm
@@ -47,6 +47,17 @@ sub ValidElement($)
if ($e->{POINTERS} && $e->{ARRAY_LEN}) {
fatal(el_name($e) . " : pidl cannot handle pointers to arrays. Use a substructure instead\n");
}
+
+ if (util::has_property($e, "ptr")) {
+ fatal(el_name($e) . " : pidl does not support full NDR pointers yet\n");
+ }
+
+ if (!$e->{POINTERS} && (
+ util::has_property($e, "ptr") or
+ util::has_property($e, "unique") or
+ util::has_property($e, "ref"))) {
+ fatal(el_name($e) . " : pointer properties on non-pointer element\n");
+ }
}
#####################################################################