[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [qmlweb/development/qmlweb2] /: [Compiler] Add try-catch-finally
From: Jan Marker <jan () jangmarker ! de>
Date: 2015-09-30 20:44:36
Message-ID: E1ZhOEu-0000CB-FN () scm ! kde ! org
[Download RAW message or body]
Git commit 7c39c498e7ef86b0a61b1cd9dcfdf22fc65b9440 by Jan Marker.
Committed on 30/09/2015 at 20:41.
Pushed by jangmarker into branch 'development/qmlweb2'.
[Compiler] Add try-catch-finally
M +24 -1 src/qmljsc/purejavascriptgenerator.cpp
M +4 -0 src/qmljsc/purejavascriptgenerator.h
A +1 -0 tests/auto/data/javascript/exceptionstatements.compiled.js
A +27 -0 tests/auto/data/javascript/exceptionstatements.js
M +21 -0 tests/auto/qmljsc/testpurejavascriptgenerator.cpp
M +1 -0 tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
http://commits.kde.org/qmlweb/7c39c498e7ef86b0a61b1cd9dcfdf22fc65b9440
diff --git a/src/qmljsc/purejavascriptgenerator.cpp b/src/qmljsc/purejavascriptgenerator.cpp
index 811ba84..4872158 100644
--- a/src/qmljsc/purejavascriptgenerator.cpp
+++ b/src/qmljsc/purejavascriptgenerator.cpp
@@ -258,6 +258,12 @@ void PureJavaScriptGenerator::endVisit(AST::CaseClauses *caseClauses) {
reduceListStack<AST::CaseClauses>(caseClauses);
}
+void PureJavaScriptGenerator::endVisit(AST::Catch *catchClause) {
+ const QString block = m_outputStack.pop();
+ const QString variableIdentifier = catchClause->name.toString();
+ m_outputStack << "catch(" + variableIdentifier + ')' + block;
+}
+
void PureJavaScriptGenerator::endVisit(AST::ConditionalExpression *) {
const QString secondExpression = m_outputStack.pop();
const QString firstExpression = m_outputStack.pop();
@@ -325,6 +331,11 @@ void PureJavaScriptGenerator::endVisit(AST::FieldMemberExpression *fieldMemberEx
m_outputStack << objectExpression + '.' + memberName;
}
+void PureJavaScriptGenerator::endVisit(AST::Finally *) {
+ const QString block = m_outputStack.pop();
+ m_outputStack << "finally" + block;
+}
+
void PureJavaScriptGenerator::endVisit(AST::ForEachStatement *) {
const QString statement = m_outputStack.pop();
const QString objectExpression = m_outputStack.pop();
@@ -352,7 +363,7 @@ void PureJavaScriptGenerator::endVisit(AST::FunctionDeclaration *functionDeclara
m_outputStack << "function " + name + '(' + parameters + ')' + body;
}
-void PureJavaScriptGenerator::endVisit(QQmlJS::AST::FunctionExpression *functionExpression) {
+void PureJavaScriptGenerator::endVisit(AST::FunctionExpression *functionExpression) {
const QString body = (functionExpression->body)?m_outputStack.pop():"{}";
const QString parameters = (functionExpression->formals)?m_outputStack.pop():"";
const QString name = functionExpression->name.toString();
@@ -486,11 +497,23 @@ void PureJavaScriptGenerator::endVisit(AST::SwitchStatement *) {
m_outputStack << "switch(" + expression + ')' + clauseBlock;
}
+void PureJavaScriptGenerator::endVisit(AST::ThrowStatement *) {
+ const QString expression = m_outputStack.pop();
+ m_outputStack << "throw " + expression + ';';
+}
+
void PureJavaScriptGenerator::endVisit(AST::TildeExpression *) {
const QString expression = m_outputStack.pop();
m_outputStack << '~' + expression;
}
+void PureJavaScriptGenerator::endVisit(AST::TryStatement *tryStatement) {
+ const QString finallyExpression = (tryStatement->finallyExpression)?m_outputStack.pop():"";
+ const QString catchExpression = (tryStatement->catchExpression)?m_outputStack.pop():"";
+ const QString block = m_outputStack.pop();
+ m_outputStack << "try" + block + catchExpression + finallyExpression;
+}
+
void PureJavaScriptGenerator::endVisit(AST::TypeOfExpression *) {
const QString expression = m_outputStack.pop();
m_outputStack << "typeof " + expression;
diff --git a/src/qmljsc/purejavascriptgenerator.h b/src/qmljsc/purejavascriptgenerator.h
index 9994b62..584e59c 100644
--- a/src/qmljsc/purejavascriptgenerator.h
+++ b/src/qmljsc/purejavascriptgenerator.h
@@ -60,6 +60,7 @@ public:
virtual void endVisit(QQmlJS::AST::CaseBlock *) override;
virtual void endVisit(QQmlJS::AST::CaseClause *) override;
virtual void endVisit(QQmlJS::AST::CaseClauses *) override;
+ virtual void endVisit(QQmlJS::AST::Catch *) override;
virtual void endVisit(QQmlJS::AST::ConditionalExpression *) override;
virtual void endVisit(QQmlJS::AST::DefaultClause *) override;
virtual void endVisit(QQmlJS::AST::DeleteExpression *) override;
@@ -69,6 +70,7 @@ public:
virtual void endVisit(QQmlJS::AST::Expression *) override;
virtual void endVisit(QQmlJS::AST::ExpressionStatement *) override;
virtual void endVisit(QQmlJS::AST::FieldMemberExpression *) override;
+ virtual void endVisit(QQmlJS::AST::Finally *) override;
virtual void endVisit(QQmlJS::AST::ForEachStatement *) override;
virtual void endVisit(QQmlJS::AST::ForStatement *) override;
virtual void endVisit(QQmlJS::AST::FunctionBody *) override;
@@ -97,7 +99,9 @@ public:
virtual void endVisit(QQmlJS::AST::StringLiteral *) override;
virtual void endVisit(QQmlJS::AST::StatementList *) override;
virtual void endVisit(QQmlJS::AST::SwitchStatement *) override;
+ virtual void endVisit(QQmlJS::AST::ThrowStatement *) override;
virtual void endVisit(QQmlJS::AST::TildeExpression *) override;
+ virtual void endVisit(QQmlJS::AST::TryStatement *) override;
virtual void endVisit(QQmlJS::AST::TypeOfExpression *) override;
virtual void endVisit(QQmlJS::AST::UnaryMinusExpression *) override;
virtual void endVisit(QQmlJS::AST::UnaryPlusExpression *) override;
diff --git a/tests/auto/data/javascript/exceptionstatements.compiled.js \
b/tests/auto/data/javascript/exceptionstatements.compiled.js new file mode 100644
index 0000000..42e6ed1
--- /dev/null
+++ b/tests/auto/data/javascript/exceptionstatements.compiled.js
@@ -0,0 +1 @@
+throw 42;try{var i;}catch(e){var e;}try{var i;}catch(e){var e;}try{var i;}catch(e){var e;}finally{var \
f;}try{var i;}finally{var f;} \ No newline at end of file
diff --git a/tests/auto/data/javascript/exceptionstatements.js \
b/tests/auto/data/javascript/exceptionstatements.js new file mode 100644
index 0000000..ce850cc
--- /dev/null
+++ b/tests/auto/data/javascript/exceptionstatements.js
@@ -0,0 +1,27 @@
+throw 42;
+
+try {
+ var i;
+} catch (e) {
+ var e;
+}
+
+try {
+ var i;
+} catch (e) {
+ var e;
+}
+
+try {
+ var i;
+} catch (e) {
+ var e;
+} finally {
+ var f;
+}
+
+try {
+ var i;
+} finally {
+ var f;
+}
\ No newline at end of file
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp index 164b5f4..74a0200 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator.cpp
@@ -212,6 +212,13 @@ public:
, m_localForStatementNoPart(nullptr, nullptr, nullptr, &m_block)
, m_forEachStatement(&m_trueLiteral, &m_trueLiteral, &m_block)
, m_localForEachStatement(&m_variableDeclarationWithoutAssignment, &m_trueLiteral, &m_block)
+ /* Exceptions */
+ , m_throwStatement(&m_trueLiteral)
+ , m_catch(m_someIdentifierStringRef, &m_block)
+ , m_finally(&m_block)
+ , m_tryStatementCatchFinally(&m_block, &m_catch, &m_finally)
+ , m_tryStatementCatch(&m_block, &m_catch)
+ , m_tryStatementFinally(&m_block, &m_finally)
{
m_elisionsPart2.finish();
m_arrayElementsExp.finish();
@@ -388,6 +395,14 @@ private:
AST::ForEachStatement m_forEachStatement;
AST::LocalForEachStatement m_localForEachStatement;
+ /* Exceptions */
+ AST::ThrowStatement m_throwStatement;
+ AST::Catch m_catch;
+ AST::Finally m_finally;
+ AST::TryStatement m_tryStatementCatchFinally;
+ AST::TryStatement m_tryStatementCatch;
+ AST::TryStatement m_tryStatementFinally;
+
private slots:
void init() {
m_generator = new PureJavaScriptGenerator();
@@ -473,6 +488,7 @@ private slots:
TEST_ENDVISIT_REDUCES(CaseBlock , CasesDefaultCases , "{cases;default;cases;}", \
({"cases;", "default;", "cases;"}), m_caseBlockCasesDefaultCases)
TEST_ENDVISIT_REDUCES(CaseClause , CaseWithStatement , "case exp:stm;" , ({"case", \
"exp", "stm;"}) , m_caseClause)
TEST_ENDVISIT_REDUCES(CaseClauses , TwoClauses , "case e:s;case e2:s2;", ({"case \
e:s;", "case e2:s2;"}), m_twoCaseClauses) + TEST_ENDVISIT_REDUCES(Catch , AnyCase \
, "catch(i){block}" , ({"{block}"}) , m_catch)
TEST_ENDVISIT_REDUCES(ConditionalExpression , AnyCase , "condition?e1:e2" , \
({"condition", "e1", "e2"}) , m_conditionalExpression)
TEST_ENDVISIT_REDUCES(DefaultClause , AnyCase , "default:stm" , ({"default", \
"stm"}) , m_defaultClause)
TEST_ENDVISIT_REDUCES(DeleteExpression , AnyCase , "delete v" , ({"v"}) \
, m_deleteExpression) @@ -485,6 +501,7 @@ private slots:
TEST_ENDVISIT_REDUCES(/*Comma*/Expression , AnyCase , "a,b" , ({"a", "b"}) \
, m_commaExpression)
TEST_ENDVISIT_REDUCES(ExpressionStatement , AnyCase , "expression;" , \
({"expression"}) , m_expressionStatement)
TEST_ENDVISIT_REDUCES(FieldMemberExpression , AnyCase , "obj.property" , ({"obj"}) \
, m_fieldMemberExpression) + TEST_ENDVISIT_REDUCES(Finally , AnyCase , \
"finally{block}" , ({"{block}"}) , m_finally)
TEST_ENDVISIT_REDUCES(FormalParameterList , AnyCase , "i" , ({"i"}) \
, m_twoParameters) // does nothing
TEST_ENDVISIT_REDUCES(ForEachStatement , AnyCase , "for(i in o)stm;" , ({"i", "o", \
"stm;"}) , m_forEachStatement)
TEST_ENDVISIT_REDUCES(ForStatement , AllParts , "for(i;c;++)stm;" , ({"i", "c", \
"++", "stm;"}) , m_forStatementAllParts) @@ -528,7 +545,11 @@ private slots:
TEST_ENDVISIT_REDUCES(StatementSourceElement , AnyCase , "i" , ({"i"}) \
, m_statementSourceElement) // does nothing
TEST_ENDVISIT_REDUCES(StringLiteral , AnyCase , "another string" , ({"another \
string"}) , m_stringLiteral)
TEST_ENDVISIT_REDUCES(SwitchStatement , AnyCase , "switch(e){blk}" , ({"e", \
"{blk}"}) , m_switchStatement) + TEST_ENDVISIT_REDUCES(ThrowStatement , AnyCase \
, "throw 5;" , ({"5"}) , m_throwStatement)
TEST_ENDVISIT_REDUCES(TildeExpression , AnyCase , "~5" , ({"5"}) \
, m_tildeExpression) + TEST_ENDVISIT_REDUCES(TryStatement , OnlyCatch , \
"try{stm}catch" , ({"{stm}", "catch"}) , m_tryStatementCatch) + \
TEST_ENDVISIT_REDUCES(TryStatement , OnlyFinally , "try{stm}finally" , ({"{stm}", \
"finally"}) , m_tryStatementFinally) + TEST_ENDVISIT_REDUCES(TryStatement , \
CatchFinally , "try{stm}catchfinally", ({"{stm}", "catch", "finally"}), \
m_tryStatementCatchFinally)
TEST_ENDVISIT_REDUCES(TypeOfExpression , AnyCase , "typeof v" , ({"v"}) \
, m_typeOfExpression)
TEST_ENDVISIT_REDUCES(UnaryMinusExpression , AnyCase , "-5" , ({"5"}) \
, m_unaryMinusExpression)
TEST_ENDVISIT_REDUCES(UnaryPlusExpression , AnyCase , "+5" , ({"5"}) \
, m_unaryPlusExpression)
diff --git a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp \
b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp index 606e556..45f73d8 100644
--- a/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
+++ b/tests/auto/qmljsc/testpurejavascriptgenerator_integration.cpp
@@ -94,6 +94,7 @@ private slots:
addRowForFileWithCompiled("lefthandexpressions");
addRowForFileWithCompiled("functioncalls");
addRowForFileWithCompiled("loops");
+ addRowForFileWithCompiled("exceptionstatements");
}
void test_compileJavaScriptFile() {
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic