Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 436199

Summary: Infinite loop recovering from broken statement inside broken property
Product: [ECD] Orion Reporter: Michael Rennie <Michael_Rennie>
Component: JS ToolsAssignee: Michael Rennie <Michael_Rennie>
Status: RESOLVED FIXED QA Contact:
Severity: critical    
Priority: P3    
Version: 6.0   
Target Milestone: 6.0 M2   
Hardware: All   
OS: All   
Whiteboard:

Description Michael Rennie CLA 2014-05-29 13:03:09 EDT
I was editing a condition for an array index and hit an infinite loop:

SyntaxTreeDelegate.createExpressionStatement (esprima.js:1553)
parseStatement (esprima.js:3359)
(anonymous function) (esprima.js:3986)
parseSourceElement (esprima.js:3585)
parseStatementList (esprima.js:2699)
parseBlock (esprima.js:2716)
parseStatement (esprima.js:3299)
(anonymous function) (esprima.js:3986)
parseIfStatement (esprima.js:2836)
parseStatement (esprima.js:3322)
(anonymous function) (esprima.js:3986)
parseSourceElement (esprima.js:3580)
parseStatementList (esprima.js:2699)
parseBlock (esprima.js:2716)
parseStatement (esprima.js:3299)
(anonymous function) (esprima.js:3986)
parseIfStatement (esprima.js:2836)
parseStatement (esprima.js:3322)
(anonymous function) (esprima.js:3986)
parseSourceElement (esprima.js:3580)
parseStatementList (esprima.js:2699)
parseBlock (esprima.js:2716)
parseStatement (esprima.js:3299)
(anonymous function) (esprima.js:3986)
parseForStatement (esprima.js:2975)
parseStatement (esprima.js:3318)
(anonymous function) (esprima.js:3986)
parseSourceElement (esprima.js:3580)
parseFunctionSourceElements (esprima.js:3412)
parseFunctionExpression (esprima.js:3557)
parsePrimaryExpression (esprima.js:2236)
parseLeftHandSideExpressionAllowCall (esprima.js:2354)
parsePostfixExpression (esprima.js:2409)
parseUnaryExpression (esprima.js:2464)
parseBinaryExpression (esprima.js:2553)
parseConditionalExpression (esprima.js:2619)
parseAssignmentExpression (esprima.js:2645)
recoverProperty (esprima.js:2110)
parseObjectProperty (esprima.js:2087)
parseObjectInitialiser (esprima.js:2153)
parsePrimaryExpression (esprima.js:2249)
parseLeftHandSideExpressionAllowCall (esprima.js:2354)
parsePostfixExpression (esprima.js:2409)
parseUnaryExpression (esprima.js:2464)
parseBinaryExpression (esprima.js:2553)
parseConditionalExpression (esprima.js:2619)
parseAssignmentExpression (esprima.js:2645)
parseArguments (esprima.js:2276)
parseLeftHandSideExpressionAllowCall (esprima.js:2359)
parsePostfixExpression (esprima.js:2409)
parseUnaryExpression (esprima.js:2438)
parseBinaryExpression (esprima.js:2553)
parseConditionalExpression (esprima.js:2619)
parseAssignmentExpression (esprima.js:2645)
parseExpression (esprima.js:2672)
(anonymous function) (esprima.js:3986)
parseStatement (esprima.js:3342)
(anonymous function) (esprima.js:3986)
parseSourceElement (esprima.js:3585)
parseFunctionSourceElements (esprima.js:3412)
parseFunctionExpression (esprima.js:3557)
parsePrimaryExpression (esprima.js:2236)
parseLeftHandSideExpressionAllowCall (esprima.js:2354)
parsePostfixExpression (esprima.js:2409)
parseUnaryExpression (esprima.js:2464)
parseBinaryExpression (esprima.js:2553)
parseConditionalExpression (esprima.js:2619)
parseAssignmentExpression (esprima.js:2645)
parseArguments (esprima.js:2276)
parseLeftHandSideExpressionAllowCall (esprima.js:2359)
parsePostfixExpression (esprima.js:2409)
parseUnaryExpression (esprima.js:2438)
parseBinaryExpression (esprima.js:2553)
parseConditionalExpression (esprima.js:2619)
parseAssignmentExpression (esprima.js:2645)
parseExpression (esprima.js:2672)
(anonymous function) (esprima.js:3986)
parseStatement (esprima.js:3342)
(anonymous function) (esprima.js:3986)
parseSourceElement (esprima.js:3585)
parseSourceElements (esprima.js:3618)
parseProgram (esprima.js:3635)
parse (esprima.js:3901)
Objects.mixin.parse (astManager.js:70)
(anonymous function) (astManager.js:58)
settleDeferred (Deferred.js:71)
notify (Deferred.js:145)
run (Deferred.js:29)

for ref the statement I entered was this:

error.token = ast.tokens[token.index>0index-1]

it started as just 

error.token = ast.tokens[index-1]

but I added in the 

token.index>0

to make a conditional, and as soon as I type the '0' it froze (in astManager.js#computeErrorTypes
Comment 1 Michael Rennie CLA 2014-05-29 13:23:27 EDT
http://git.eclipse.org/c/orion/org.eclipse.orion.client.git/commit/?id=1f818dc2f4e8efeb3b0140f0f39b15354c413ad2

Looks like I caused a regression when I merged the tolerant statement logic. Also found that returning null from our default tolerant wrapping could cause a loop since the checks are expecting 'undefined' (not a regression).
Comment 2 Michael Rennie CLA 2014-05-29 14:32:45 EDT
(In reply to Michael Rennie from comment #1)
 
> Looks like I caused a regression when I merged the tolerant statement logic.
> Also found that returning null from our default tolerant wrapping could
> cause a loop since the checks are expecting 'undefined' (not a regression).

Looks like not a regression. While working on a test case I reproduced even with the first fix. Added a loop guard: http://git.eclipse.org/c/orion/org.eclipse.orion.client.git/commit/?id=773abd405479fb0a1e03ee71361bfba496398744