From 6736b0c1c5fa3e89bc561eb7965a1a0d17af3466 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 29 Sep 2021 11:29:46 -0700 Subject: Add ISession::loadModuleFromSource. (#1950) Co-authored-by: Yong He --- slang.h | 7 +++++++ source/slang/slang-compiler.h | 4 ++++ source/slang/slang.cpp | 30 ++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/slang.h b/slang.h index 38acc3997..74de9d293 100644 --- a/slang.h +++ b/slang.h @@ -3931,6 +3931,13 @@ namespace slang const char* moduleName, IBlob** outDiagnostics = nullptr) = 0; + /** Load a module from Slang source code. + */ + virtual SLANG_NO_THROW IModule* SLANG_MCALL loadModuleFromSource( + const char* moduleName, + slang::IBlob* source, + slang::IBlob** outDiagnostics = nullptr) = 0; + /** Combine multiple component types to create a composite component type. The `componentTypes` array must contain `componentTypeCount` pointers 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; + 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, -- cgit v1.2.3