[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