summaryrefslogtreecommitdiffstats
path: root/source/slang/slang.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-03-07 17:28:19 -0800
committerGitHub <noreply@github.com>2024-03-07 17:28:19 -0800
commita810aa31f5f366d69e67be96c169fec7d6041df7 (patch)
tree3c8697241d8f3381720661b6f5d3cdaac7789f5d /source/slang/slang.cpp
parent6492906ebe59b573f6243e7c44476944b9dd5592 (diff)
Link-time constant and linkage API improvements. (#3708)
* Link-time constant and linkage API improvements. * Fix. * Allow module name to be empty. * Fix. * Fix. * Fix compile error.
Diffstat (limited to 'source/slang/slang.cpp')
-rw-r--r--source/slang/slang.cpp28
1 files changed, 27 insertions, 1 deletions
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index 1aa014a4b..dc9f86b48 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -1161,13 +1161,29 @@ slang::IModule* Linkage::loadModuleFromBlob(
try
{
- auto name = getNamePool()->getName(moduleName);
+ auto getDigestStr = [](auto x)
+ {
+ DigestBuilder<SHA1> digestBuilder;
+ digestBuilder.append(x);
+ return digestBuilder.finalize().toString();
+ };
+
+ String moduleNameStr = moduleName;
+ if (!moduleName)
+ moduleNameStr = getDigestStr(source);
+
+ auto name = getNamePool()->getName(moduleNameStr);
RefPtr<LoadedModule> loadedModule;
if (mapNameToLoadedModules.tryGetValue(name, loadedModule))
{
return loadedModule;
}
String pathStr = path;
+ if (pathStr.getLength() == 0)
+ {
+ // If path is empty, use a digest from source as path.
+ pathStr = getDigestStr(source);
+ }
auto pathInfo = PathInfo::makeFromString(pathStr);
if (File::exists(pathStr))
{
@@ -1205,6 +1221,16 @@ SLANG_NO_THROW slang::IModule* SLANG_MCALL Linkage::loadModuleFromSource(
return loadModuleFromBlob(moduleName, path, source, ModuleBlobType::Source, outDiagnostics);
}
+SLANG_NO_THROW slang::IModule* SLANG_MCALL Linkage::loadModuleFromSourceString(
+ const char* moduleName,
+ const char* path,
+ const char* source,
+ slang::IBlob** outDiagnostics)
+{
+ auto sourceBlob = StringBlob::create(UnownedStringSlice(source));
+ return loadModuleFromSource(moduleName, path, sourceBlob.get(), outDiagnostics);
+}
+
SLANG_NO_THROW slang::IModule* SLANG_MCALL Linkage::loadModuleFromIRBlob(
const char* moduleName,
const char* path,