62
62
#include <QtQml/qqmlabstracturlinterceptor.h>
64
64
#include <private/qhashedstring_p.h>
65
#include <private/qqmlscript_p.h>
66
65
#include <private/qqmlimport_p.h>
67
66
#include <private/qqmlcleanup_p.h>
68
67
#include <private/qqmldirparser_p.h>
69
68
#include <private/qqmlbundle_p.h>
70
69
#include <private/qflagpointer_p.h>
70
#include <private/qqmlirbuilder_p.h>
72
#include <private/qv4value_p.h>
72
#include <private/qv4value_inl_p.h>
73
73
#include <private/qv4script_p.h>
190
191
// m_errors should *always* be written before the status is set to Error.
191
192
// We use the status change as a memory fence around m_errors so that locking
192
// isn't required. Once the status is set to Error (or Complete), m_errors
193
// isn't required. Once the status is set to Error (or Complete), m_errors
193
194
// cannot be changed.
194
195
QList<QQmlError> m_errors;
229
230
void load(QQmlDataBlob *, Mode = PreferSynchronous);
230
231
void loadWithStaticData(QQmlDataBlob *, const QByteArray &, Mode = PreferSynchronous);
232
void loadWithCachedUnit(QQmlDataBlob *blob, const QQmlPrivate::CachedQmlUnit *unit);
232
234
QQmlEngine *engine() const;
233
235
void initializeEngine(QQmlExtensionInterface *, const char *);
243
245
void loadThread(QQmlDataBlob *);
244
246
void loadWithStaticDataThread(QQmlDataBlob *, const QByteArray &);
247
void loadWithCachedUnitThread(QQmlDataBlob *blob, const QQmlPrivate::CachedQmlUnit *unit);
245
248
void networkReplyFinished(QNetworkReply *);
246
249
void networkReplyProgress(QNetworkReply *, qint64, qint64);
248
251
typedef QHash<QNetworkReply *, QQmlDataBlob *> NetworkReplies;
250
253
void setData(QQmlDataBlob *, const QByteArray &);
251
254
void setData(QQmlDataBlob *, QQmlFile *);
252
255
void setData(QQmlDataBlob *, const QQmlDataBlob::Data &);
256
void setCachedUnit(QQmlDataBlob *blob, const QQmlPrivate::CachedQmlUnit *unit);
254
258
QQmlEngine *m_engine;
255
259
QQmlDataLoaderThread *m_thread;
277
281
QQmlTypeLoader *typeLoader() const { return m_typeLoader; }
278
const QQmlImports &imports() const { return m_imports; }
282
const QQmlImports &imports() const { return m_importCache; }
281
bool addImport(const QQmlScript::Import &import, QList<QQmlError> *errors);
282
bool addPragma(const QQmlScript::Pragma &pragma, QList<QQmlError> *errors);
285
bool addImport(const QV4::CompiledData::Import *import, QList<QQmlError> *errors);
286
bool addPragma(const QmlIR::Pragma &pragma, QList<QQmlError> *errors);
284
bool fetchQmldir(const QUrl &url, const QQmlScript::Import *import, int priority, QList<QQmlError> *errors);
285
bool updateQmldir(QQmlQmldirData *data, const QQmlScript::Import *import, QList<QQmlError> *errors);
288
bool fetchQmldir(const QUrl &url, const QV4::CompiledData::Import *import, int priority, QList<QQmlError> *errors);
289
bool updateQmldir(QQmlQmldirData *data, const QV4::CompiledData::Import *import, QList<QQmlError> *errors);
288
292
virtual bool qmldirDataAvailable(QQmlQmldirData *, QList<QQmlError> *);
290
virtual void scriptImported(QQmlScriptBlob *, const QQmlScript::Location &, const QString &, const QString &) {}
294
virtual void scriptImported(QQmlScriptBlob *, const QV4::CompiledData::Location &, const QString &, const QString &) {}
292
296
virtual void dependencyError(QQmlDataBlob *);
293
297
virtual void dependencyComplete(QQmlDataBlob *);
300
virtual QString stringAt(int) const { return QString(); }
296
302
QQmlTypeLoader *m_typeLoader;
297
QQmlImports m_imports;
303
QQmlImports m_importCache;
298
304
bool m_isSingleton;
299
QHash<const QQmlScript::Import *, int> m_unresolvedImports;
305
QHash<const QV4::CompiledData::Import*, int> m_unresolvedImports;
300
306
QList<QQmlQmldirData *> m_qmldirs;
397
403
struct TypeReference
399
TypeReference() : type(0), majorVersion(0), minorVersion(0), typeData(0) {}
405
TypeReference() : type(0), majorVersion(0), minorVersion(0), typeData(0), needsCreation(true) {}
401
QQmlScript::Location location;
407
QV4::CompiledData::Location location;
403
409
int majorVersion;
404
410
int minorVersion;
405
411
QQmlTypeData *typeData;
406
412
QString prefix; // used by CompositeSingleton types
409
416
struct ScriptReference
411
418
ScriptReference() : script(0) {}
413
QQmlScript::Location location;
420
QV4::CompiledData::Location location;
414
421
QString qualifier;
415
422
QQmlScriptBlob *script;
426
const QQmlScript::Parser &parser() const;
433
const QHash<int, TypeReference> &resolvedTypeRefs() const { return m_resolvedTypes; }
428
const QList<TypeReference> &resolvedTypes() const;
429
435
const QList<ScriptReference> &resolvedScripts() const;
430
436
const QSet<QString> &namespaces() const;
431
437
const QList<TypeReference> &compositeSingletons() const;
445
451
virtual void done();
446
452
virtual void completed();
447
453
virtual void dataReceived(const Data &);
454
virtual void initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *unit);
448
455
virtual void allDependenciesDone();
449
456
virtual void downloadProgressChanged(qreal);
458
virtual QString stringAt(int index) const;
461
void continueLoadFromIR();
452
462
void resolveTypes();
454
bool resolveType(const QQmlScript::TypeReference *parserRef, int &majorVersion, int &minorVersion, TypeReference &ref);
456
virtual void scriptImported(QQmlScriptBlob *blob, const QQmlScript::Location &location, const QString &qualifier, const QString &nameSpace);
459
QQmlScript::Parser scriptParser;
461
QScopedPointer<QtQml::ParsedQML> parsedQML;
462
QList<QQmlScript::Import> m_newImports;
463
QList<QQmlScript::Pragma> m_newPragmas;
464
bool resolveType(const QString &typeName, int &majorVersion, int &minorVersion, TypeReference &ref);
466
virtual void scriptImported(QQmlScriptBlob *blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &nameSpace);
468
QScopedPointer<QmlIR::Document> m_document;
466
470
QList<ScriptReference> m_scripts;
468
472
QSet<QString> m_namespaces;
469
473
QList<TypeReference> m_compositeSingletons;
472
QList<TypeReference> m_types;
474
475
// map from name index to resolved type
475
476
QHash<int, TypeReference> m_resolvedTypes;
477
477
bool m_typesResolved:1;
478
bool m_useNewCompiler:1;
480
479
QQmlCompiledData *m_compiledData;
482
481
QList<TypeDataCallback *> m_callbacks;
484
QQmlScript::Import *m_implicitImport;
483
QV4::CompiledData::Import *m_implicitImport;
485
484
bool m_implicitImportLoaded;
486
485
bool loadImplicitImport();
489
// QQmlScriptData instances are created, uninitialized, by the loader in the
488
// QQmlScriptData instances are created, uninitialized, by the loader in the
490
489
// load thread. The first time they are used by the VME, they are initialized which
491
490
// creates their v8 objects and they are referenced and added to the engine's cleanup
492
// list. During QQmlCleanup::clear() all v8 resources are destroyed, and the
491
// list. During QQmlCleanup::clear() all v8 resources are destroyed, and the
493
492
// reference that was created is released but final deletion only occurs once all the
494
493
// references as released. This is all intended to ensure that the v8 resources are
495
494
// only created and destroyed in the main thread :)
541
538
ScriptReference() : script(0) {}
543
QQmlScript::Location location;
540
QV4::CompiledData::Location location;
544
541
QString qualifier;
545
542
QString nameSpace;
546
543
QQmlScriptBlob *script;
549
QQmlScript::Object::ScriptBlock::Pragmas pragmas() const;
551
546
QQmlScriptData *scriptData() const;
554
549
virtual void dataReceived(const Data &);
550
virtual void initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *unit);
555
551
virtual void done();
553
virtual QString stringAt(int index) const;
558
virtual void scriptImported(QQmlScriptBlob *blob, const QQmlScript::Location &location, const QString &qualifier, const QString &nameSpace);
561
QQmlScript::Parser::JavaScriptMetaData m_metadata;
556
virtual void scriptImported(QQmlScriptBlob *blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &nameSpace);
557
void initializeFromCompilationUnit(QV4::CompiledData::CompilationUnit *unit);
563
559
QList<ScriptReference> m_scripts;
564
560
QQmlScriptData *m_scriptData;
575
571
const QString &content() const;
577
const QQmlScript::Import *import() const;
578
void setImport(const QQmlScript::Import *);
573
const QV4::CompiledData::Import *import() const;
574
void setImport(const QV4::CompiledData::Import *);
580
576
int priority() const;
581
577
void setPriority(int);
584
580
virtual void dataReceived(const Data &);
581
virtual void initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit*);
587
584
QString m_content;
588
const QQmlScript::Import *m_import;
585
const QV4::CompiledData::Import *m_import;