diff options
Diffstat (limited to 'source')
| -rwxr-xr-x | source/slang/slang-compiler.h | 4 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 30 |
2 files changed, 34 insertions, 0 deletions
diff --git a/source/slang/slang-compiler.h b/source/slang/slang-compiler.h index a7903dd5a..46f16f0d5 100755 --- a/source/slang/slang-compiler.h +++ b/source/slang/slang-compiler.h @@ -1415,6 +1415,10 @@ namespace Slang SLANG_NO_THROW slang::IModule* SLANG_MCALL loadModule( const char* moduleName, slang::IBlob** outDiagnostics = nullptr) override; + SLANG_NO_THROW slang::IModule* SLANG_MCALL loadModuleFromSource( + const char* moduleName, + slang::IBlob* source, + slang::IBlob** outDiagnostics = nullptr) override; SLANG_NO_THROW SlangResult SLANG_MCALL createCompositeComponentType( slang::IComponentType* const* componentTypes, SlangInt componentTypeCount, diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp index 1362cb038..0fc5f6122 100644 --- a/source/slang/slang.cpp +++ b/source/slang/slang.cpp @@ -839,6 +839,36 @@ SLANG_NO_THROW slang::IModule* SLANG_MCALL Linkage::loadModule( } } +SLANG_NO_THROW slang::IModule* SLANG_MCALL Linkage::loadModuleFromSource( + const char* moduleName, + slang::IBlob* source, + slang::IBlob** outDiagnostics) +{ + try + { + auto name = getNamePool()->getName(moduleName); + RefPtr<LoadedModule> loadedModule; + if (mapNameToLoadedModules.TryGetValue(name, loadedModule)) + { + return loadedModule; + } + DiagnosticSink sink(getSourceManager(), Lexer::sourceLocationLexer); + auto module = loadModule( + name, + PathInfo::makeFromString(moduleName), + source, + SourceLoc(), + &sink); + sink.getBlobIfNeeded(outDiagnostics); + return asExternal(module); + + } + catch (const AbortCompilationException&) + { + return nullptr; + } +} + SLANG_NO_THROW SlangResult SLANG_MCALL Linkage::createCompositeComponentType( slang::IComponentType* const* componentTypes, SlangInt componentTypeCount, |
