diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2007-02-07 19:03:19 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 14:44:48 -0500 |
commit | ecf2c1effb778a95fd863a5e87ec7e378d228b57 (patch) | |
tree | 8b94782e07399490d6390e066c557af8c04aefc1 /source4/pidl/expr.yp | |
parent | 2811e18da0d8dae2e2560c11a28450ae8b2a98d5 (diff) | |
download | samba-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.yp | 34 |
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); } |