Dmitri Blinov created JEXL-321:
----------------------------------

             Summary: Empty do-while loop is broken
                 Key: JEXL-321
                 URL: https://issues.apache.org/jira/browse/JEXL-321
             Project: Commons JEXL
          Issue Type: Bug
    Affects Versions: 3.1
            Reporter: Dmitri Blinov


The following test case with AIOOB.
{code:java}
    @Test
    public void testEmptyBody() throws Exception {
        JexlScript e = JEXL.createScript("var i = 0; do ; while((i+=1) < 10); 
i");
        JexlContext jc = new MapContext();
        Object o = e.execute(jc);
        Assert.assertEquals(10, o);       
    } {code}
The suggestion is to change interpreter as follows
{code}
    @Override
    protected Object visit(ASTDoWhileStatement node, Object data) {
        Object result = null;
        /* last objectNode is the expression */
        Node expressionNode = node.jjtGetChild(node.jjtGetNumChildren()-1);
        do {
            cancelCheck(node);
            if (node.jjtGetNumChildren() > 1) {
                try {
                    // execute statement
                    result = node.jjtGetChild(0).jjtAccept(this, data);
                } catch (JexlException.Break stmtBreak) {
                    break;
                } catch (JexlException.Continue stmtContinue) {
                    //continue;
                }
            }
        } while (arithmetic.toBoolean(expressionNode.jjtAccept(this, data)));
        return result;
    }
{code} and Debugger as follows
{code}
    @Override
    protected Object visit(ASTDoWhileStatement node, Object data) {
        int num = node.jjtGetNumChildren();
        builder.append("do ");
        if (num > 1) {
            acceptStatement(node.jjtGetChild(0), data);
        } else {
            builder.append(" ; ");
        }
        builder.append(" while (");
        accept(node.jjtGetChild(num - 1), data);
        builder.append(")");
        return data;
    }
{code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to