« Return to Thread: [janino-dev] [jira] Created: (JANINO-116) Need a Java.StatementList for more flexibility in generating ASTs

[janino-dev] [jira] Commented: (JANINO-116) Need a Java.StatementList for more flexibility in generating ASTs

by JIRA jira@codehaus.org :: Rate this Message:

Reply to Author | View in Thread


    [ http://jira.codehaus.org/browse/JANINO-116?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=136367#action_136367 ]

Matt Fowles commented on JANINO-116:
------------------------------------

Consider the following block of code which is fairly idiomatic of things done in our system.

{code}
public CValue take(StmtContainer block, final CValue value) {
    //take lazily
    final CValue[] taken = new CValue[schema.getFieldCount()];
    final CValue[] values = new CValue[schema.getFieldCount()];
    for(Field f : schema.getFields()) {
        values[f.getIndex()] = createSubValue(value, f);
    }
       
    //use a statement sequence so we inject the code here
    //instead of some later place in the block when ref() gets called
    final CG.StmtSequence stmtSeq = new CG.StmtSequence();
    block.add(stmtSeq);
       
       
    return new CValue(this) {
        @Override
        public Expr ref(int i) {
            if(i == NULL_REF) {
                return value.ref(i);
            }
            int offset = getFieldOffsetForRef(i);
            int remainder = getFieldRefForRef(i);
            if(taken[offset] == null) {
                taken[offset] = values[offset].take(stmtSeq);
            }
            return taken[offset].ref(remainder);
        }
    };
}
{code}

The contract for this method only allows it to insert values into block at the current position (if it were to put them intervening code could change the value of things upon which it depends).  However, we won't necessarily need all of the sub values that could be computed by this block.  Hence the method inserts a place holder item into the block, so that it can always inject code at this point.  Then it lazily fills in the code when it knows which values are needed.

I believe that this sort of a feature would be more generally useful to anyone targeting the Janino AST, and it really does not add much complexity to the Janino code base.

> Need a Java.StatementList for more flexibility in generating ASTs
> -----------------------------------------------------------------
>
>                 Key: JANINO-116
>                 URL: http://jira.codehaus.org/browse/JANINO-116
>             Project: Janino
>          Issue Type: New Feature
>            Reporter: Matt Fowles
>            Assignee: Arno Unkrig
>         Attachments: janino-full.patch, statement-list.patch
>
>
> StatementLists provide a way to put a place holder statement somewhere, and then fill it in later with only things that are needed.  The big difference between this and a block is that it very explicitly does not introduce a new scope, so that it can be used to inject variables that will be visible.
> The attached patch includes an implementation of this request and tests for it.  It also includes the fixes in:
> http://jira.codehaus.org/browse/JANINO-111
> http://jira.codehaus.org/browse/JANINO-112
> http://jira.codehaus.org/browse/JANINO-113
> http://jira.codehaus.org/browse/JANINO-115
> This flexibility is needed for the inclusion of Janino in my project.  I am nearly finished integrating Janino as our backend bytecode generation system and it is currently passing our nightly test suite of over 9,000 tests with this patch.

--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


 « Return to Thread: [janino-dev] [jira] Created: (JANINO-116) Need a Java.StatementList for more flexibility in generating ASTs