mirror of
https://github.com/twiglet/cs2j.git
synced 2025-01-18 13:15:17 +01:00
fix up jump statements that call methods with ref / out params so that these param's values don't get lost.
This commit is contained in:
parent
ab6882062d
commit
6b3c19f823
@ -2184,6 +2184,7 @@ embedded_statement[bool isStatementListCtxt]
|
|||||||
@init{
|
@init{
|
||||||
string idName = null;
|
string idName = null;
|
||||||
bool emitPrePost = false;
|
bool emitPrePost = false;
|
||||||
|
bool jumpStatementHasExpression = false;
|
||||||
}
|
}
|
||||||
@after{
|
@after{
|
||||||
if(emitPrePost) {
|
if(emitPrePost) {
|
||||||
@ -2209,11 +2210,18 @@ embedded_statement[bool isStatementListCtxt]
|
|||||||
-> OPEN_BRACE[$ift.token, "{"] { $statement::preStatements } magicAssignment { $statement::postStatements } ^($ift IDENTIFIER[$ift.token, idName] SEP embedded_statement else_statement?) CLOSE_BRACE[$ift.token, "}"]
|
-> OPEN_BRACE[$ift.token, "{"] { $statement::preStatements } magicAssignment { $statement::postStatements } ^($ift IDENTIFIER[$ift.token, idName] SEP embedded_statement else_statement?) CLOSE_BRACE[$ift.token, "}"]
|
||||||
| switch_statement[isStatementListCtxt]
|
| switch_statement[isStatementListCtxt]
|
||||||
| iteration_statement // while, do, for, foreach
|
| iteration_statement // while, do, for, foreach
|
||||||
| jump_statement { emitPrePost = adaptor.GetChildCount($statement::preStatements) > 0 || adaptor.GetChildCount($statement::postStatements) > 0; }
|
| jump_statement
|
||||||
|
| (^(('return' | 'throw') expression?)) => (^(jt='return' (je=expression {jumpStatementHasExpression = true;})?) | ^(jt='throw' (je=expression{ jumpStatementHasExpression = true; })?))
|
||||||
|
{ emitPrePost = adaptor.GetChildCount($statement::preStatements) > 0 || adaptor.GetChildCount($statement::postStatements) > 0;
|
||||||
|
if (emitPrePost) {
|
||||||
|
idName = "resVar___" + dummyVarCtr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
magicAssignment[emitPrePost, $jt.token, jumpStatementHasExpression ? ($je.dotNetType != null ? (CommonTree)$je.dotNetType.Tree : null) : null, idName, $je.tree]
|
||||||
// jump_statement transfers control, so we ignore any poststatements
|
// jump_statement transfers control, so we ignore any poststatements
|
||||||
-> {!emitPrePost }? jump_statement
|
-> {!emitPrePost }? ^($jt $je?)
|
||||||
-> {isStatementListCtxt}? { $statement::preStatements } jump_statement
|
-> {isStatementListCtxt}? { $statement::preStatements } magicAssignment { $statement::postStatements } ^($jt IDENTIFIER[$jt.token, idName])
|
||||||
-> OPEN_BRACE[$jump_statement.tree.Token, "{"] { $statement::preStatements } jump_statement CLOSE_BRACE[$jump_statement.tree.Token, "}"]
|
-> OPEN_BRACE[$jt.token, "{"] { $statement::preStatements } magicAssignment { $statement::postStatements } ^($jt IDENTIFIER[$jt.token, idName]) CLOSE_BRACE[$jt.token, "}"]
|
||||||
|
|
||||||
// break, continue, goto, return, throw
|
// break, continue, goto, return, throw
|
||||||
| ^('try' block catch_clauses? finally_clause?)
|
| ^('try' block catch_clauses? finally_clause?)
|
||||||
@ -2452,8 +2460,7 @@ jump_statement:
|
|||||||
break_statement
|
break_statement
|
||||||
| continue_statement
|
| continue_statement
|
||||||
| goto_statement
|
| goto_statement
|
||||||
| ^('return' expression?)
|
;
|
||||||
| ^('throw' expression?);
|
|
||||||
break_statement:
|
break_statement:
|
||||||
'break' ';' ;
|
'break' ';' ;
|
||||||
continue_statement:
|
continue_statement:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user