Changeset View
Changeset View
Standalone View
Standalone View
src/qmljsc/moduleloading/moduleloading.cpp
Show All 40 Lines | |||||
41 | if (!condition) { \ | 41 | if (!condition) { \ | ||
42 | assertFailed(token, errorMessage); \ | 42 | assertFailed(token, errorMessage); \ | ||
43 | } | 43 | } | ||
44 | 44 | | |||
45 | 45 | | |||
46 | using namespace QmlJSc; | 46 | using namespace QmlJSc; | ||
47 | using namespace QQmlJS; | 47 | using namespace QQmlJS; | ||
48 | 48 | | |||
49 | QHash<IR::ImportDescription, IR::Module*> ModuleLoading::s_loadedModules; | 49 | QHash<QString, IR::Module*> ModuleLoading::s_loadedModules; | ||
50 | QVector<ModuleLoaderFactoryFunc> ModuleLoading::s_moduleLoaderFactories; | 50 | QVector<ModuleLoaderFactoryFunc> ModuleLoading::s_moduleLoaderFactories; | ||
51 | 51 | | |||
52 | IR::Module *ModuleLoading::loadModule(IR::ImportDescription import) | 52 | IR::Module *ModuleLoading::loadModule(QString name, int versionMajor, int versionMinor) | ||
53 | { | 53 | { | ||
54 | Q_ASSERT(import.kind == IR::ImportDescription::Kind_ModuleImport); | 54 | QString hashKey = QString("%1.%2.%3").arg(name).arg(versionMajor).arg(versionMinor); | ||
55 | if (IR::Module *module = s_loadedModules.value(import)) { | 55 | if (IR::Module *module = s_loadedModules.value(hashKey)) { | ||
56 | return module; | 56 | return module; | ||
57 | } | 57 | } | ||
58 | 58 | | |||
59 | IR::Module *module = new IR::Module(import, compiler); | 59 | IR::Module *module = new IR::Module(name, versionMajor, versionMinor, compiler); | ||
60 | s_loadedModules.insert(import, module); | 60 | s_loadedModules.insert(hashKey, module); | ||
61 | AbstractModuleLoader *loader = 0; | 61 | AbstractModuleLoader *loader = 0; | ||
62 | foreach (ModuleLoaderFactoryFunc createLoaderFor, s_moduleLoaderFactories) { | 62 | foreach (ModuleLoaderFactoryFunc createLoaderFor, s_moduleLoaderFactories) { | ||
63 | loader = createLoaderFor(module); // will delete itself when done | 63 | loader = createLoaderFor(module); // will delete itself when done | ||
64 | if (loader->canLoad()) { | 64 | if (loader->canLoad()) { | ||
65 | break; | 65 | break; | ||
66 | } else { | 66 | } else { | ||
67 | delete loader; | 67 | delete loader; | ||
68 | loader = 0; | 68 | loader = 0; | ||
69 | } | 69 | } | ||
70 | } | 70 | } | ||
71 | 71 | | |||
72 | if (!loader) { | 72 | if (!loader) { | ||
73 | throw new Error(Error::ModuleImportError, QStringLiteral("Module %1 %2.%3 was not " | 73 | throw new Error(Error::ModuleImportError, QStringLiteral("Module %1 %2.%3 was not " | ||
74 | "found. Check version and include paths.").arg(import.name).arg(import.versionMajor).arg(import.versionMinor)); | 74 | "found. Check version and include paths.").arg(name).arg(versionMajor).arg(versionMinor)); | ||
75 | } | 75 | } | ||
76 | 76 | | |||
77 | QThreadPool::globalInstance()->start(loader); | 77 | QThreadPool::globalInstance()->start(loader); | ||
78 | 78 | | |||
79 | return module; | 79 | return module; | ||
80 | } | 80 | } | ||
81 | 81 | | |||
82 | void ModuleLoading::registerModuleLoader(ModuleLoaderFactoryFunc factory) | 82 | void ModuleLoading::registerModuleLoader(ModuleLoaderFactoryFunc factory) | ||
83 | { | 83 | { | ||
84 | s_moduleLoaderFactories.append(factory); | 84 | s_moduleLoaderFactories.append(factory); | ||
85 | } | 85 | } | ||
86 | 86 | |