diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2023-04-19 17:06:56 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-19 17:06:56 -0400 |
| commit | 588991f6df3d6813378721166a7260990835817e (patch) | |
| tree | fca8c57fedb1967af20ca2da50bbd7dc8afc6a07 /source/slang | |
| parent | 520a3c064c42e8cd50ef4fde21539870d5b19cb7 (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.cpp | 5 | ||||
| -rw-r--r-- | source/slang/slang-emit-source-writer.cpp | 10 | ||||
| -rw-r--r-- | source/slang/slang-emit-source-writer.h | 8 | ||||
| -rw-r--r-- | source/slang/slang-emit.cpp | 7 | ||||
| -rw-r--r-- | source/slang/slang-ir-obfuscate-loc.cpp | 11 | ||||
| -rw-r--r-- | source/slang/slang-ir.h | 6 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 8 |
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) |
