summaryrefslogtreecommitdiff
path: root/source/slang
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2023-04-19 17:06:56 -0400
committerGitHub <noreply@github.com>2023-04-19 17:06:56 -0400
commit588991f6df3d6813378721166a7260990835817e (patch)
treefca8c57fedb1967af20ca2da50bbd7dc8afc6a07 /source/slang
parent520a3c064c42e8cd50ef4fde21539870d5b19cb7 (diff)
Make SourceMap a value type (#2812)
* #include an absolute path didn't work - because paths were taken to always be relative. * Moved JSON source map writing logic to JSONSourceMapUtil. * Use ArtifactHandler to read/write SourceMaps. Use ObjectCastableAdapter to hold SourceMap Only serialize SourceMap <-> JSON on demand. * Make some types swappable. * BoxValue impl. * Added asBoxValue. * Remove const get funcs. * Fix typo in asBoxValue. * Fix another typo in asBoxValue. * Slightly simplify conversion to blob of SourceMap. * Small fix for asBoxValue
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-compiler.cpp5
-rw-r--r--source/slang/slang-emit-source-writer.cpp10
-rw-r--r--source/slang/slang-emit-source-writer.h8
-rw-r--r--source/slang/slang-emit.cpp7
-rw-r--r--source/slang/slang-ir-obfuscate-loc.cpp11
-rw-r--r--source/slang/slang-ir.h6
-rw-r--r--source/slang/slang.cpp8
7 files changed, 30 insertions, 25 deletions
diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp
index 907f39f48..b5fd27d55 100644
--- a/source/slang/slang-compiler.cpp
+++ b/source/slang/slang-compiler.cpp
@@ -1913,11 +1913,10 @@ namespace Slang
auto artifactDesc = ArtifactDesc::make(ArtifactKind::Json, ArtifactPayload::SourceMap, ArtifactStyle::Obfuscated);
// Create the source map artifact
- auto sourceMapArtifact = Artifact::create(artifactDesc, sourceMap->m_file.getUnownedSlice());
+ auto sourceMapArtifact = Artifact::create(artifactDesc, sourceMap->get().m_file.getUnownedSlice());
// Add the repesentation
- ComPtr<IObjectCastableAdapter> castableAdapter(new ObjectCastableAdapter(sourceMap));
- sourceMapArtifact->addRepresentation(castableAdapter);
+ sourceMapArtifact->addRepresentation(sourceMap);
// Associate with the container
m_containerArtifact->addAssociated(sourceMapArtifact);
diff --git a/source/slang/slang-emit-source-writer.cpp b/source/slang/slang-emit-source-writer.cpp
index f66f36758..985d0a0bf 100644
--- a/source/slang/slang-emit-source-writer.cpp
+++ b/source/slang/slang-emit-source-writer.cpp
@@ -18,7 +18,7 @@
namespace Slang {
-SourceWriter::SourceWriter(SourceManager* sourceManager, LineDirectiveMode lineDirectiveMode, SourceMap* sourceMap)
+SourceWriter::SourceWriter(SourceManager* sourceManager, LineDirectiveMode lineDirectiveMode, IBoxValue<SourceMap>* sourceMap)
{
m_sourceMap = sourceMap;
m_lineDirectiveMode = lineDirectiveMode;
@@ -360,23 +360,25 @@ void SourceWriter::_updateSourceMap(const HumaneSourceLoc& sourceLocation)
if (sourceLocation.line <= 0)
return;
+ auto sourceMap = m_sourceMap->getPtr();
+
// We need to work out the current column in the generated (ie being written) output
Index generatedLineIndex, generatedColumnIndex;
_calcLocation(generatedLineIndex, generatedColumnIndex);
// Advance to the current output line
- m_sourceMap->advanceToLine(generatedLineIndex);
+ sourceMap->advanceToLine(generatedLineIndex);
// Add the entry into the map, mapping back to the original source
SourceMap::Entry entry;
entry.init();
- entry.sourceFileIndex = m_sourceMap->getSourceFileIndex(sourceLocation.pathInfo.getName().getUnownedSlice());
+ entry.sourceFileIndex = sourceMap->getSourceFileIndex(sourceLocation.pathInfo.getName().getUnownedSlice());
entry.sourceLine = sourceLocation.line - 1;
entry.sourceColumn = sourceLocation.column - 1;
entry.generatedColumn = generatedColumnIndex;
- m_sourceMap->addEntry(entry);
+ sourceMap->addEntry(entry);
}
void SourceWriter::_emitLineDirectiveIfNeeded(const HumaneSourceLoc& sourceLocation)
diff --git a/source/slang/slang-emit-source-writer.h b/source/slang/slang-emit-source-writer.h
index c47b5f5fa..b64eb052a 100644
--- a/source/slang/slang-emit-source-writer.h
+++ b/source/slang/slang-emit-source-writer.h
@@ -6,7 +6,7 @@
#include "slang-compiler.h"
#include "../compiler-core/slang-source-map.h"
-
+#include "../core/slang-castable.h"
namespace Slang
{
@@ -75,10 +75,10 @@ public:
SourceManager* getSourceManager() const { return m_sourceManager; }
/// Get the associated source map. If source map tracking is not required, can return nullptr.
- SourceMap* getSourceMap() const { return m_sourceMap; }
+ IBoxValue<SourceMap>* getSourceMap() const { return m_sourceMap; }
/// Ctor
- SourceWriter(SourceManager* sourceManager, LineDirectiveMode lineDirectiveMode, SourceMap* sourceMap);
+ SourceWriter(SourceManager* sourceManager, LineDirectiveMode lineDirectiveMode, IBoxValue<SourceMap>* sourceMap);
protected:
void _emitTextSpan(char const* textBegin, char const* textEnd);
@@ -140,7 +140,7 @@ protected:
Dictionary<String, int> m_mapGLSLSourcePathToID;
int m_glslSourceIDCount = 0;
- RefPtr<SourceMap> m_sourceMap;
+ ComPtr<IBoxValue<SourceMap>> m_sourceMap;
LineDirectiveMode m_lineDirectiveMode;
};
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index 67a4c4610..f9284d001 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -969,12 +969,12 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR(ComPtr<IArtifact>& outAr
lineDirectiveMode = LineDirectiveMode::GLSL;
}
- RefPtr<SourceMap> sourceMap;
+ ComPtr<IBoxValue<SourceMap>> sourceMap;
// If SourceMap is enabled, we create one and associate it with the sourceWriter
if (targetRequest->getLinkage()->m_generateSourceMap)
{
- sourceMap = new SourceMap;
+ sourceMap = new BoxValue<SourceMap>;
}
SourceWriter sourceWriter(sourceManager, lineDirectiveMode, sourceMap );
@@ -1154,8 +1154,7 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR(ComPtr<IArtifact>& outAr
{
auto sourceMapArtifact = ArtifactUtil::createArtifact(ArtifactDesc::make(ArtifactKind::Json, ArtifactPayload::SourceMap, ArtifactStyle::None));
- ComPtr<IObjectCastableAdapter> castableAdapter(new ObjectCastableAdapter(sourceMap));
- sourceMapArtifact->addRepresentation(castableAdapter);
+ sourceMapArtifact->addRepresentation(sourceMap);
artifact->addAssociated(sourceMapArtifact);
}
diff --git a/source/slang/slang-ir-obfuscate-loc.cpp b/source/slang/slang-ir-obfuscate-loc.cpp
index 9a2f15fa4..7bb4bef7d 100644
--- a/source/slang/slang-ir-obfuscate-loc.cpp
+++ b/source/slang/slang-ir-obfuscate-loc.cpp
@@ -7,6 +7,8 @@
#include "../core/slang-hash.h"
#include "../core/slang-char-util.h"
+#include "../core/slang-castable.h"
+
namespace Slang
{
@@ -247,7 +249,10 @@ SlangResult obfuscateModuleLocs(IRModule* module, SourceManager* sourceManager)
// We can now create a map. The locs are in order in entries, so that should make lookup easier.
// This doesn't "leak" anything as the obfuscated loc map is not distributed.
- RefPtr<SourceMap> sourceMap = new SourceMap;
+ ComPtr<IBoxValue<SourceMap>> boxedSourceMap(new BoxValue<SourceMap>);
+
+ auto sourceMap = boxedSourceMap->getPtr();
+
sourceMap->m_file = obfusctatedPathInfo.getName();
// Set up entries one per line
@@ -349,10 +354,10 @@ SlangResult obfuscateModuleLocs(IRModule* module, SourceManager* sourceManager)
}
// Associate the sourceMap with the obfuscated file
- obfuscatedFile->setSourceMap(sourceMap);
+ obfuscatedFile->setSourceMap(boxedSourceMap);
// Set the obfuscated map onto the module
- module->setObfuscatedSourceMap(sourceMap);
+ module->setObfuscatedSourceMap(boxedSourceMap);
return SLANG_OK;
}
diff --git a/source/slang/slang-ir.h b/source/slang/slang-ir.h
index 78069a122..a53fe0092 100644
--- a/source/slang/slang-ir.h
+++ b/source/slang/slang-ir.h
@@ -2034,8 +2034,8 @@ public:
SLANG_FORCE_INLINE IRModuleInst* getModuleInst() const { return m_moduleInst; }
SLANG_FORCE_INLINE MemoryArena& getMemoryArena() { return m_memoryArena; }
- SLANG_FORCE_INLINE SourceMap* getObfuscatedSourceMap() const { return m_obfuscatedSourceMap; }
- SLANG_FORCE_INLINE void setObfuscatedSourceMap(SourceMap* sourceMap) { m_obfuscatedSourceMap = sourceMap; }
+ SLANG_FORCE_INLINE IBoxValue<SourceMap>* getObfuscatedSourceMap() const { return m_obfuscatedSourceMap; }
+ SLANG_FORCE_INLINE void setObfuscatedSourceMap(IBoxValue<SourceMap>* sourceMap) { m_obfuscatedSourceMap = sourceMap; }
IRDeduplicationContext* getDeduplicationContext() const { return &m_deduplicationContext; }
@@ -2105,7 +2105,7 @@ private:
mutable IRDeduplicationContext m_deduplicationContext;
/// Holds the obfuscated source map for this module if applicable
- RefPtr<SourceMap> m_obfuscatedSourceMap;
+ ComPtr<IBoxValue<SourceMap>> m_obfuscatedSourceMap;
};
struct IRSpecializationDictionaryItem : public IRInst
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index bedfb1161..6b2814ca7 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -2385,7 +2385,7 @@ void FrontEndCompileRequest::generateIR()
if (useSerialIRBottleneck)
{
// Keep the obfuscated source map (if there is one)
- RefPtr<SourceMap> obfuscatedSourceMap = irModule->getObfuscatedSourceMap();
+ ComPtr<IBoxValue<SourceMap>> obfuscatedSourceMap(irModule->getObfuscatedSourceMap());
IRSerialData serialData;
{
@@ -4884,9 +4884,9 @@ SlangResult _addLibraryReference(EndToEndCompileRequest* req, IArtifact* artifac
{
ComPtr<ICastable> castable;
SLANG_RETURN_ON_FAIL(associated->getOrCreateRepresentation(SourceMap::getTypeGuid(), ArtifactKeep::Yes, castable.writeRef()));
-
- auto sourceMap = as<SourceMap>(castable);
-
+ auto sourceMap = asBoxValue<SourceMap>(castable);
+ SLANG_ASSERT(sourceMap);
+
// I guess we add to all ir modules?
for (auto irModule : library->m_modules)