summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r--src/shared/cplusplus/Parser.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index ee8e714f64..70bc64ae3d 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -198,6 +198,10 @@ bool Parser::skipUntilStatement()
case T_USING:
return true;
+ case T_AT_SYNCHRONIZED:
+ if (objCEnabled())
+ return true;
+
default:
consumeToken();
}
@@ -1932,6 +1936,10 @@ bool Parser::parseStatement(StatementAST *&node)
return true;
}
+ case T_AT_SYNCHRONIZED:
+ if (objCEnabled())
+ return parseObjCSynchronizedStatement(node);
+
default:
if (LA() == T_IDENTIFIER && LA(2) == T_COLON)
return parseLabeledStatement(node);
@@ -2894,6 +2902,23 @@ bool Parser::parseObjCStringLiteral(ExpressionAST *&node)
return true;
}
+bool Parser::parseObjCSynchronizedStatement(StatementAST *&node)
+{
+ if (LA() != T_AT_SYNCHRONIZED)
+ return false;
+
+ ObjCSynchronizedStatementAST *ast = new (_pool) ObjCSynchronizedStatementAST;
+
+ ast->synchronized_token = consumeToken();
+ match(T_LPAREN, &ast->lparen_token);
+ parseExpression(ast->synchronized_object);
+ match(T_RPAREN, &ast->rparen_token);
+ parseStatement(ast->statement);
+
+ node = ast;
+ return true;
+}
+
bool Parser::parseObjCEncodeExpression(ExpressionAST *&node)
{
if (LA() != T_AT_ENCODE)