summaryrefslogtreecommitdiff
path: root/source4/pidl/expr.yp
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2007-02-07 19:03:19 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:44:48 -0500
commitecf2c1effb778a95fd863a5e87ec7e378d228b57 (patch)
tree8b94782e07399490d6390e066c557af8c04aefc1 /source4/pidl/expr.yp
parent2811e18da0d8dae2e2560c11a28450ae8b2a98d5 (diff)
downloadsamba-ecf2c1effb778a95fd863a5e87ec7e378d228b57.tar.gz
samba-ecf2c1effb778a95fd863a5e87ec7e378d228b57.tar.bz2
samba-ecf2c1effb778a95fd863a5e87ec7e378d228b57.zip
r21222: Merge a couple of pidl fixes:
* Pidl will now warn when trying to use pointers as integers in expressions. * "subcontext()" is now marked as deprecated. The alternatives, transmit_as() / represent_as() should be available soon. * More tests. * Remove some unused code in smbtorture. (This used to be commit 37c0da541e3962164d5af3e3c9560803a733f3b7)
Diffstat (limited to 'source4/pidl/expr.yp')
-rw-r--r--source4/pidl/expr.yp34
1 files changed, 28 insertions, 6 deletions
diff --git a/source4/pidl/expr.yp b/source4/pidl/expr.yp
index 6faef27588..a8074875ff 100644
--- a/source4/pidl/expr.yp
+++ b/source4/pidl/expr.yp
@@ -21,9 +21,7 @@
exp: NUM
| TEXT { "\"$_[1]\"" }
| func
- | exp '.' VAR { "$_[1].$_[3]" }
- | VAR { $_[0]->_Lookup($_[1]) }
- | '*' exp %prec DEREF { $_[0]->_Dereference($_[2]); "*$_[2]" }
+ | var
| '~' exp %prec INV { "~$_[2]" }
| exp '+' exp { "$_[1] + $_[3]" }
| exp '-' exp { "$_[1] - $_[3]" }
@@ -41,7 +39,6 @@ exp: NUM
| exp '||' exp { "$_[1] || $_[3]" }
| exp '&&' exp { "$_[1] && $_[3]" }
| exp '&' exp { "$_[1] & $_[3]" }
- | exp '->' VAR { $_[1]."->".$_[3] }
| exp '?' exp ':' exp { "$_[1]?$_[3]:$_[5]" }
| '~' exp { "~$_[1]" }
| '!' exp { "not $_[1]" }
@@ -52,9 +49,24 @@ exp: NUM
| '(' exp ')' { "($_[2])" }
;
+possible_pointer:
+ VAR { $_[0]->_Lookup($_[1]) }
+ | '*' possible_pointer %prec DEREF { $_[0]->_Dereference($_[2]); "*$_[2]" }
+ ;
+
+var: possible_pointer { $_[0]->_Use($_[1]) }
+ | var '.' VAR { $_[0]->_Use("$_[1].$_[3]") }
+ | '(' var ')' { "($_[2])" }
+ | var '->' VAR { $_[0]->_Use("*$_[1]"); $_[1]."->".$_[3] }
+;
+
+
func: VAR '(' opt_args ')' { "$_[1]($_[3])" };
opt_args: { "" } | args;
-args: exp | exp ',' args { "$_[1], $_[3]" };
+exp_or_possible_pointer: exp | possible_pointer;
+args: exp_or_possible_pointer
+ | exp_or_possible_pointer ',' args { "$_[1], $_[3]" }
+;
%%
@@ -93,6 +105,15 @@ sub _Lexer {
}
}
+sub _Use($$)
+{
+ my ($self, $x) = @_;
+ if (defined($self->YYData->{USE})) {
+ return $self->YYData->{USE}->($x);
+ }
+ return $x;
+}
+
sub _Lookup($$)
{
my ($self, $x) = @_;
@@ -118,11 +139,12 @@ sub _Error($)
}
sub Run {
- my($self, $data, $error, $lookup, $deref) = @_;
+ my($self, $data, $error, $lookup, $deref, $use) = @_;
$self->YYData->{FULL_INPUT} = $data;
$self->YYData->{INPUT} = $data;
$self->YYData->{LOOKUP} = $lookup;
$self->YYData->{DEREFERENCE} = $deref;
$self->YYData->{ERROR} = $error;
+ $self->YYData->{USE} = $use;
return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error);
}