1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-01 04:58:35 +03:00

pidl/Samba4::NDR::Parser: move logic for extra get_pointer_of() into a function

metze
(This used to be commit 26d7f5bf96cd7e950ceb532402afd6b8a58871ea)
This commit is contained in:
Stefan Metzmacher 2008-02-01 09:49:54 +01:00
parent e22c627ea1
commit 9475a76afc

View File

@ -669,23 +669,39 @@ sub ParsePtrPush($$$$)
} }
} }
sub ParseDataPrint($$$$) sub need_pointer_to($$$)
{ {
my ($self, $e, $l, $var_name) = @_; my ($e, $l, $scalar_only) = @_;
if (not ref($l->{DATA_TYPE}) or
defined($l->{DATA_TYPE}->{NAME})) {
my $t; my $t;
if (ref($l->{DATA_TYPE})) { if (ref($l->{DATA_TYPE})) {
$t = "$l->{DATA_TYPE}->{TYPE}_$l->{DATA_TYPE}->{NAME}"; $t = "$l->{DATA_TYPE}->{TYPE}_$l->{DATA_TYPE}->{NAME}";
} else { } else {
$t = $l->{DATA_TYPE}; $t = $l->{DATA_TYPE};
} }
if (not Parse::Pidl::Typelist::is_scalar($t) or
Parse::Pidl::Typelist::scalar_is_reference($t)) { if (not Parse::Pidl::Typelist::is_scalar($t)) {
return 1 if $scalar_only;
}
if (Parse::Pidl::Typelist::scalar_is_reference($t)) {
return 1;
}
return 0;
}
sub ParseDataPrint($$$$)
{
my ($self, $e, $l, $var_name) = @_;
if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) {
if (need_pointer_to($e, $l, 1)) {
$var_name = get_pointer_to($var_name); $var_name = get_pointer_to($var_name);
} }
$self->pidl("ndr_print_$t(ndr, \"$e->{NAME}\", $var_name);");
$self->pidl(TypeFunctionName("ndr_print", $l->{DATA_TYPE})."(ndr, \"$e->{NAME}\", $var_name);");
} else { } else {
$self->ParseTypePrint($l->{DATA_TYPE}, $var_name); $self->ParseTypePrint($l->{DATA_TYPE}, $var_name);
} }
@ -815,12 +831,11 @@ sub ParseDataPull($$$$$$$)
{ {
my ($self,$e,$l,$ndr,$var_name,$primitives,$deferred) = @_; my ($self,$e,$l,$ndr,$var_name,$primitives,$deferred) = @_;
if (not ref($l->{DATA_TYPE}) or if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) {
defined($l->{DATA_TYPE}->{NAME})) {
my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred); my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
if (Parse::Pidl::Typelist::scalar_is_reference($l->{DATA_TYPE})) { if (need_pointer_to($e, $l, 0)) {
$var_name = get_pointer_to($var_name); $var_name = get_pointer_to($var_name);
} }
@ -845,21 +860,15 @@ sub ParseDataPush($$$$$$$)
my ($self,$e,$l,$ndr,$var_name,$primitives,$deferred) = @_; my ($self,$e,$l,$ndr,$var_name,$primitives,$deferred) = @_;
if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) { if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) {
my $t;
if (ref($l->{DATA_TYPE}) eq "HASH") { my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
$t = "$l->{DATA_TYPE}->{TYPE}_$l->{DATA_TYPE}->{NAME}";
} else {
$t = $l->{DATA_TYPE};
}
# strings are passed by value rather than reference # strings are passed by value rather than reference
if (not Parse::Pidl::Typelist::is_scalar($t) or if (need_pointer_to($e, $l, 1)) {
Parse::Pidl::Typelist::scalar_is_reference($t)) {
$var_name = get_pointer_to($var_name); $var_name = get_pointer_to($var_name);
} }
my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred); $self->pidl("NDR_CHECK(".TypeFunctionName("ndr_push", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
$self->pidl("NDR_CHECK(ndr_push_$t($ndr, $ndr_flags, $var_name));");
} else { } else {
$self->ParseTypePush($l->{DATA_TYPE}, $var_name, $primitives, $deferred); $self->ParseTypePush($l->{DATA_TYPE}, $var_name, $primitives, $deferred);
} }