Inline_op should use shared dynamic stack
-----------------------------------------

                 Key: PIG-2138
                 URL: https://issues.apache.org/jira/browse/PIG-2138
             Project: Pig
          Issue Type: Improvement
            Reporter: Gianmarco De Francisci Morales


The way inline_op saves and restores the statement state is brittle and can 
lead to bugs.
To work around the issue one needs to be careful when writing rules not to 
include operations that can include inline_op in the evaluation of syntactic 
predicates for disambiguation of LL(*) rules.

The interaction between inline_op, the statement scope and the syntactic 
predicates that get executed to choose between alternative op versions can null 
the statement::alias without restoring it.

inline_op stores the statement::alias locally and sets it to null in @init, and 
later in @after restores it to the previous value.
When inline_op gets executed inside a syntactic predicate, @init always gets 
executed, @after does not instead.
So the statement::alias doesn't get back its value and it can lead to an NPE.

This behavior is dangerous, because it messes with global structures.
@init and @after are used to mimic a stack behavior.
What inline_op needs is a local statement scope, so that inline_op could just 
push another initialized scope on the stack, and get it popped when the 
syntactic predicate exits the rule, restoring the old state automatically.

This will also help in the long run to support arbitrarily nested statements.
Unfortunately this also requires to rewrite the whole grammar.
Every rule that accesses statement::alias (or any attribute in statement:: 
scope) should be rewritten to get a reference to the local scope of the 
statement.

The implementation can make use of dynamic shared scope between inline_op and 
statement (very much like GScope).
ANTLR will automatically push and pop a stack frame when the rule is invoked 
and when it gets out of the rule.
The @init will get executed to initialize members in the scope. Even though the 
@after doesn't get executed because we are in a syntactic predicate, the frame 
is popped from the stack nonetheless.


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to