Extend the QML bootstrap library by the IR builders
authorSimon Hausmann <simon.hausmann@digia.com>
Wed, 12 Mar 2014 15:55:06 +0000 (16:55 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Wed, 23 Apr 2014 19:16:46 +0000 (21:16 +0200)
This is among other things needed to fix the qml import scanner to detect
dependencies from .js files correctly.

The patch also fixes the use of Q_QML_EXPORT towards Q_QML_PRIVATE_EXPORT
where appropriate and corrects the wrong include path for the double conversion
code to actually be relative to the file it is included from. This worked by
accident because of other include paths present in the build.

Change-Id: I338583dad2f76300819af8ab0dae8e5724c84430
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
38 files changed:
src/3rdparty/double-conversion/double-conversion.pri
src/qml/compiler/compiler.pri
src/qml/compiler/qqmlirbuilder.cpp
src/qml/compiler/qqmlirbuilder_p.h
src/qml/compiler/qqmltypecompiler.cpp
src/qml/compiler/qv4codegen.cpp
src/qml/compiler/qv4codegen_p.h
src/qml/compiler/qv4compileddata.cpp
src/qml/compiler/qv4compileddata_p.h
src/qml/compiler/qv4compiler.cpp
src/qml/compiler/qv4compiler_p.h
src/qml/compiler/qv4isel_p.cpp
src/qml/compiler/qv4isel_p.h
src/qml/compiler/qv4jsir.cpp
src/qml/compiler/qv4jsir_p.h
src/qml/compiler/qv4ssa.cpp
src/qml/compiler/qv4ssa_p.h
src/qml/jsruntime/jsruntime.pri
src/qml/jsruntime/qv4global_p.h
src/qml/jsruntime/qv4managed_p.h
src/qml/jsruntime/qv4object_p.h
src/qml/jsruntime/qv4runtime.cpp
src/qml/jsruntime/qv4runtime_p.h
src/qml/jsruntime/qv4script.cpp
src/qml/jsruntime/qv4string.cpp
src/qml/jsruntime/qv4string_p.h
src/qml/jsruntime/qv4value.cpp
src/qml/jsruntime/qv4value_inl_p.h
src/qml/jsruntime/qv4value_p.h
src/qml/qml/qml.pri
src/qml/qml/qqmldirparser.cpp
src/qml/qml/qqmldirparser_p.h
src/qml/qml/qqmlimport.cpp
src/qml/qml/qqmlimport_p.h
src/qml/qml/qqmltypeloader.cpp
src/qml/qtqmlglobal_p.h
src/qmldevtools/qmldevtools.pro
tests/auto/qmldevtools/compile/tst_compile.cpp

index 4ad5f9f..1597aca 100644 (file)
@@ -1,4 +1,24 @@
 INCLUDEPATH += $$PWD
 VPATH += $$PWD
-SOURCES += $$PWD/*.cc
-HEADERS += $$PWD/*.h
+SOURCES += \
+    $$PWD/bignum.cc \
+    $$PWD/bignum-dtoa.cc \
+    $$PWD/cached-powers.cc \
+    $$PWD/diy-fp.cc \
+    $$PWD/double-conversion.cc \
+    $$PWD/fast-dtoa.cc \
+    $$PWD/fixed-dtoa.cc \
+    $$PWD/strtod.cc
+
+HEADERS += \
+    $$PWD/bignum-dtoa.h \
+    $$PWD/bignum.h \
+    $$PWD/cached-powers.h \
+    $$PWD/diy-fp.h \
+    $$PWD/double-conversion.h \
+    $$PWD/fast-dtoa.h \
+    $$PWD/fixed-dtoa.h \
+    $$PWD/ieee.h \
+    $$PWD/strtod.h \
+    $$PWD/utils.h
+
index 6e3159b..585fef7 100644 (file)
@@ -7,8 +7,6 @@ HEADERS += \
     $$PWD/qv4codegen_p.h \
     $$PWD/qv4isel_p.h \
     $$PWD/qv4jsir_p.h \
-    $$PWD/qv4instr_moth_p.h \
-    $$PWD/qv4isel_moth_p.h \
     $$PWD/qv4isel_util_p.h \
     $$PWD/qv4ssa_p.h \
     $$PWD/qqmlirbuilder_p.h \
@@ -18,10 +16,22 @@ SOURCES += \
     $$PWD/qv4compileddata.cpp \
     $$PWD/qv4compiler.cpp \
     $$PWD/qv4codegen.cpp \
-    $$PWD/qv4instr_moth.cpp \
-    $$PWD/qv4isel_moth.cpp \
     $$PWD/qv4isel_p.cpp \
     $$PWD/qv4jsir.cpp \
     $$PWD/qv4ssa.cpp \
-    $$PWD/qqmlirbuilder.cpp \
-    $$PWD/qqmltypecompiler.cpp
+    $$PWD/qqmlirbuilder.cpp
+
+!qmldevtools_build {
+
+HEADERS += \
+    $$PWD/qqmltypecompiler_p.h \
+    $$PWD/qv4isel_moth_p.h \
+    $$PWD/qv4instr_moth_p.h
+
+
+SOURCES += \
+    $$PWD/qqmltypecompiler.cpp \
+    $$PWD/qv4instr_moth.cpp \
+    $$PWD/qv4isel_moth.cpp
+
+}
index 0dac79f..28a4e23 100644 (file)
 
 #include "qqmlirbuilder_p.h"
 
+#include <private/qv4value_inl_p.h>
 #include <private/qv4compileddata_p.h>
 #include <private/qqmljsparser_p.h>
 #include <private/qqmljslexer_p.h>
-#include <private/qqmlcompiler_p.h>
-#include <private/qqmlglobal_p.h>
 #include <QCoreApplication>
 
+#ifndef V4_BOOTSTRAP
+#include <private/qqmlglobal_p.h>
+#include <private/qqmltypeloader_p.h>
+#include <private/qqmlengine_p.h>
+#include <private/qqmlcompiler_p.h>
+#endif
+
 #ifdef CONST
 #undef CONST
 #endif
@@ -56,7 +62,9 @@ QT_USE_NAMESPACE
 
 static const quint32 emptyStringIndex = 0;
 
+#ifndef V4_BOOTSTRAP
 DEFINE_BOOL_CONFIG_OPTION(lookupHints, QML_LOOKUP_HINTS);
+#endif // V4_BOOTSTRAP
 
 using namespace QmlIR;
 
@@ -296,7 +304,7 @@ void Document::collectTypeReferences()
     }
 }
 
-void Document::extractScriptMetaData(QString &script, QQmlError *error)
+void Document::extractScriptMetaData(QString &script, QQmlJS::DiagnosticMessage *error)
 {
     Q_ASSERT(error);
 
@@ -318,8 +326,7 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error)
         int startLine = l.tokenStartLine();
         int startColumn = l.tokenStartColumn();
 
-        QQmlError importError;
-        importError.setLine(startLine + 1); // 0-based, adjust to be 1-based
+        error->loc.startLine = startLine + 1; // 0-based, adjust to be 1-based
 
         token = l.lex();
 
@@ -340,9 +347,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error)
                 QString file = l.tokenText();
 
                 if (!file.endsWith(js)) {
-                    importError.setDescription(QCoreApplication::translate("QQmlParser","Imported file must be a script"));
-                    importError.setColumn(l.tokenStartColumn());
-                    *error = importError;
+                    error->message = QCoreApplication::translate("QQmlParser","Imported file must be a script");
+                    error->loc.startColumn = l.tokenStartColumn();
                     return;
                 }
 
@@ -361,9 +367,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error)
 
 
                 if (invalidImport) {
-                    importError.setDescription(QCoreApplication::translate("QQmlParser","File import requires a qualifier"));
-                    importError.setColumn(l.tokenStartColumn());
-                    *error = importError;
+                    error->message = QCoreApplication::translate("QQmlParser","File import requires a qualifier");
+                    error->loc.startColumn = l.tokenStartColumn();
                     return;
                 }
 
@@ -374,9 +379,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error)
                 token = l.lex();
 
                 if (!importId.at(0).isUpper() || (l.tokenStartLine() == startLine)) {
-                    importError.setDescription(QCoreApplication::translate("QQmlParser","Invalid import qualifier"));
-                    importError.setColumn(l.tokenStartColumn());
-                    *error = importError;
+                    error->message = QCoreApplication::translate("QQmlParser","Invalid import qualifier");
+                    error->loc.startColumn = l.tokenStartColumn();
                     return;
                 }
 
@@ -394,9 +398,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error)
 
                 while (true) {
                     if (!isUriToken(token)) {
-                        importError.setDescription(QCoreApplication::translate("QQmlParser","Invalid module URI"));
-                        importError.setColumn(l.tokenStartColumn());
-                        *error = importError;
+                        error->message = QCoreApplication::translate("QQmlParser","Invalid module URI");
+                        error->loc.startColumn = l.tokenStartColumn();
                         return;
                     }
 
@@ -414,9 +417,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error)
                 }
 
                 if (token != QQmlJSGrammar::T_NUMERIC_LITERAL) {
-                    importError.setDescription(QCoreApplication::translate("QQmlParser","Module import requires a version"));
-                    importError.setColumn(l.tokenStartColumn());
-                    *error = importError;
+                    error->message = QCoreApplication::translate("QQmlParser","Module import requires a version");
+                    error->loc.startColumn = l.tokenStartColumn();
                     return;
                 }
 
@@ -439,9 +441,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error)
 
 
                 if (invalidImport) {
-                    importError.setDescription(QCoreApplication::translate("QQmlParser","Module import requires a qualifier"));
-                    importError.setColumn(l.tokenStartColumn());
-                    *error = importError;
+                    error->message = QCoreApplication::translate("QQmlParser","Module import requires a qualifier");
+                    error->loc.startColumn = l.tokenStartColumn();
                     return;
                 }
 
@@ -452,9 +453,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error)
                 token = l.lex();
 
                 if (!importId.at(0).isUpper() || (l.tokenStartLine() == startLine)) {
-                    importError.setDescription(QCoreApplication::translate("QQmlParser","Invalid import qualifier"));
-                    importError.setColumn(l.tokenStartColumn());
-                    *error = importError;
+                    error->message = QCoreApplication::translate("QQmlParser","Invalid import qualifier");
+                    error->loc.startColumn = l.tokenStartColumn();
                     return;
                 }
 
@@ -558,7 +558,7 @@ IRBuilder::IRBuilder(const QSet<QString> &illegalNames)
 {
 }
 
-bool IRBuilder::generateFromQml(const QString &code, const QUrl &url, const QString &urlString, Document *output)
+bool IRBuilder::generateFromQml(const QString &code, const QString &url, const QString &urlString, Document *output)
 {
     this->url = url;
     QQmlJS::AST::UiProgram *program = 0;
@@ -602,7 +602,6 @@ bool IRBuilder::generateFromQml(const QString &code, const QUrl &url, const QStr
     accept(program->headers);
 
     if (program->members->next) {
-        QQmlError error;
         QQmlJS::AST::SourceLocation loc = program->members->next->firstSourceLocation();
         recordError(loc, QCoreApplication::translate("QQmlParser", "Unexpected object definition"));
         return false;
@@ -971,8 +970,7 @@ bool IRBuilder::visit(QQmlJS::AST::UiPublicMember *node)
             const TypeNameToType *type = 0;
             for (int typeIndex = 0; typeIndex < propTypeNameToTypesCount; ++typeIndex) {
                 const TypeNameToType *t = propTypeNameToTypes + typeIndex;
-                if (t->nameLength == size_t(memberType.length()) &&
-                    QHashedString::compare(memberType.constData(), t->name, static_cast<int>(t->nameLength))) {
+                if (memberType == QLatin1String(t->name, static_cast<int>(t->nameLength))) {
                     type = t;
                     break;
                 }
@@ -1023,16 +1021,14 @@ bool IRBuilder::visit(QQmlJS::AST::UiPublicMember *node)
         bool typeFound = false;
         QV4::CompiledData::Property::Type type;
 
-        if ((unsigned)memberType.length() == strlen("alias") &&
-            QHashedString::compare(memberType.constData(), "alias", static_cast<int>(strlen("alias")))) {
+        if (memberType == QLatin1String("alias")) {
             type = QV4::CompiledData::Property::Alias;
             typeFound = true;
         }
 
         for (int ii = 0; !typeFound && ii < propTypeNameToTypesCount; ++ii) {
             const TypeNameToType *t = propTypeNameToTypes + ii;
-            if (t->nameLength == size_t(memberType.length()) &&
-                QHashedString::compare(memberType.constData(), t->name, static_cast<int>(t->nameLength))) {
+            if (memberType == QLatin1String(t->name, static_cast<int>(t->nameLength))) {
                 type = t->type;
                 typeFound = true;
             }
@@ -1043,8 +1039,7 @@ bool IRBuilder::visit(QQmlJS::AST::UiPublicMember *node)
 
             if (typeModifier.isEmpty()) {
                 type = QV4::CompiledData::Property::Custom;
-            } else if ((unsigned)typeModifier.length() == strlen("list") &&
-                      QHashedString::compare(typeModifier.constData(), "list", static_cast<int>(strlen("list")))) {
+            } else if (typeModifier == QLatin1String("list")) {
                 type = QV4::CompiledData::Property::CustomList;
             } else {
                 recordError(node->typeModifierToken, QCoreApplication::translate("QQmlParser","Invalid property type modifier"));
@@ -1483,11 +1478,9 @@ bool IRBuilder::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToResolve, O
 
 void IRBuilder::recordError(const QQmlJS::AST::SourceLocation &location, const QString &description)
 {
-    QQmlError error;
-    error.setUrl(url);
-    error.setLine(location.startLine);
-    error.setColumn(location.startColumn);
-    error.setDescription(description);
+    QQmlJS::DiagnosticMessage error;
+    error.loc = location;
+    error.message = description;
     errors << error;
 }
 
@@ -1766,6 +1759,7 @@ QVector<int> JSCodeGen::generateJSCodeForFunctionsAndBindings(const QList<Compil
     return runtimeFunctionIndices;
 }
 
+#ifndef V4_BOOTSTRAP
 QQmlPropertyData *JSCodeGen::lookupQmlCompliantProperty(QQmlPropertyCache *cache, const QString &name, bool *propertyExistsButForceNameLookup)
 {
     if (propertyExistsButForceNameLookup)
@@ -1967,6 +1961,8 @@ static void initMetaObjectResolver(QV4::IR::MemberExpressionResolver *resolver,
     resolver->isQObjectResolver = true;
 }
 
+#endif // V4_BOOTSTRAP
+
 void JSCodeGen::beginFunctionBodyHook()
 {
     _contextObjectTemp = _block->newTemp();
@@ -1974,6 +1970,7 @@ void JSCodeGen::beginFunctionBodyHook()
     _importedScriptsTemp = _block->newTemp();
     _idArrayTemp = _block->newTemp();
 
+#ifndef V4_BOOTSTRAP
     QV4::IR::Temp *temp = _block->TEMP(_contextObjectTemp);
     initMetaObjectResolver(&temp->memberResolver, _contextObject);
     move(temp, _block->NAME(QV4::IR::Name::builtin_qml_context_object, 0, 0));
@@ -1984,15 +1981,16 @@ void JSCodeGen::beginFunctionBodyHook()
 
     move(_block->TEMP(_importedScriptsTemp), _block->NAME(QV4::IR::Name::builtin_qml_imported_scripts_object, 0, 0));
     move(_block->TEMP(_idArrayTemp), _block->NAME(QV4::IR::Name::builtin_qml_id_array, 0, 0));
+#endif
 }
 
 QV4::IR::Expr *JSCodeGen::fallbackNameLookup(const QString &name, int line, int col)
 {
-    if (_disableAcceleratedLookups)
-        return 0;
-
     Q_UNUSED(line)
     Q_UNUSED(col)
+#ifndef V4_BOOTSTRAP
+    if (_disableAcceleratedLookups)
+        return 0;
     // Implement QML lookup semantics in the current file context.
     //
     // Note: We do not check if properties of the qml scope object or context object
@@ -2073,10 +2071,15 @@ QV4::IR::Expr *JSCodeGen::fallbackNameLookup(const QString &name, int line, int
         }
     }
 
+#else
+    Q_UNUSED(name)
+#endif // V4_BOOTSTRAP
     // fall back to name lookup at run-time.
     return 0;
 }
 
+#ifndef V4_BOOTSTRAP
+
 QQmlPropertyData *PropertyResolver::property(const QString &name, bool *notInRevision, QObject *object, QQmlContextData *context)
 {
     if (notInRevision) *notInRevision = false;
@@ -2123,3 +2126,5 @@ QQmlPropertyData *PropertyResolver::signal(const QString &name, bool *notInRevis
 
     return 0;
 }
+
+#endif // V4_BOOTSTRAP
index 4ea7e05..3ea6baf 100644 (file)
 #include <private/qqmljsmemorypool_p.h>
 #include <private/qv4codegen_p.h>
 #include <private/qv4compiler_p.h>
-#include <private/qqmlpropertycache_p.h>
 #include <QTextStream>
 #include <QCoreApplication>
 
+#ifndef V4_BOOTSTRAP
+#include <private/qqmlpropertycache_p.h>
+#endif
+
 QT_BEGIN_NAMESPACE
 
+class QQmlPropertyCache;
 class QQmlContextData;
 class QQmlTypeNameCache;
 
@@ -247,7 +251,7 @@ struct Q_QML_EXPORT CompiledFunctionOrExpression
     CompiledFunctionOrExpression *next;
 };
 
-struct Q_QML_EXPORT Object
+struct Q_QML_PRIVATE_EXPORT Object
 {
     Q_DECLARE_TR_FUNCTIONS(Object)
 public:
@@ -297,7 +301,7 @@ private:
     PoolList<Function> *functions;
 };
 
-struct Q_QML_EXPORT Pragma
+struct Q_QML_PRIVATE_EXPORT Pragma
 {
     enum PragmaType {
         PragmaSingleton = 0x1
@@ -307,7 +311,7 @@ struct Q_QML_EXPORT Pragma
     QV4::CompiledData::Location location;
 };
 
-struct Q_QML_EXPORT Document
+struct Q_QML_PRIVATE_EXPORT Document
 {
     Document(bool debugMode);
     QString code;
@@ -330,16 +334,16 @@ struct Q_QML_EXPORT Document
     int registerString(const QString &str) { return jsGenerator.registerString(str); }
     QString stringAt(int index) const { return jsGenerator.stringForIndex(index); }
 
-    void extractScriptMetaData(QString &script, QQmlError *error);
+    void extractScriptMetaData(QString &script, QQmlJS::DiagnosticMessage *error);
     static void removeScriptPragmas(QString &script);
 };
 
-struct Q_QML_EXPORT IRBuilder : public QQmlJS::AST::Visitor
+struct Q_QML_PRIVATE_EXPORT IRBuilder : public QQmlJS::AST::Visitor
 {
     Q_DECLARE_TR_FUNCTIONS(QQmlCodeGenerator)
 public:
     IRBuilder(const QSet<QString> &illegalNames);
-    bool generateFromQml(const QString &code, const QUrl &url, const QString &urlString, Document *output);
+    bool generateFromQml(const QString &code, const QString &url, const QString &urlString, Document *output);
 
     static bool isSignalPropertyName(const QString &name);
 
@@ -401,7 +405,7 @@ public:
 
     static bool isStatementNodeScript(QQmlJS::AST::Statement *statement);
 
-    QList<QQmlError> errors;
+    QList<QQmlJS::DiagnosticMessage> errors;
 
     QSet<QString> illegalNames;
 
@@ -416,11 +420,11 @@ public:
 
     QQmlJS::MemoryPool *pool;
     QString sourceCode;
-    QUrl url;
+    QString url;
     QV4::Compiler::JSUnitGenerator *jsGenerator;
 };
 
-struct Q_QML_EXPORT QmlUnitGenerator
+struct Q_QML_PRIVATE_EXPORT QmlUnitGenerator
 {
     QV4::CompiledData::QmlUnit *generate(Document &output);
 
@@ -429,6 +433,7 @@ private:
     char *writeBindings(char *bindingPtr, Object *o, BindingFilter filter) const;
 };
 
+#ifndef V4_BOOTSTRAP
 struct Q_QML_EXPORT PropertyResolver
 {
     PropertyResolver(QQmlPropertyCache *cache)
@@ -447,8 +452,9 @@ struct Q_QML_EXPORT PropertyResolver
 
     QQmlPropertyCache *cache;
 };
+#endif
 
-struct Q_QML_EXPORT JSCodeGen : public QQmlJS::Codegen
+struct Q_QML_PRIVATE_EXPORT JSCodeGen : public QQmlJS::Codegen
 {
     JSCodeGen(const QString &fileName, const QString &sourceCode, QV4::IR::Module *jsModule,
               QQmlJS::Engine *jsEngine, QQmlJS::AST::UiProgram *qmlRoot, QQmlTypeNameCache *imports,
index b5ddf3b..30410ac 100644 (file)
@@ -2477,7 +2477,7 @@ bool QQmlJSCodeGenerator::compileJavaScriptCodeInObjectsRecursively(int objectIn
             functionsToCompile << *foe;
         }
         const QVector<int> runtimeFunctionIndices = v4CodeGen->generateJSCodeForFunctionsAndBindings(functionsToCompile);
-        QList<QQmlError> jsErrors = v4CodeGen->errors();
+        QList<QQmlError> jsErrors = v4CodeGen->qmlErrors();
         if (!jsErrors.isEmpty()) {
             foreach (const QQmlError &e, jsErrors)
                 compiler->recordError(e);
index 0d4eb39..166fb51 100644 (file)
@@ -41,7 +41,6 @@
 
 #include "qv4codegen_p.h"
 #include "qv4util_p.h"
-#include "qv4debugging_p.h"
 
 #include <QtCore/QCoreApplication>
 #include <QtCore/QStringList>
 #include <QtCore/QLinkedList>
 #include <QtCore/QStack>
 #include <private/qqmljsast_p.h>
-#include <qv4runtime_p.h>
+#include <private/qv4string_p.h>
+#include <private/qv4value_inl_p.h>
+
+#ifndef V4_BOOTSTRAP
 #include <qv4context_p.h>
+#endif
+
 #include <cmath>
 #include <iostream>
 
@@ -2810,11 +2814,9 @@ void Codegen::throwSyntaxError(const SourceLocation &loc, const QString &detail)
         return;
 
     hasError = true;
-    QQmlError error;
-    error.setUrl(_fileNameIsUrl ? QUrl(_module->fileName) : QUrl::fromLocalFile(_module->fileName));
-    error.setDescription(detail);
-    error.setLine(loc.startLine);
-    error.setColumn(loc.startColumn);
+    QQmlJS::DiagnosticMessage error;
+    error.message = detail;
+    error.loc = loc;
     _errors << error;
 }
 
@@ -2824,19 +2826,37 @@ void Codegen::throwReferenceError(const SourceLocation &loc, const QString &deta
         return;
 
     hasError = true;
-    QQmlError error;
-    error.setUrl(_fileNameIsUrl ? QUrl(_module->fileName) : QUrl::fromLocalFile(_module->fileName));
-    error.setDescription(detail);
-    error.setLine(loc.startLine);
-    error.setColumn(loc.startColumn);
+    QQmlJS::DiagnosticMessage error;
+    error.message = detail;
+    error.loc = loc;
     _errors << error;
 }
 
-QList<QQmlError> Codegen::errors() const
+QList<QQmlJS::DiagnosticMessage> Codegen::errors() const
 {
     return _errors;
 }
 
+#ifndef V4_BOOTSTRAP
+
+QList<QQmlError> Codegen::qmlErrors() const
+{
+    QList<QQmlError> qmlErrors;
+    qmlErrors.reserve(_errors.size());
+
+    QUrl url(_fileNameIsUrl ? QUrl(_module->fileName) : QUrl::fromLocalFile(_module->fileName));
+    foreach (const QQmlJS::DiagnosticMessage &msg, _errors) {
+        QQmlError e;
+        e.setUrl(url);
+        e.setLine(msg.loc.startLine);
+        e.setColumn(msg.loc.startColumn);
+        e.setDescription(msg.message);
+        qmlErrors << e;
+    }
+
+    return qmlErrors;
+}
+
 void RuntimeCodegen::throwSyntaxError(const AST::SourceLocation &loc, const QString &detail)
 {
     if (hasError)
@@ -2852,3 +2872,5 @@ void RuntimeCodegen::throwReferenceError(const AST::SourceLocation &loc, const Q
     hasError = true;
     context->throwReferenceError(detail, _module->fileName, loc.startLine, loc.startColumn);
 }
+
+#endif // V4_BOOTSTRAP
index c495437..fafcfdd 100644 (file)
 #include "qv4jsir_p.h"
 #include <private/qqmljsastvisitor_p.h>
 #include <private/qqmljsast_p.h>
+#include <private/qqmljsengine_p.h>
 #include <QtCore/QStringList>
 #include <QStack>
+#ifndef V4_BOOTSTRAP
 #include <qqmlerror.h>
+#endif
 #include <private/qv4util_p.h>
 
 QT_BEGIN_NAMESPACE
@@ -62,7 +65,7 @@ class UiParameterList;
 }
 
 
-class Q_QML_EXPORT Codegen: protected AST::Visitor
+class Q_QML_PRIVATE_EXPORT Codegen: protected AST::Visitor
 {
 public:
     Codegen(bool strict);
@@ -434,7 +437,10 @@ protected:
     virtual void throwReferenceError(const AST::SourceLocation &loc, const QString &detail);
 
 public:
-    QList<QQmlError> errors() const;
+    QList<DiagnosticMessage> errors() const;
+#ifndef V4_BOOTSTRAP
+    QList<QQmlError> qmlErrors() const;
+#endif
 
 protected:
     Result _expr;
@@ -456,7 +462,7 @@ protected:
 
     bool _fileNameIsUrl;
     bool hasError;
-    QList<QQmlError> _errors;
+    QList<QQmlJS::DiagnosticMessage> _errors;
 
     class ScanFunctions: protected Visitor
     {
@@ -532,6 +538,7 @@ protected:
 
 };
 
+#ifndef V4_BOOTSTRAP
 class RuntimeCodegen : public Codegen
 {
 public:
@@ -545,6 +552,7 @@ public:
 private:
     QV4::ExecutionContext *context;
 };
+#endif // V4_BOOTSTRAP
 
 }
 
index 56497ed..cd9d8fe 100644 (file)
 
 #include "qv4compileddata_p.h"
 #include "qv4jsir_p.h"
+#include <private/qv4value_inl_p.h>
+#ifndef V4_BOOTSTRAP
 #include <private/qv4engine_p.h>
 #include <private/qv4function_p.h>
 #include <private/qv4objectproto_p.h>
 #include <private/qv4lookup_p.h>
 #include <private/qv4regexpobject_p.h>
+#endif
 #include <private/qqmlirbuilder_p.h>
 #include <QCoreApplication>
 
@@ -57,6 +60,7 @@ namespace QV4 {
 
 namespace CompiledData {
 
+#ifndef V4_BOOTSTRAP
 CompilationUnit::~CompilationUnit()
 {
     unlink();
@@ -181,6 +185,8 @@ void CompilationUnit::markObjects(QV4::ExecutionEngine *e)
     }
 }
 
+#endif // V4_BOOTSTRAP
+
 Unit *CompilationUnit::createUnitData(QmlIR::Document *irDocument)
 {
     return irDocument->jsGenerator.generateUnit();
@@ -198,6 +204,11 @@ QString Binding::valueAsString(const Unit *unit) const
         return QString::number(value.d);
     case Type_Invalid:
         return QString();
+#ifdef QT_NO_TRANSLATION
+    case Type_TranslationById:
+    case Type_Translation:
+        return unit->stringAt(stringIndex);
+#else
     case Type_TranslationById: {
         QByteArray id = unit->stringAt(stringIndex).toUtf8();
         return qtTrId(id.constData(), value.translationData.number);
@@ -214,6 +225,7 @@ QString Binding::valueAsString(const Unit *unit) const
         return QCoreApplication::translate(contextUtf8.constData(), text.constData(),
                                            comment.constData(), value.translationData.number);
     }
+#endif
     default:
         break;
     }
index a4dcfd9..1fba6c0 100644 (file)
@@ -150,7 +150,6 @@ struct JSClass
 
 struct String
 {
-    quint32 hash;
     quint32 flags; // isArrayIndex
     QArrayData str;
     // uint16 strdata[]
@@ -295,7 +294,7 @@ struct Q_QML_EXPORT TranslationData {
     int number;
 };
 
-struct Q_QML_EXPORT Binding
+struct Q_QML_PRIVATE_EXPORT Binding
 {
     quint32 propertyNameIndex;
 
@@ -561,26 +560,38 @@ struct QmlUnit
 //    CompilationUnit * (for functions that need to clean up)
 //    CompiledData::Function *compiledFunction
 
-struct Q_QML_EXPORT CompilationUnit
+struct Q_QML_PRIVATE_EXPORT CompilationUnit
 {
+#ifdef V4_BOOTSTRAP
+    CompilationUnit()
+        : refCount(0)
+        , data(0)
+    {}
+    virtual ~CompilationUnit() {}
+#else
     CompilationUnit()
         : refCount(0)
-        , engine(0)
         , data(0)
+        , engine(0)
         , runtimeStrings(0)
         , runtimeLookups(0)
         , runtimeRegularExpressions(0)
         , runtimeClasses(0)
     {}
     virtual ~CompilationUnit();
+#endif
 
     void ref() { ++refCount; }
     void deref() { if (!--refCount) delete this; }
 
     int refCount;
-    ExecutionEngine *engine;
     Unit *data;
 
+    // Called only when building QML, when we build the header for JS first and append QML data
+    virtual QV4::CompiledData::Unit *createUnitData(QmlIR::Document *irDocument);
+
+#ifndef V4_BOOTSTRAP
+    ExecutionEngine *engine;
     QString fileName() const { return data->stringAt(data->sourceFileIndex); }
 
     QV4::StringValue *runtimeStrings; // Array
@@ -589,9 +600,6 @@ struct Q_QML_EXPORT CompilationUnit
     QV4::InternalClass **runtimeClasses;
     QVector<QV4::Function *> runtimeFunctions;
 
-    // Called only when building QML, when we build the header for JS first and append QML data
-    virtual QV4::CompiledData::Unit *createUnitData(QmlIR::Document *irDocument);
-
     QV4::Function *linkToEngine(QV4::ExecutionEngine *engine);
     void unlink();
 
@@ -601,6 +609,7 @@ struct Q_QML_EXPORT CompilationUnit
 
 protected:
     virtual void linkBackendToEngine(QV4::ExecutionEngine *engine) = 0;
+#endif // V4_BOOTSTRAP
 };
 
 }
index 17e0851..65ef5c4 100644 (file)
@@ -42,8 +42,8 @@
 #include <qv4compiler_p.h>
 #include <qv4compileddata_p.h>
 #include <qv4isel_p.h>
-#include <qv4engine_p.h>
-#include <private/qqmlpropertycache_p.h>
+#include <private/qv4string_p.h>
+#include <private/qv4value_inl_p.h>
 
 QV4::Compiler::StringTableGenerator::StringTableGenerator()
 {
@@ -81,7 +81,6 @@ void QV4::Compiler::StringTableGenerator::serialize(uint *stringTable, char *dat
         const QString &qstr = strings.at(i);
 
         QV4::CompiledData::String *s = (QV4::CompiledData::String*)(stringData);
-        s->hash = QV4::String::createHashValue(qstr.constData(), qstr.length());
         s->flags = 0; // ###
         s->str.ref.atomic.store(-1);
         s->str.size = qstr.length();
index e04f13a..a52128f 100644 (file)
@@ -59,7 +59,7 @@ struct JSClassMember;
 
 namespace Compiler {
 
-struct Q_QML_EXPORT StringTableGenerator {
+struct Q_QML_PRIVATE_EXPORT StringTableGenerator {
     StringTableGenerator();
 
     int registerString(const QString &str);
@@ -79,7 +79,7 @@ private:
     uint stringDataSize;
 };
 
-struct Q_QML_EXPORT JSUnitGenerator {
+struct Q_QML_PRIVATE_EXPORT JSUnitGenerator {
     JSUnitGenerator(IR::Module *module, int headerSize = -1);
 
     int registerString(const QString &str) { return stringTable.registerString(str); }
index 9864135..4296880 100644 (file)
 **
 ****************************************************************************/
 
-#include "qv4debugging_p.h"
-#include "qv4engine_p.h"
 #include "qv4jsir_p.h"
 #include "qv4isel_p.h"
 #include "qv4isel_util_p.h"
-#include "qv4functionobject_p.h"
-#include "qv4function_p.h"
+#include <private/qv4value_inl_p.h>
+#ifndef V4_BOOTSTRAP
 #include <private/qqmlpropertycache_p.h>
+#endif
 
 #include <QString>
 
@@ -68,7 +67,9 @@ EvalInstructionSelection::EvalInstructionSelection(QV4::ExecutableAllocator *exe
         ownJSGenerator.reset(jsGenerator);
     }
     this->jsGenerator = jsGenerator;
+#ifndef V4_BOOTSTRAP
     Q_ASSERT(execAllocator);
+#endif
     Q_ASSERT(module);
 }
 
@@ -144,6 +145,9 @@ void IRDecoder::visitMove(IR::Move *s)
             }
         } else if (IR::Member *m = s->source->asMember()) {
             if (m->property) {
+#ifdef V4_BOOTSTRAP
+                Q_UNIMPLEMENTED();
+#else
                 bool captureRequired = true;
 
                 Q_ASSERT(m->kind != IR::Member::MemberOfEnum);
@@ -159,6 +163,7 @@ void IRDecoder::visitMove(IR::Move *s)
                     }
                 }
                 getQObjectProperty(m->base, m->property->coreIndex, captureRequired, attachedPropertiesId, t);
+#endif // V4_BOOTSTRAP
                 return;
             } else if (m->base->asTemp() || m->base->asConst()) {
                 getProperty(m->base, *m->name, t);
@@ -200,7 +205,11 @@ void IRDecoder::visitMove(IR::Move *s)
                 Q_ASSERT(m->kind != IR::Member::MemberOfEnum);
                 const int attachedPropertiesId = m->attachedPropertiesIdOrEnumValue;
                 if (m->property && attachedPropertiesId == 0) {
+#ifdef V4_BOOTSTRAP
+                    Q_UNIMPLEMENTED();
+#else
                     setQObjectProperty(s->source, m->base, m->property->coreIndex);
+#endif
                     return;
                 } else {
                     setProperty(s->source, m->base, *m->name);
index c0de4ec..74e6ba8 100644 (file)
@@ -59,7 +59,7 @@ namespace QV4 {
 class ExecutableAllocator;
 struct Function;
 
-class Q_QML_EXPORT EvalInstructionSelection
+class Q_QML_PRIVATE_EXPORT EvalInstructionSelection
 {
 public:
     EvalInstructionSelection(QV4::ExecutableAllocator *execAllocator, IR::Module *module, QV4::Compiler::JSUnitGenerator *jsGenerator);
@@ -90,7 +90,7 @@ protected:
     IR::Module *irModule;
 };
 
-class Q_QML_EXPORT EvalISelFactory
+class Q_QML_PRIVATE_EXPORT EvalISelFactory
 {
 public:
     virtual ~EvalISelFactory() = 0;
@@ -99,7 +99,7 @@ public:
 };
 
 namespace IR {
-class Q_QML_EXPORT IRDecoder: protected IR::StmtVisitor
+class Q_QML_PRIVATE_EXPORT IRDecoder: protected IR::StmtVisitor
 {
 public:
     IRDecoder() : _function(0) {}
index efce64b..a5ccaeb 100644 (file)
@@ -42,7 +42,9 @@
 #include "qv4jsir_p.h"
 #include <private/qqmljsast_p.h>
 
+#ifndef V4_BOOTSTRAP
 #include <private/qqmlpropertycache_p.h>
+#endif
 #include <QtCore/qtextstream.h>
 #include <QtCore/qdebug.h>
 #include <QtCore/qset.h>
@@ -276,12 +278,14 @@ static QString dumpStart(const Expr *e) {
         return QString();
 
     QString result = typeName(e->type);
+#ifndef V4_BOOTSTRAP
     const Temp *temp = const_cast<Expr*>(e)->asTemp();
     if (e->type == QObjectType && temp && temp->memberResolver.isQObjectResolver) {
         result += QLatin1Char('<');
         result += QString::fromUtf8(static_cast<QQmlPropertyCache*>(temp->memberResolver.data)->className());
         result += QLatin1Char('>');
     }
+#endif
     result += QLatin1Char('{');
     return result;
 }
@@ -554,8 +558,10 @@ void Member::dump(QTextStream &out) const
     else
         base->dump(out);
     out << '.' << *name;
+#ifndef V4_BOOTSTRAP
     if (property)
         out << " (meta-property " << property->coreIndex << " <" << QMetaType::typeName(property->propType) << ">)";
+#endif
 }
 
 void Exp::dump(QTextStream &out, Mode)
index a333214..71120e6 100644 (file)
@@ -742,7 +742,7 @@ struct Phi: Stmt {
     virtual void dump(QTextStream &out, Mode mode);
 };
 
-struct Q_QML_EXPORT Module {
+struct Q_QML_PRIVATE_EXPORT Module {
     QQmlJS::MemoryPool pool;
     QVector<Function *> functions;
     Function *rootFunction;
index 338041a..6112c49 100644 (file)
@@ -54,9 +54,6 @@
 #include <QtCore/QLinkedList>
 #include <QtCore/QStack>
 #include <qv4runtime_p.h>
-#include <qv4context_p.h>
-#include <private/qqmlpropertycache_p.h>
-#include <private/qqmlengine_p.h>
 #include <cmath>
 #include <iostream>
 #include <cassert>
@@ -3373,8 +3370,8 @@ void optimizeSSA(IR::Function *function, DefUsesCalculator &defUses, DominatorTr
 
                     QV4::Primitive lc = convertToValue(leftConst);
                     QV4::Primitive rc = convertToValue(rightConst);
-                    double l = RuntimeHelpers::toNumber(&lc);
-                    double r = RuntimeHelpers::toNumber(&rc);
+                    double l = lc.toNumber();
+                    double r = rc.toNumber();
 
                     switch (binop->op) {
                     case OpMul:
index 87f28d0..0fa6f14 100644 (file)
@@ -137,7 +137,7 @@ public:
     }
 };
 
-class Q_QML_EXPORT Optimizer
+class Q_QML_PRIVATE_EXPORT Optimizer
 {
 public:
     Optimizer(Function *function)
index 9d5757b..72010d3 100644 (file)
@@ -1,11 +1,10 @@
 INCLUDEPATH += $$PWD
 INCLUDEPATH += $$OUT_PWD
 
+!qmldevtools_build {
 SOURCES += \
     $$PWD/qv4engine.cpp \
     $$PWD/qv4context.cpp \
-    $$PWD/qv4runtime.cpp \
-    $$PWD/qv4value.cpp \
     $$PWD/qv4persistent.cpp \
     $$PWD/qv4debugging.cpp \
     $$PWD/qv4lookup.cpp \
@@ -33,7 +32,6 @@ SOURCES += \
     $$PWD/qv4regexpobject.cpp \
     $$PWD/qv4stringobject.cpp \
     $$PWD/qv4variantobject.cpp \
-    $$PWD/qv4string.cpp \
     $$PWD/qv4objectiterator.cpp \
     $$PWD/qv4regexp.cpp \
     $$PWD/qv4serialize.cpp \
@@ -50,10 +48,7 @@ HEADERS += \
     $$PWD/qv4global_p.h \
     $$PWD/qv4engine_p.h \
     $$PWD/qv4context_p.h \
-    $$PWD/qv4runtime_p.h \
     $$PWD/qv4math_p.h \
-    $$PWD/qv4value_inl_p.h \
-    $$PWD/qv4value_p.h \
     $$PWD/qv4persistent_p.h \
     $$PWD/qv4debugging_p.h \
     $$PWD/qv4lookup_p.h \
@@ -81,7 +76,6 @@ HEADERS += \
     $$PWD/qv4regexpobject_p.h \
     $$PWD/qv4stringobject_p.h \
     $$PWD/qv4variantobject_p.h \
-    $$PWD/qv4string_p.h \
     $$PWD/qv4property_p.h \
     $$PWD/qv4objectiterator_p.h \
     $$PWD/qv4regexp_p.h \
@@ -97,6 +91,20 @@ HEADERS += \
     $$PWD/qv4vme_moth_p.h \
     $$PWD/qv4profiling_p.h
 
+}
+
+
+HEADERS += \
+    $$PWD/qv4runtime_p.h \
+    $$PWD/qv4value_inl_p.h \
+    $$PWD/qv4string_p.h \
+    $$PWD/qv4value_p.h
+
+SOURCES += \
+    $$PWD/qv4runtime.cpp \
+    $$PWD/qv4string.cpp \
+    $$PWD/qv4value.cpp
+
 # Use SSE2 floating point math on 32 bit instead of the default
 # 387 to make test results pass on 32 and on 64 bit builds.
 linux-g++*:isEqual(QT_ARCH,i386) {
index 4e05bb8..b5dc674 100644 (file)
@@ -45,6 +45,7 @@
 #include <QtCore/qglobal.h>
 #include <QString>
 #include <qtqmlglobal.h>
+#include <private/qtqmlglobal_p.h>
 
 #if defined(Q_CC_MSVC)
 #include <float.h>
@@ -66,6 +67,10 @@ inline double trunc(double d) { return d > 0 ? floor(d) : ceil(d); }
 
 #define qOffsetOf(s, m) ((size_t)((((char *)&(((s *)64)->m)) - 64)))
 
+#if defined(QT_BUILD_QMLDEVTOOLS_LIB) || defined(QT_QMLDEVTOOLS_LIB)
+#define V4_BOOTSTRAP
+#endif
+
 // Decide whether to enable or disable the JIT
 
 // White list architectures
index 5ad4c28..06d3e48 100644 (file)
@@ -187,7 +187,7 @@ const QV4::ObjectVTable classname::static_vtbl =    \
 }
 
 
-struct Q_QML_EXPORT Managed
+struct Q_QML_PRIVATE_EXPORT Managed
 {
     V4_MANAGED
     enum {
index 0dfaffc..40f38ee 100644 (file)
@@ -410,11 +410,13 @@ inline ArrayObject *value_cast(const Value &v) {
     return v.asArrayObject();
 }
 
+#ifndef V4_BOOTSTRAP
 template<>
 inline ReturnedValue value_convert<Object>(ExecutionEngine *e, const Value &v)
 {
     return v.toObject(e->currentContext())->asReturnedValue();
 }
+#endif
 
 struct ObjectRef : public ManagedRef
 {
index 4923c21..e44d1a0 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "qv4global_p.h"
 #include "qv4runtime_p.h"
+#ifndef V4_BOOTSTRAP
 #include "qv4object_p.h"
 #include "qv4jsir_p.h"
 #include "qv4objectproto_p.h"
@@ -54,6 +55,7 @@
 #include <private/qqmlcontextwrapper_p.h>
 #include "qv4qobjectwrapper_p.h"
 #include <private/qv8engine_p.h>
+#endif
 
 #include <QtCore/qmath.h>
 #include <QtCore/qnumeric.h>
@@ -63,7 +65,7 @@
 #include <typeinfo>
 #include <stdlib.h>
 
-#include "../../../3rdparty/double-conversion/double-conversion.h"
+#include "../../3rdparty/double-conversion/double-conversion.h"
 
 QT_BEGIN_NAMESPACE
 
@@ -207,6 +209,7 @@ void RuntimeCounters::count(const char *func, uint tag1, uint tag2)
 
 #endif // QV4_COUNT_RUNTIME_FUNCTIONS
 
+#ifndef V4_BOOTSTRAP
 void RuntimeHelpers::numberToString(QString *result, double num, int radix)
 {
     Q_ASSERT(result);
@@ -414,10 +417,7 @@ ReturnedValue RuntimeHelpers::objectDefaultValue(Object *object, int typeHint)
     return ctx->throwTypeError();
 }
 
-Bool Runtime::toBoolean(const ValueRef value)
-{
-    return value->toBoolean();
-}
+
 
 Returned<Object> *RuntimeHelpers::convertToObject(ExecutionContext *ctx, const ValueRef value)
 {
@@ -677,6 +677,8 @@ ReturnedValue Runtime::getActivationProperty(ExecutionContext *ctx, const String
     return ctx->getProperty(name);
 }
 
+#endif // V4_BOOTSTRAP
+
 uint RuntimeHelpers::equalHelper(const ValueRef x, const ValueRef y)
 {
     Q_ASSERT(x->type() != y->type() || (x->isManaged() && (x->isString() != y->isString())));
@@ -697,14 +699,20 @@ uint RuntimeHelpers::equalHelper(const ValueRef x, const ValueRef y)
         return Runtime::compareEqual(Primitive::fromDouble((double) x->booleanValue()), y);
     } else if (y->isBoolean()) {
         return Runtime::compareEqual(x, Primitive::fromDouble((double) y->booleanValue()));
-    } else if ((x->isNumber() || x->isString()) && y->isObject()) {
-        Scope scope(y->objectValue()->engine());
-        ScopedValue py(scope, RuntimeHelpers::toPrimitive(y, PREFERREDTYPE_HINT));
-        return Runtime::compareEqual(x, py);
-    } else if (x->isObject() && (y->isNumber() || y->isString())) {
-        Scope scope(x->objectValue()->engine());
-        ScopedValue px(scope, RuntimeHelpers::toPrimitive(x, PREFERREDTYPE_HINT));
-        return Runtime::compareEqual(px, y);
+    } else {
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+#else
+        if ((x->isNumber() || x->isString()) && y->isObject()) {
+            Scope scope(y->objectValue()->engine());
+            ScopedValue py(scope, RuntimeHelpers::toPrimitive(y, PREFERREDTYPE_HINT));
+            return Runtime::compareEqual(x, py);
+        } else if (x->isObject() && (y->isNumber() || y->isString())) {
+            Scope scope(x->objectValue()->engine());
+            ScopedValue px(scope, RuntimeHelpers::toPrimitive(x, PREFERREDTYPE_HINT));
+            return Runtime::compareEqual(px, y);
+        }
+#endif
     }
 
     return false;
@@ -732,15 +740,25 @@ QV4::Bool Runtime::compareGreaterThan(const QV4::ValueRef l, const QV4::ValueRef
         return l->integerValue() > r->integerValue();
     if (l->isNumber() && r->isNumber())
         return l->asDouble() > r->asDouble();
-    if (l->isString() && r->isString())
+    if (l->isString() && r->isString()) {
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+        return false;
+#else
         return r->stringValue()->compare(l->stringValue());
+#endif
+    }
 
     if (l->isObject() || r->isObject()) {
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+#else
         QV4::ExecutionEngine *e = (l->isObject() ? l->objectValue() : r->objectValue())->engine();
         QV4::Scope scope(e);
         QV4::ScopedValue pl(scope, RuntimeHelpers::toPrimitive(l, QV4::NUMBER_HINT));
         QV4::ScopedValue pr(scope, RuntimeHelpers::toPrimitive(r, QV4::NUMBER_HINT));
         return Runtime::compareGreaterThan(pl, pr);
+#endif
     }
 
     double dl = RuntimeHelpers::toNumber(l);
@@ -755,15 +773,25 @@ QV4::Bool Runtime::compareLessThan(const QV4::ValueRef l, const QV4::ValueRef r)
         return l->integerValue() < r->integerValue();
     if (l->isNumber() && r->isNumber())
         return l->asDouble() < r->asDouble();
-    if (l->isString() && r->isString())
+    if (l->isString() && r->isString()) {
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+        return false;
+#else
         return l->stringValue()->compare(r->stringValue());
+#endif
+    }
 
     if (l->isObject() || r->isObject()) {
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+#else
         QV4::ExecutionEngine *e = (l->isObject() ? l->objectValue() : r->objectValue())->engine();
         QV4::Scope scope(e);
         QV4::ScopedValue pl(scope, RuntimeHelpers::toPrimitive(l, QV4::NUMBER_HINT));
         QV4::ScopedValue pr(scope, RuntimeHelpers::toPrimitive(r, QV4::NUMBER_HINT));
         return Runtime::compareLessThan(pl, pr);
+#endif
     }
 
     double dl = RuntimeHelpers::toNumber(l);
@@ -778,15 +806,25 @@ QV4::Bool Runtime::compareGreaterEqual(const QV4::ValueRef l, const QV4::ValueRe
         return l->integerValue() >= r->integerValue();
     if (l->isNumber() && r->isNumber())
         return l->asDouble() >= r->asDouble();
-    if (l->isString() && r->isString())
+    if (l->isString() && r->isString()) {
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+        return false;
+#else
         return !l->stringValue()->compare(r->stringValue());
+#endif
+    }
 
     if (l->isObject() || r->isObject()) {
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+#else
         QV4::ExecutionEngine *e = (l->isObject() ? l->objectValue() : r->objectValue())->engine();
         QV4::Scope scope(e);
         QV4::ScopedValue pl(scope, RuntimeHelpers::toPrimitive(l, QV4::NUMBER_HINT));
         QV4::ScopedValue pr(scope, RuntimeHelpers::toPrimitive(r, QV4::NUMBER_HINT));
         return Runtime::compareGreaterEqual(pl, pr);
+#endif
     }
 
     double dl = RuntimeHelpers::toNumber(l);
@@ -801,15 +839,25 @@ QV4::Bool Runtime::compareLessEqual(const QV4::ValueRef l, const QV4::ValueRef r
         return l->integerValue() <= r->integerValue();
     if (l->isNumber() && r->isNumber())
         return l->asDouble() <= r->asDouble();
-    if (l->isString() && r->isString())
+    if (l->isString() && r->isString()) {
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+        return false;
+#else
         return !r->stringValue()->compare(l->stringValue());
+#endif
+    }
 
     if (l->isObject() || r->isObject()) {
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+#else
         QV4::ExecutionEngine *e = (l->isObject() ? l->objectValue() : r->objectValue())->engine();
         QV4::Scope scope(e);
         QV4::ScopedValue pl(scope, RuntimeHelpers::toPrimitive(l, QV4::NUMBER_HINT));
         QV4::ScopedValue pr(scope, RuntimeHelpers::toPrimitive(r, QV4::NUMBER_HINT));
         return Runtime::compareLessEqual(pl, pr);
+#endif
     }
 
     double dl = RuntimeHelpers::toNumber(l);
@@ -817,7 +865,7 @@ QV4::Bool Runtime::compareLessEqual(const QV4::ValueRef l, const QV4::ValueRef r
     return dl <= dr;
 }
 
-
+#ifndef V4_BOOTSTRAP
 ReturnedValue Runtime::callGlobalLookup(ExecutionContext *context, uint index, CallDataRef callData)
 {
     Scope scope(context);
@@ -1144,6 +1192,8 @@ QV4::ReturnedValue Runtime::setupArgumentsObject(ExecutionContext *ctx)
     return (new (c->engine->memoryManager) ArgumentsObject(c))->asReturnedValue();
 }
 
+#endif // V4_BOOTSTRAP
+
 QV4::ReturnedValue Runtime::increment(const QV4::ValueRef value)
 {
     TRACE1(value);
@@ -1168,6 +1218,8 @@ QV4::ReturnedValue Runtime::decrement(const QV4::ValueRef value)
     }
 }
 
+#ifndef V4_BOOTSTRAP
+
 QV4::ReturnedValue RuntimeHelpers::toString(QV4::ExecutionContext *ctx, const QV4::ValueRef value)
 {
     if (value->isString())
@@ -1187,6 +1239,8 @@ QV4::ReturnedValue RuntimeHelpers::toObject(QV4::ExecutionContext *ctx, const QV
     return Encode(o);
 }
 
+#endif // V4_BOOTSTRAP
+
 ReturnedValue Runtime::toDouble(const ValueRef value)
 {
     TRACE1(value);
@@ -1217,6 +1271,8 @@ unsigned Runtime::doubleToUInt(const double &d)
     return Primitive::toUInt32(d);
 }
 
+#ifndef V4_BOOTSTRAP
+
 ReturnedValue Runtime::regexpLiteral(ExecutionContext *ctx, int id)
 {
     return ctx->compilationUnit->runtimeRegularExpressions[id].asReturnedValue();
@@ -1301,6 +1357,8 @@ void Runtime::convertThisToObject(ExecutionContext *ctx)
     }
 }
 
+#endif // V4_BOOTSTRAP
+
 } // namespace QV4
 
 QT_END_NAMESPACE
index d00c579..0979105 100644 (file)
@@ -103,7 +103,7 @@ struct NoThrowContext : public ExecutionContext
 {
 };
 
-struct Q_QML_EXPORT Runtime {
+struct Q_QML_PRIVATE_EXPORT Runtime {
     // call
     static ReturnedValue callGlobalLookup(ExecutionContext *context, uint index, CallDataRef callData);
     static ReturnedValue callActivationProperty(ExecutionContext *, const StringRef name, CallDataRef callData);
@@ -232,7 +232,7 @@ struct Q_QML_EXPORT Runtime {
     static void setQmlQObjectProperty(ExecutionContext *ctx, const ValueRef object, int propertyIndex, const ValueRef value);
 };
 
-struct Q_QML_EXPORT RuntimeHelpers {
+struct Q_QML_PRIVATE_EXPORT RuntimeHelpers {
     static ReturnedValue objectDefaultValue(Object *object, int typeHint);
     static ReturnedValue toPrimitive(const ValueRef value, int typeHint);
 
@@ -255,6 +255,7 @@ struct Q_QML_EXPORT RuntimeHelpers {
 
 
 // type conversion and testing
+#ifndef V4_BOOTSTRAP
 inline ReturnedValue RuntimeHelpers::toPrimitive(const ValueRef value, int typeHint)
 {
     Object *o = value->asObject();
@@ -262,6 +263,7 @@ inline ReturnedValue RuntimeHelpers::toPrimitive(const ValueRef value, int typeH
         return value.asReturnedValue();
     return RuntimeHelpers::objectDefaultValue(o, typeHint);
 }
+#endif
 
 inline double RuntimeHelpers::toNumber(const ValueRef value)
 {
@@ -338,6 +340,7 @@ inline ReturnedValue Runtime::bitAnd(const ValueRef left, const ValueRef right)
     return Encode(lval & rval);
 }
 
+#ifndef V4_BOOTSTRAP
 inline ReturnedValue Runtime::add(ExecutionContext *ctx, const ValueRef left, const ValueRef right)
 {
     TRACE2(left, right);
@@ -349,6 +352,7 @@ inline ReturnedValue Runtime::add(ExecutionContext *ctx, const ValueRef left, co
 
     return RuntimeHelpers::addHelper(ctx, left, right);
 }
+#endif // V4_BOOTSTRAP
 
 inline ReturnedValue Runtime::sub(const ValueRef left, const ValueRef right)
 {
@@ -532,6 +536,7 @@ inline Bool Runtime::compareStrictNotEqual(const ValueRef left, const ValueRef r
     return ! RuntimeHelpers::strictEqual(left, right);
 }
 
+#ifndef V4_BOOTSTRAP
 inline Bool Runtime::compareInstanceof(ExecutionContext *ctx, const ValueRef left, const ValueRef right)
 {
     TRACE2(left, right);
@@ -550,6 +555,13 @@ inline uint Runtime::compareIn(ExecutionContext *ctx, const ValueRef left, const
     return v->booleanValue();
 }
 
+#endif // V4_BOOTSTRAP
+
+inline Bool Runtime::toBoolean(const ValueRef value)
+{
+    return value->toBoolean();
+}
+
 } // namespace QV4
 
 QT_END_NAMESPACE
index 3392268..36f61a1 100644 (file)
@@ -385,10 +385,10 @@ QV4::CompiledData::CompilationUnit *Script::precompile(IR::Module *module, Compi
 
     QQmlJS::Codegen cg(/*strict mode*/false);
     cg.generateFromProgram(url.toString(), source, program, module, QQmlJS::Codegen::EvalCode);
-    errors = cg.errors();
+    errors = cg.qmlErrors();
     if (!errors.isEmpty()) {
         if (reportedErrors)
-            *reportedErrors << cg.errors();
+            *reportedErrors << errors;
         return 0;
     }
 
index 575f605..d9aa881 100644 (file)
 ****************************************************************************/
 
 #include "qv4string_p.h"
+#include "qv4value_inl_p.h"
+#ifndef V4_BOOTSTRAP
 #include "qv4identifiertable_p.h"
 #include "qv4runtime_p.h"
 #include "qv4objectproto_p.h"
 #include "qv4stringobject_p.h"
+#endif
 #include <QtCore/QHash>
 
 using namespace QV4;
@@ -74,6 +77,8 @@ static uint toArrayIndex(const QChar *ch, const QChar *end, bool *ok)
     return i;
 }
 
+#ifndef V4_BOOTSTRAP
+
 static uint toArrayIndex(const char *ch, const char *end, bool *ok)
 {
     *ok = false;
@@ -407,13 +412,16 @@ uint String::createHashValue(const char *ch, int length)
     return h;
 }
 
+uint String::getLength(const Managed *m)
+{
+    return static_cast<const String *>(m)->length();
+}
+
+#endif // V4_BOOTSTRAP
+
 uint String::toArrayIndex(const QString &str)
 {
     bool ok;
     return ::toArrayIndex(str.constData(), str.constData() + str.length(), &ok);
 }
 
-uint String::getLength(const Managed *m)
-{
-    return static_cast<const String *>(m)->length();
-}
index ade64d1..ed2a4e3 100644 (file)
@@ -51,7 +51,8 @@ namespace QV4 {
 struct ExecutionEngine;
 struct Identifier;
 
-struct Q_QML_EXPORT String : public Managed {
+struct Q_QML_PRIVATE_EXPORT String : public Managed {
+#ifndef V4_BOOTSTRAP
     // ### FIXME: Should this be a V4_OBJECT
     V4_OBJECT
     Q_MANAGED_TYPE(String)
@@ -143,8 +144,6 @@ struct Q_QML_EXPORT String : public Managed {
         return len;
     }
 
-    static uint toArrayIndex(const QString &str);
-
     union {
         mutable QStringData *_text;
         mutable String *left;
@@ -174,8 +173,13 @@ protected:
 
 private:
     QChar *recursiveAppend(QChar *ch) const;
+#endif
+
+public:
+    static uint toArrayIndex(const QString &str);
 };
 
+#ifndef V4_BOOTSTRAP
 template<>
 inline String *value_cast(const Value &v) {
     return v.asString();
@@ -188,6 +192,7 @@ inline ReturnedValue value_convert<String>(ExecutionEngine *e, const Value &v)
 }
 
 DEFINE_REF(String, Managed);
+#endif
 
 }
 
index fa16662..e9246f7 100644 (file)
 **
 ****************************************************************************/
 #include <qv4engine_p.h>
+#ifndef V4_BOOTSTRAP
 #include <qv4object_p.h>
 #include <qv4objectproto_p.h>
 #include "qv4mm_p.h"
+#endif
 
 #include <wtf/MathExtras.h>
 
@@ -87,6 +89,9 @@ double Value::toNumberImpl() const
     case QV4::Value::Undefined_Type:
         return std::numeric_limits<double>::quiet_NaN();
     case QV4::Value::Managed_Type:
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+#else
         if (isString())
             return RuntimeHelpers::stringToNumber(stringValue()->toQString());
         {
@@ -95,6 +100,7 @@ double Value::toNumberImpl() const
             ScopedValue prim(scope, RuntimeHelpers::toPrimitive(ValueRef::fromRawValue(this), NUMBER_HINT));
             return prim->toNumber();
         }
+#endif
     case QV4::Value::Null_Type:
     case QV4::Value::Boolean_Type:
     case QV4::Value::Integer_Type:
@@ -104,6 +110,7 @@ double Value::toNumberImpl() const
     }
 }
 
+#ifndef V4_BOOTSTRAP
 QString Value::toQStringNoThrow() const
 {
     switch (type()) {
@@ -192,6 +199,7 @@ QString Value::toQString() const
     }
     } // switch
 }
+#endif // V4_BOOTSTRAP
 
 bool Value::sameValue(Value other) const {
     if (val == other.val)
@@ -263,6 +271,7 @@ double Primitive::toInteger(double number)
     return std::signbit(number) ? -v : v;
 }
 
+#ifndef V4_BOOTSTRAP
 String *Value::toString(ExecutionEngine *e) const
 {
     return toString(e->currentContext());
@@ -282,3 +291,4 @@ Object *Value::toObject(ExecutionContext *ctx) const
     return RuntimeHelpers::convertToObject(ctx, ValueRef::fromRawValue(this))->getPointer();
 }
 
+#endif // V4_BOOTSTRAP
index 35508f4..1fe9e1c 100644 (file)
@@ -180,14 +180,19 @@ inline bool Value::toBoolean() const
     case Value::Integer_Type:
         return (bool)int_32;
     case Value::Managed_Type:
+#ifdef V4_BOOTSTRAP
+        Q_UNIMPLEMENTED();
+#else
         if (isString())
             return stringValue()->toQString().length() > 0;
+#endif
         return true;
     default: // double
         return doubleValue() && !std::isnan(doubleValue());
     }
 }
 
+#ifndef V4_BOOTSTRAP
 inline uint Value::asArrayIndex() const
 {
 #if QT_POINTER_SIZE == 8
@@ -278,6 +283,8 @@ inline ErrorObject *Value::asErrorObject() const
 template<typename T>
 inline T *Value::as() const { Managed *m = isObject() ? managed() : 0; return m ? m->as<T>() : 0; }
 
+#endif
+
 } // namespace QV4
 
 QT_END_NAMESPACE
index 27c81d5..2c78062 100644 (file)
@@ -64,7 +64,7 @@ struct Returned : private T
     using T::asReturnedValue;
 };
 
-struct Q_QML_EXPORT Value
+struct Q_QML_PRIVATE_EXPORT Value
 {
     /*
         We use two different ways of encoding JS values. One for 32bit and one for 64bit systems.
@@ -372,7 +372,7 @@ inline String *Value::asString() const
     return 0;
 }
 
-struct Q_QML_EXPORT Primitive : public Value
+struct Q_QML_PRIVATE_EXPORT Primitive : public Value
 {
     inline static Primitive emptyValue();
     static inline Primitive fromBoolean(bool b);
index b6250ee..013f757 100644 (file)
@@ -1,4 +1,12 @@
 SOURCES += \
+    $$PWD/qqmldirparser.cpp \
+
+HEADERS += \
+    $$PWD/qqmldirparser_p.h \
+
+!qmldevtools_build {
+
+SOURCES += \
     $$PWD/qqmlopenmetaobject.cpp \
     $$PWD/qqmlvmemetaobject.cpp \
     $$PWD/qqmlengine.cpp \
@@ -31,7 +39,6 @@ SOURCES += \
     $$PWD/qqmltypenamecache.cpp \
     $$PWD/qqmlscriptstring.cpp \
     $$PWD/qqmlnetworkaccessmanagerfactory.cpp \
-    $$PWD/qqmldirparser.cpp \
     $$PWD/qqmlextensionplugin.cpp \
     $$PWD/qqmlimport.cpp \
     $$PWD/qqmllist.cpp \
@@ -102,7 +109,6 @@ HEADERS += \
     $$PWD/qqmlscriptstring.h \
     $$PWD/qqmlguard_p.h \
     $$PWD/qqmlnetworkaccessmanagerfactory.h \
-    $$PWD/qqmldirparser_p.h \
     $$PWD/qqmlextensioninterface.h \
     $$PWD/qqmlimport_p.h \
     $$PWD/qqmlextensionplugin.h \
@@ -133,3 +139,5 @@ HEADERS += \
 
 include(ftw/ftw.pri)
 include(v8/v8.pri)
+
+}
index c1d0132..a2b4b5e 100644 (file)
@@ -41,9 +41,7 @@
 
 #include "qqmldirparser_p.h"
 #include "qqmlerror.h"
-#include "qqmlglobal_p.h"
 
-#include <QtQml/qqmlfile.h>
 #include <QtCore/QtDebug>
 
 QT_BEGIN_NAMESPACE
@@ -281,10 +279,10 @@ bool QQmlDirParser::parse(const QString &source)
 
 void QQmlDirParser::reportError(quint16 line, quint16 column, const QString &description)
 {
-    QQmlError error;
-    error.setLine(line);
-    error.setColumn(column);
-    error.setDescription(description);
+    QQmlJS::DiagnosticMessage error;
+    error.loc.startLine = line;
+    error.loc.startColumn = column;
+    error.message = description;
     _errors.append(error);
 }
 
@@ -296,25 +294,41 @@ bool QQmlDirParser::hasError() const
     return false;
 }
 
+#if defined(QT_BUILD_QMLDEVTOOLS_LIB) || defined(QT_QMLDEVTOOLS_LIB)
+QList<QQmlJS::DiagnosticMessage> QQmlDirParser::errors(const QString &uri) const
+{
+    QList<QQmlJS::DiagnosticMessage> errors = _errors;
+    for (int i = 0; i < errors.size(); ++i) {
+        QQmlJS::DiagnosticMessage &msg = errors[i];
+        msg.message.replace(QLatin1String("$$URI$$"), uri);
+    }
+    return errors;
+}
+#else
 void QQmlDirParser::setError(const QQmlError &e)
 {
     _errors.clear();
-    _errors.append(e);
+    reportError(e.line(), e.column(), e.description());
 }
 
 QList<QQmlError> QQmlDirParser::errors(const QString &uri) const
 {
     QUrl url(uri);
-    QList<QQmlError> errors = _errors;
-    for (int i = 0; i < errors.size(); ++i) {
-        QQmlError &e = errors[i];
-        QString description = e.description();
+    QList<QQmlError> errors;
+    for (int i = 0; i < _errors.size(); ++i) {
+        const QQmlJS::DiagnosticMessage &msg = _errors.at(i);
+        QQmlError e;
+        QString description = msg.message;
         description.replace(QLatin1String("$$URI$$"), uri);
         e.setDescription(description);
         e.setUrl(url);
+        e.setLine(msg.loc.startLine);
+        e.setColumn(msg.loc.startColumn);
+        errors << e;
     }
     return errors;
 }
+#endif
 
 QString QQmlDirParser::typeNamespace() const
 {
@@ -331,7 +345,7 @@ QList<QQmlDirParser::Plugin> QQmlDirParser::plugins() const
     return _plugins;
 }
 
-QHash<QHashedStringRef,QQmlDirParser::Component> QQmlDirParser::components() const
+QHash<QString, QQmlDirParser::Component> QQmlDirParser::components() const
 {
     return _components;
 }
index e3607d1..bcdb366 100644 (file)
 #include <QtCore/QUrl>
 #include <QtCore/QHash>
 #include <QtCore/QDebug>
-#include <private/qhashedstring_p.h>
+#include <private/qqmljsengine_p.h>
+#include <private/qtqmlglobal_p.h>
 
 QT_BEGIN_NAMESPACE
 
 class QQmlError;
 class QQmlEngine;
-class Q_AUTOTEST_EXPORT QQmlDirParser
+class Q_QML_PRIVATE_EXPORT QQmlDirParser
 {
     Q_DISABLE_COPY(QQmlDirParser)
 
@@ -73,8 +74,12 @@ public:
     bool parse(const QString &source);
 
     bool hasError() const;
+#if defined(QT_BUILD_QMLDEVTOOLS_LIB) || defined(QT_QMLDEVTOOLS_LIB)
+    QList<QQmlJS::DiagnosticMessage> errors(const QString &uri) const;
+#else
     void setError(const QQmlError &);
     QList<QQmlError> errors(const QString &uri) const;
+#endif
 
     QString typeNamespace() const;
     void setTypeNamespace(const QString &s);
@@ -121,7 +126,7 @@ public:
         int minorVersion;
     };
 
-    QHash<QHashedStringRef,Component> components() const;
+    QHash<QString,Component> components() const;
     QList<Script> scripts() const;
     QList<Plugin> plugins() const;
 
@@ -142,9 +147,9 @@ private:
     void reportError(quint16 line, quint16 column, const QString &message);
 
 private:
-    QList<QQmlError> _errors;
+    QList<QQmlJS::DiagnosticMessage> _errors;
     QString _typeNamespace;
-    QHash<QHashedStringRef,Component> _components; // multi hash
+    QHash<QString,Component> _components; // multi hash
     QList<Script> _scripts;
     QList<Plugin> _plugins;
 #ifdef QT_CREATOR
@@ -152,7 +157,7 @@ private:
 #endif
 };
 
-typedef QHash<QHashedStringRef,QQmlDirParser::Component> QQmlDirComponents;
+typedef QHash<QString,QQmlDirParser::Component> QQmlDirComponents;
 typedef QList<QQmlDirParser::Script> QQmlDirScripts;
 typedef QList<QQmlDirParser::Plugin> QQmlDirPlugins;
 
index 980d4ed..c0b21a9 100644 (file)
@@ -624,12 +624,13 @@ bool QQmlImportNamespace::Import::resolveType(QQmlTypeLoader *typeLoader,
         }
     }
 
-    QQmlDirComponents::ConstIterator it = qmlDirComponents.find(type), end = qmlDirComponents.end();
+    const QString typeStr = type.toString();
+    QQmlDirComponents::ConstIterator it = qmlDirComponents.find(typeStr), end = qmlDirComponents.end();
     if (it != end) {
         QString componentUrl;
         bool isCompositeSingleton = false;
         QQmlDirComponents::ConstIterator candidate = end;
-        for ( ; it != end && it.key() == type; ++it) {
+        for ( ; it != end && it.key() == typeStr; ++it) {
             const QQmlDirParser::Component &c = *it;
 
             // importing version -1 means import ALL versions
index e0c630e..3c94529 100644 (file)
@@ -48,6 +48,7 @@
 #include <QtCore/qstringlist.h>
 #include <private/qqmldirparser_p.h>
 #include <private/qqmlmetatype_p.h>
+#include <private/qhashedstring_p.h>
 
 //
 //  W A R N I N G
index c6693c2..7fc08bd 100644 (file)
@@ -2207,8 +2207,17 @@ void QQmlTypeData::dataReceived(const Data &data)
     QQmlEngine *qmlEngine = typeLoader()->engine();
     m_document.reset(new QmlIR::Document(QV8Engine::getV4(qmlEngine)->debugger != 0));
     QmlIR::IRBuilder compiler(QV8Engine::get(qmlEngine)->illegalNames());
-    if (!compiler.generateFromQml(code, finalUrl(), finalUrlString(), m_document.data())) {
-        setError(compiler.errors);
+    if (!compiler.generateFromQml(code, finalUrlString(), finalUrlString(), m_document.data())) {
+        QList<QQmlError> errors;
+        foreach (const QQmlJS::DiagnosticMessage &msg, compiler.errors) {
+            QQmlError e;
+            e.setUrl(finalUrl());
+            e.setLine(msg.loc.startLine);
+            e.setColumn(msg.loc.startColumn);
+            e.setDescription(msg.message);
+            errors << e;
+        }
+        setError(errors);
         return;
     }
 
@@ -2673,11 +2682,15 @@ void QQmlScriptBlob::dataReceived(const Data &data)
 
     QV4::ExecutionEngine *v4 = QV8Engine::getV4(m_typeLoader->engine());
     QmlIR::Document irUnit(v4->debugger != 0);
-    QQmlError metaDataError;
+    QQmlJS::DiagnosticMessage metaDataError;
     irUnit.extractScriptMetaData(source, &metaDataError);
-    if (metaDataError.isValid()) {
-        metaDataError.setUrl(finalUrl());
-        setError(metaDataError);
+    if (!metaDataError.message.isEmpty()) {
+        QQmlError e;
+        e.setUrl(finalUrl());
+        e.setLine(metaDataError.loc.startLine);
+        e.setColumn(metaDataError.loc.startColumn);
+        e.setDescription(metaDataError.message);
+        setError(e);
         return;
     }
 
index 564540e..e1900b7 100644 (file)
 
 #include "qtqmlglobal.h"
 
-#define Q_QML_PRIVATE_EXPORT Q_QML_EXPORT
+#if defined(QT_BUILD_QMLDEVTOOLS_LIB) || defined(QT_QMLDEVTOOLS_LIB)
+#    define Q_QML_PRIVATE_EXPORT
+#else
+#    define Q_QML_PRIVATE_EXPORT Q_QML_EXPORT
+#endif
 
 #endif // QTQMLGLOBAL_P_H
index 963fb1b..25d6494 100644 (file)
@@ -1,7 +1,7 @@
 option(host_build)
 TARGET     = QtQmlDevTools
 QT         = core
-CONFIG += static no_module_headers internal_module
+CONFIG += static no_module_headers internal_module qmldevtools_build
 
 MODULE_INCLUDES = \
     \$\$QT_MODULE_INCLUDE_BASE \
@@ -12,4 +12,8 @@ MODULE_PRIVATE_INCLUDES = \
 
 load(qt_module)
 
+include(../3rdparty/masm/masm-defs.pri)
 include(../qml/parser/parser.pri)
+include(../qml/jsruntime/jsruntime.pri)
+include(../qml/compiler/compiler.pri)
+include(../qml/qml/qml.pri)
index 6b13d1b..31b5c02 100644 (file)
 #include <private/qqmljsparser_p.h>
 #include <private/qqmljsastvisitor_p.h>
 #include <private/qqmljsast_p.h>
+#include <private/qqmlirbuilder_p.h>
+#include <private/qv4value_inl_p.h>
+#include <private/qv4codegen_p.h>
+#include <private/qqmldirparser_p.h>
 
 int main()
 {