Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / src / declarative / qml / v4 / qv4irbuilder_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the QtDeclarative module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QV4IRBUILDER_P_H
43 #define QV4IRBUILDER_P_H
44
45 #include <QtCore/qglobal.h>
46
47 #include "qv4ir_p.h"
48
49 QT_BEGIN_HEADER
50
51 QT_BEGIN_NAMESPACE
52
53 class QV4IRBuilder : public QDeclarativeJS::AST::Visitor
54 {
55 public:
56     QV4IRBuilder(const QV4Compiler::Expression *, QDeclarativeEnginePrivate *);
57
58     bool operator()(QDeclarativeJS::IR::Function *, QDeclarativeJS::AST::Node *);
59
60 protected:
61     struct ExprResult {
62         enum Format {
63             ex, // expression
64             cx  // condition
65         };
66
67         QDeclarativeJS::IR::Expr *code;
68         QDeclarativeJS::IR::BasicBlock *iftrue;
69         QDeclarativeJS::IR::BasicBlock *iffalse;
70         Format hint; // requested format
71         Format format; // instruction format
72
73         ExprResult(QDeclarativeJS::IR::Expr *expr = 0)
74             : code(expr), iftrue(0), iffalse(0), hint(ex), format(ex) {}
75
76         ExprResult(QDeclarativeJS::IR::BasicBlock *iftrue, QDeclarativeJS::IR::BasicBlock *iffalse)
77             : code(0), iftrue(iftrue), iffalse(iffalse), hint(cx), format(ex) {}
78
79         inline QDeclarativeJS::IR::Type type() const { return code ? code->type : QDeclarativeJS::IR::InvalidType; }
80
81         inline QDeclarativeJS::IR::Expr *get() const { return code; }
82         inline operator QDeclarativeJS::IR::Expr *() const  { return get(); }
83         inline QDeclarativeJS::IR::Expr *operator->() const { return get(); }
84         inline bool isValid() const { return code ? code->type != QDeclarativeJS::IR::InvalidType : false; }
85         inline bool is(QDeclarativeJS::IR::Type t) const { return type() == t; }
86         inline bool isNot(QDeclarativeJS::IR::Type t) const { return type() != t; }
87
88         bool isPrimitive() const {
89             switch (type()) {
90             case QDeclarativeJS::IR::UndefinedType: // ### TODO
91             case QDeclarativeJS::IR::NullType: // ### TODO
92             case QDeclarativeJS::IR::UrlType: // ### TODO
93                 return false;
94
95             case QDeclarativeJS::IR::StringType:
96             case QDeclarativeJS::IR::BoolType:
97             case QDeclarativeJS::IR::IntType:
98             case QDeclarativeJS::IR::RealType:
99             case QDeclarativeJS::IR::RealNaNType:
100                 return true;
101
102             default:
103                 return false;
104             } // switch
105         }
106     };
107
108     inline void accept(QDeclarativeJS::AST::Node *ast) { QDeclarativeJS::AST::Node::accept(ast, this); }
109
110     ExprResult expression(QDeclarativeJS::AST::ExpressionNode *ast);
111     ExprResult statement(QDeclarativeJS::AST::Statement *ast);
112     void sourceElement(QDeclarativeJS::AST::SourceElement *ast);
113     void condition(QDeclarativeJS::AST::ExpressionNode *ast, QDeclarativeJS::IR::BasicBlock *iftrue, QDeclarativeJS::IR::BasicBlock *iffalse);
114     void binop(QDeclarativeJS::AST::BinaryExpression *ast, ExprResult left, ExprResult right);
115
116     void implicitCvt(ExprResult &expr, QDeclarativeJS::IR::Type type);
117
118     virtual bool preVisit(QDeclarativeJS::AST::Node *ast);
119
120     // QML
121     virtual bool visit(QDeclarativeJS::AST::UiProgram *ast);
122     virtual bool visit(QDeclarativeJS::AST::UiImportList *ast);
123     virtual bool visit(QDeclarativeJS::AST::UiImport *ast);
124     virtual bool visit(QDeclarativeJS::AST::UiPublicMember *ast);
125     virtual bool visit(QDeclarativeJS::AST::UiSourceElement *ast);
126     virtual bool visit(QDeclarativeJS::AST::UiObjectDefinition *ast);
127     virtual bool visit(QDeclarativeJS::AST::UiObjectInitializer *ast);
128     virtual bool visit(QDeclarativeJS::AST::UiObjectBinding *ast);
129     virtual bool visit(QDeclarativeJS::AST::UiScriptBinding *ast);
130     virtual bool visit(QDeclarativeJS::AST::UiArrayBinding *ast);
131     virtual bool visit(QDeclarativeJS::AST::UiObjectMemberList *ast);
132     virtual bool visit(QDeclarativeJS::AST::UiArrayMemberList *ast);
133     virtual bool visit(QDeclarativeJS::AST::UiQualifiedId *ast);
134
135     // JS
136     virtual bool visit(QDeclarativeJS::AST::Program *ast);
137     virtual bool visit(QDeclarativeJS::AST::SourceElements *ast);
138     virtual bool visit(QDeclarativeJS::AST::FunctionSourceElement *ast);
139     virtual bool visit(QDeclarativeJS::AST::StatementSourceElement *ast);
140
141     // object literals
142     virtual bool visit(QDeclarativeJS::AST::PropertyNameAndValueList *ast);
143     virtual bool visit(QDeclarativeJS::AST::IdentifierPropertyName *ast);
144     virtual bool visit(QDeclarativeJS::AST::StringLiteralPropertyName *ast);
145     virtual bool visit(QDeclarativeJS::AST::NumericLiteralPropertyName *ast);
146
147     // array literals
148     virtual bool visit(QDeclarativeJS::AST::ElementList *ast);
149     virtual bool visit(QDeclarativeJS::AST::Elision *ast);
150
151     // function calls
152     virtual bool visit(QDeclarativeJS::AST::ArgumentList *ast);
153
154     // expressions
155     virtual bool visit(QDeclarativeJS::AST::ObjectLiteral *ast);
156     virtual bool visit(QDeclarativeJS::AST::ArrayLiteral *ast);
157     virtual bool visit(QDeclarativeJS::AST::ThisExpression *ast);
158     virtual bool visit(QDeclarativeJS::AST::IdentifierExpression *ast);
159     virtual bool visit(QDeclarativeJS::AST::NullExpression *ast);
160     virtual bool visit(QDeclarativeJS::AST::TrueLiteral *ast);
161     virtual bool visit(QDeclarativeJS::AST::FalseLiteral *ast);
162     virtual bool visit(QDeclarativeJS::AST::StringLiteral *ast);
163     virtual bool visit(QDeclarativeJS::AST::NumericLiteral *ast);
164     virtual bool visit(QDeclarativeJS::AST::RegExpLiteral *ast);
165     virtual bool visit(QDeclarativeJS::AST::NestedExpression *ast);
166     virtual bool visit(QDeclarativeJS::AST::ArrayMemberExpression *ast);
167     virtual bool visit(QDeclarativeJS::AST::FieldMemberExpression *ast);
168     virtual bool visit(QDeclarativeJS::AST::NewMemberExpression *ast);
169     virtual bool visit(QDeclarativeJS::AST::NewExpression *ast);
170     virtual bool visit(QDeclarativeJS::AST::CallExpression *ast);
171     virtual bool visit(QDeclarativeJS::AST::PostIncrementExpression *ast);
172     virtual bool visit(QDeclarativeJS::AST::PostDecrementExpression *ast);
173     virtual bool visit(QDeclarativeJS::AST::DeleteExpression *ast);
174     virtual bool visit(QDeclarativeJS::AST::VoidExpression *ast);
175     virtual bool visit(QDeclarativeJS::AST::TypeOfExpression *ast);
176     virtual bool visit(QDeclarativeJS::AST::PreIncrementExpression *ast);
177     virtual bool visit(QDeclarativeJS::AST::PreDecrementExpression *ast);
178     virtual bool visit(QDeclarativeJS::AST::UnaryPlusExpression *ast);
179     virtual bool visit(QDeclarativeJS::AST::UnaryMinusExpression *ast);
180     virtual bool visit(QDeclarativeJS::AST::TildeExpression *ast);
181     virtual bool visit(QDeclarativeJS::AST::NotExpression *ast);
182     virtual bool visit(QDeclarativeJS::AST::BinaryExpression *ast);
183     virtual bool visit(QDeclarativeJS::AST::ConditionalExpression *ast);
184     virtual bool visit(QDeclarativeJS::AST::Expression *ast);
185
186     // statements
187     virtual bool visit(QDeclarativeJS::AST::Block *ast);
188     virtual bool visit(QDeclarativeJS::AST::StatementList *ast);
189     virtual bool visit(QDeclarativeJS::AST::VariableStatement *ast);
190     virtual bool visit(QDeclarativeJS::AST::VariableDeclarationList *ast);
191     virtual bool visit(QDeclarativeJS::AST::VariableDeclaration *ast);
192     virtual bool visit(QDeclarativeJS::AST::EmptyStatement *ast);
193     virtual bool visit(QDeclarativeJS::AST::ExpressionStatement *ast);
194     virtual bool visit(QDeclarativeJS::AST::IfStatement *ast);
195     virtual bool visit(QDeclarativeJS::AST::DoWhileStatement *ast);
196     virtual bool visit(QDeclarativeJS::AST::WhileStatement *ast);
197     virtual bool visit(QDeclarativeJS::AST::ForStatement *ast);
198     virtual bool visit(QDeclarativeJS::AST::LocalForStatement *ast);
199     virtual bool visit(QDeclarativeJS::AST::ForEachStatement *ast);
200     virtual bool visit(QDeclarativeJS::AST::LocalForEachStatement *ast);
201     virtual bool visit(QDeclarativeJS::AST::ContinueStatement *ast);
202     virtual bool visit(QDeclarativeJS::AST::BreakStatement *ast);
203     virtual bool visit(QDeclarativeJS::AST::ReturnStatement *ast);
204     virtual bool visit(QDeclarativeJS::AST::WithStatement *ast);
205     virtual bool visit(QDeclarativeJS::AST::SwitchStatement *ast);
206     virtual bool visit(QDeclarativeJS::AST::CaseBlock *ast);
207     virtual bool visit(QDeclarativeJS::AST::CaseClauses *ast);
208     virtual bool visit(QDeclarativeJS::AST::CaseClause *ast);
209     virtual bool visit(QDeclarativeJS::AST::DefaultClause *ast);
210     virtual bool visit(QDeclarativeJS::AST::LabelledStatement *ast);
211     virtual bool visit(QDeclarativeJS::AST::ThrowStatement *ast);
212     virtual bool visit(QDeclarativeJS::AST::TryStatement *ast);
213     virtual bool visit(QDeclarativeJS::AST::Catch *ast);
214     virtual bool visit(QDeclarativeJS::AST::Finally *ast);
215     virtual bool visit(QDeclarativeJS::AST::FunctionDeclaration *ast);
216     virtual bool visit(QDeclarativeJS::AST::FunctionExpression *ast);
217     virtual bool visit(QDeclarativeJS::AST::FormalParameterList *ast);
218     virtual bool visit(QDeclarativeJS::AST::FunctionBody *ast);
219     virtual bool visit(QDeclarativeJS::AST::DebuggerStatement *ast);
220
221 private:
222     bool buildName(QList<QStringRef> &name, QDeclarativeJS::AST::Node *node,
223                    QList<QDeclarativeJS::AST::ExpressionNode *> *nodes);
224     void discard();
225
226     const QV4Compiler::Expression *m_expression;
227     QDeclarativeEnginePrivate *m_engine;
228
229     QDeclarativeJS::IR::Function *_function;
230     QDeclarativeJS::IR::BasicBlock *_block;
231     bool _discard;
232
233     ExprResult _expr;
234 };
235
236 QT_END_NAMESPACE
237
238 QT_END_HEADER
239
240 #endif // QV4IRBUILDER_P_H