From be8497804f803c02cfab1aa2c54d921042e90ec9 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Thu, 1 Sep 2022 15:38:17 -0400 Subject: Remove artifact from SourceFile (#2384) * #include an absolute path didn't work - because paths were taken to always be relative. * Make DownstreamCompileOptions use POD types. * CharSliceAllocator -> SliceAllocator Added SliceConverter CharSliceCaster -> SliceCaster * First attempt at zero terminating around blobs. * Fix clang warning. * Add SlangTerminatedChars Make Blob implementations support it. Make most blobs 'terminated'. * Fix bug setting up sourceFiles for CommandLineDownstreamCompiler. * Traffic in TerminatedCharSlice for sourceFiles. Use ArtifactDesc to generate temporary file names for source. * Fix typo in testing for shared library/C++. * Working with source being passed as artifacts to DownstreamCompiler. * Use artifacts in SourceManager/SourceFile. * Support infering extension from the original file extension. * * Infer extension if can't determine from the artifact type * Split IOSFile/IExtFile representations * Move responsibility for creating OS file to the handler. * Disable the check memory path. * Remove artifact from SourceFile. Lazily generate SourceFile from artifacts as needed. * Fix some small bugs. * Remove maybeAddArtifact. * Load artifacts if repro capture is enabled. * Remove adding by string, because doing so means source will be allocated twice or there is a potential race around ref counting to the contained String. * Add built in source as a blob. * Fix warning. * Make StringBlob own the contents if moved. Fix some compilation issues. * Share StringBlob uniqueness code. * Do move unique on Ctor. * Change MoveUnique to not have any values. * MoveUnique can more sensibly be a struct. Co-authored-by: Yong He --- source/core/slang-blob.h | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'source/core/slang-blob.h') diff --git a/source/core/slang-blob.h b/source/core/slang-blob.h index 1acf279ef..e528f55a8 100644 --- a/source/core/slang-blob.h +++ b/source/core/slang-blob.h @@ -50,17 +50,25 @@ public: SLANG_NO_THROW size_t SLANG_MCALL getBufferSize() SLANG_OVERRIDE { return m_string.getLength(); } static ComPtr create(const String& in) { return ComPtr(new StringBlob(in)); } - static ComPtr moveCreate(String& in) - { - auto blob = new StringBlob; - blob->m_string.swapWith(in); - return ComPtr(blob); - } + + /// Moves from in into the created blob. + /// NOTE! That will only use the representation from in, if it is *unique* + /// otherwise it will make a new copy. + /// This is so that StringBlob won't hold a reference count via a string held externally. + /// In contrast StringBlob::create *may* share the representation. + static ComPtr moveCreate(String& in); + static ComPtr moveCreate(String&& in); protected: + /// A type that is only used to differentiate a constructor. Can construct with + /// MoveUnique{} + struct MoveUnique {}; + explicit StringBlob(String const& string) : m_string(string) {} + + StringBlob(MoveUnique, String& string); StringBlob() {} /// Get the contained string -- cgit v1.2.3