summaryrefslogtreecommitdiff
path: root/source/compiler-core/slang-downstream-dep1.cpp
blob: e5eb4ac2405ff5cca243cb98fb67c8dcaf3fc343 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// slang-downstream-dep1.cpp
#include "slang-downstream-dep1.h"


namespace Slang
{

// A temporary class that adapts `ISlangSharedLibrary_Dep1` to ISlangSharedLibrary
class SharedLibraryDep1Adapter : public ComBaseObject, public ISlangSharedLibrary
{
public:
    SLANG_COM_BASE_IUNKNOWN_ALL

    // ICastable
    virtual SLANG_NO_THROW void* SLANG_MCALL castAs(const SlangUUID& guid) SLANG_OVERRIDE;

    // ISlangSharedLibrary
    virtual SLANG_NO_THROW void* SLANG_MCALL findSymbolAddressByName(char const* name) SLANG_OVERRIDE { return m_contained->findSymbolAddressByName(name); }

    SharedLibraryDep1Adapter(ISlangSharedLibrary_Dep1* dep1) :
        m_contained(dep1)
    {
    }

protected:
    void* getInterface(const Guid& guid)
    {
        if (guid == ISlangUnknown::getTypeGuid() ||
            guid == ICastable::getTypeGuid() ||
            guid == ISlangSharedLibrary::getTypeGuid())
        {
            return static_cast<ISlangSharedLibrary*>(this);
        }
        return nullptr;
    }
    void* getObject(const Guid& guid)
    {
        SLANG_UNUSED(guid);
        return nullptr;
    }

    ComPtr<ISlangSharedLibrary_Dep1> m_contained;
};

void* SharedLibraryDep1Adapter::castAs(const SlangUUID& guid)
{
	if (auto intf = getInterface(guid))
	{
		return intf;
	}
	return getObject(guid);
}

/* Hack to take into account downstream compilers shared library interface might need an adapter */
/* static */SlangResult DownstreamUtil_Dep1::getDownstreamSharedLibrary(DownstreamCompileResult* downstreamResult, ComPtr<ISlangSharedLibrary>& outSharedLibrary)
{
	ComPtr<ISlangSharedLibrary> lib;
	SLANG_RETURN_ON_FAIL(downstreamResult->getHostCallableSharedLibrary(lib));

	if (SLANG_SUCCEEDED(lib->queryInterface(ISlangSharedLibrary::getTypeGuid(), (void**)outSharedLibrary.writeRef())))
	{
		return SLANG_OK;
	}

	ComPtr<ISlangSharedLibrary_Dep1> libDep1;
	if (SLANG_SUCCEEDED(lib->queryInterface(ISlangSharedLibrary_Dep1::getTypeGuid(), (void**)libDep1.writeRef())))
	{
		// Okay, we need to adapt for now
		outSharedLibrary = new SharedLibraryDep1Adapter(libDep1);
		return SLANG_OK;
	}
	return SLANG_E_NOT_FOUND;
}

}