From 9df7fcb023bd5a22f35ecd609b7a50cc6634976c Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Tue, 9 Aug 2022 11:23:40 -0400 Subject: Artifact split interface and implementation (#2349) * #include an absolute path didn't work - because paths were taken to always be relative. * WIP with hierarchical enums. * Some small fixes and improvements around artifact desc related types. * Improvements around hierarchical enum. * Fixes to get Artifact types refactor to be able to execute tests. * Attempt to better categorize PTX. * Work around for potentially unused function warning. * Typo fix. * Simplify Artifact header. * Small improvements around Artifact kind/payload/style. * Added IDestroyable/ICastable * Add IArtifactList. * First impl of IArtifactUtil. * Use the ICastable interface for IArtifactRepresentation. * Added IArtifactRepresentation & IArtifactAssociated. * Add SLANG_OVERRIDE to avoid gcc/clang warning. * Fix calling convention issue on win32. * Fix missing SLANG_OVERRIDE. * First attempt at file abstraction around Artifact. * Added creation of lock file. * Move functionality for determining file paths to the IArtifactUtil. Add casting to ICastable. * Added some casting/finding mechanisms. * Simplify IArtifact interface, and use Items for file reps. * Fix problem with libraries on DXIL. * Split out ArtifactRepresentation. * Move ArtifactDesc functionality to ArtifactDescUtil. ArtifactInfoUtil becomes ArtifactDescUtil. * Split implementations from the interfaces for Artifact. * Use TypeTextUtil for target name outputting. * Add artifact impls. --- .../slang-artifact-representation-impl.cpp | 147 +++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 source/compiler-core/slang-artifact-representation-impl.cpp (limited to 'source/compiler-core/slang-artifact-representation-impl.cpp') diff --git a/source/compiler-core/slang-artifact-representation-impl.cpp b/source/compiler-core/slang-artifact-representation-impl.cpp new file mode 100644 index 000000000..20480ae07 --- /dev/null +++ b/source/compiler-core/slang-artifact-representation-impl.cpp @@ -0,0 +1,147 @@ +// slang-artifact-representation-impl.cpp +#include "slang-artifact-representation-impl.h" + +#include "../core/slang-file-system.h" + +#include "../core/slang-type-text-util.h" +#include "../core/slang-io.h" +#include "../core/slang-array-view.h" + +#include "slang-artifact-util.h" + +namespace Slang { + +/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FileArtifactRepresentation !!!!!!!!!!!!!!!!!!!!!!!!!!! */ + +void* FileArtifactRepresentation::getInterface(const Guid& guid) +{ + if (guid == ISlangUnknown::getTypeGuid() || + guid == ICastable::getTypeGuid() || + guid == IArtifactRepresentation::getTypeGuid() || + guid == IFileArtifactRepresentation::getTypeGuid()) + { + return static_cast(this); + } + return nullptr; +} + +void* FileArtifactRepresentation::getObject(const Guid& guid) +{ + SLANG_UNUSED(guid); + return nullptr; +} + +ISlangMutableFileSystem* FileArtifactRepresentation::_getFileSystem() +{ + return m_fileSystem ? m_fileSystem : OSFileSystem::getMutableSingleton(); +} + +void* FileArtifactRepresentation::castAs(const Guid& guid) +{ + if (auto intf = getInterface(guid)) + { + return intf; + } + return getObject(guid); +} + +SlangResult FileArtifactRepresentation::writeToBlob(ISlangBlob** blob) +{ + if (m_kind == Kind::NameOnly) + { + // If it's referenced by a name only, it's a file that *can't* be loaded as a blob in general. + return SLANG_E_NOT_AVAILABLE; + } + + auto fileSystem = _getFileSystem(); + return fileSystem->loadFile(m_path.getBuffer(), blob); +} + +bool FileArtifactRepresentation::exists() +{ + // TODO(JS): + // If it's a name only it's hard to know what exists should do. It can't *check* because it relies on the 'system' doing + // the actual location. We could ask the IArtifactUtil, and that could change the behavior. + // For now we just assume it does. + if (m_kind == Kind::NameOnly) + { + return true; + } + + auto fileSystem = _getFileSystem(); + + SlangPathType pathType; + const auto res = fileSystem->getPathType(m_path.getBuffer(), &pathType); + + // It exists if it is a file + return SLANG_SUCCEEDED(res) && pathType == SLANG_PATH_TYPE_FILE; +} + +FileArtifactRepresentation::~FileArtifactRepresentation() +{ + if (m_kind == Kind::Owned) + { + auto fileSystem = _getFileSystem(); + fileSystem->remove(m_path.getBuffer()); + } +} + +/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! LockFile !!!!!!!!!!!!!!!!!!!!!!!!!!! */ + +void* LockFile::getInterface(const Guid& guid) +{ + if (guid == ISlangUnknown::getTypeGuid() || + guid == ICastable::getTypeGuid() || + guid == ILockFile::getTypeGuid()) + { + return static_cast(this); + } + return nullptr; +} + +void* LockFile::getObject(const Guid& guid) +{ + SLANG_UNUSED(guid); + return nullptr; +} + +ISlangMutableFileSystem* LockFile::_getFileSystem() +{ + return m_fileSystem ? m_fileSystem : OSFileSystem::getMutableSingleton(); +} + +void* LockFile::castAs(const Guid& guid) +{ + if (auto intf = getInterface(guid)) + { + return intf; + } + return getObject(guid); +} + +const char* LockFile::getPath() +{ + return (m_path.getLength() > 0) ? m_path.getBuffer() : nullptr; +} + +ISlangMutableFileSystem* LockFile::getFileSystem() +{ + return m_fileSystem; +} + +LockFile::~LockFile() +{ + if (m_path.getLength() > 0) + { + auto fileSystem = _getFileSystem(); + fileSystem->remove(m_path.getBuffer()); + } +} + +void LockFile::disown() +{ + m_path = String(); + m_fileSystem.setNull(); +} + +} // namespace Slang -- cgit v1.2.3