xref: /src/contrib/llvm-project/lldb/source/API/SBLaunchInfo.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1cfca06d7SDimitry Andric //===-- SBLaunchInfo.cpp --------------------------------------------------===//
212bd4897SEd Maste //
35f29bb8aSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f29bb8aSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55f29bb8aSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
612bd4897SEd Maste //
712bd4897SEd Maste //===----------------------------------------------------------------------===//
812bd4897SEd Maste 
912bd4897SEd Maste #include "lldb/API/SBLaunchInfo.h"
106f8fc217SDimitry Andric #include "lldb/Utility/Instrumentation.h"
1112bd4897SEd Maste 
12cfca06d7SDimitry Andric #include "lldb/API/SBEnvironment.h"
13344a3780SDimitry Andric #include "lldb/API/SBError.h"
1412bd4897SEd Maste #include "lldb/API/SBFileSpec.h"
1512bd4897SEd Maste #include "lldb/API/SBListener.h"
16344a3780SDimitry Andric #include "lldb/API/SBStream.h"
17344a3780SDimitry Andric #include "lldb/API/SBStructuredData.h"
18344a3780SDimitry Andric #include "lldb/Core/StructuredDataImpl.h"
195f29bb8aSDimitry Andric #include "lldb/Host/ProcessLaunchInfo.h"
207fa27ce4SDimitry Andric #include "lldb/Utility/Listener.h"
217fa27ce4SDimitry Andric #include "lldb/Utility/ScriptedMetadata.h"
2212bd4897SEd Maste 
2312bd4897SEd Maste using namespace lldb;
2412bd4897SEd Maste using namespace lldb_private;
2512bd4897SEd Maste 
26f73363f1SDimitry Andric class lldb_private::SBLaunchInfoImpl : public ProcessLaunchInfo {
27f73363f1SDimitry Andric public:
SBLaunchInfoImpl()286f8fc217SDimitry Andric   SBLaunchInfoImpl() : m_envp(GetEnvironment().getEnvp()) {}
29f73363f1SDimitry Andric 
GetEnvp() const30f73363f1SDimitry Andric   const char *const *GetEnvp() const { return m_envp; }
RegenerateEnvp()31f73363f1SDimitry Andric   void RegenerateEnvp() { m_envp = GetEnvironment().getEnvp(); }
32f73363f1SDimitry Andric 
operator =(const ProcessLaunchInfo & rhs)33f73363f1SDimitry Andric   SBLaunchInfoImpl &operator=(const ProcessLaunchInfo &rhs) {
34f73363f1SDimitry Andric     ProcessLaunchInfo::operator=(rhs);
35f73363f1SDimitry Andric     RegenerateEnvp();
36f73363f1SDimitry Andric     return *this;
37f73363f1SDimitry Andric   }
38f73363f1SDimitry Andric 
39f73363f1SDimitry Andric private:
40f73363f1SDimitry Andric   Environment::Envp m_envp;
41f73363f1SDimitry Andric };
42f73363f1SDimitry Andric 
SBLaunchInfo(const char ** argv)4314f1b3e8SDimitry Andric SBLaunchInfo::SBLaunchInfo(const char **argv)
44f73363f1SDimitry Andric     : m_opaque_sp(new SBLaunchInfoImpl()) {
456f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, argv);
465f29bb8aSDimitry Andric 
4712bd4897SEd Maste   m_opaque_sp->GetFlags().Reset(eLaunchFlagDebug | eLaunchFlagDisableASLR);
4812bd4897SEd Maste   if (argv && argv[0])
4912bd4897SEd Maste     m_opaque_sp->GetArguments().SetArguments(argv);
5012bd4897SEd Maste }
5112bd4897SEd Maste 
SBLaunchInfo(const SBLaunchInfo & rhs)52cfca06d7SDimitry Andric SBLaunchInfo::SBLaunchInfo(const SBLaunchInfo &rhs) {
536f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
54cfca06d7SDimitry Andric 
55cfca06d7SDimitry Andric   m_opaque_sp = rhs.m_opaque_sp;
56cfca06d7SDimitry Andric }
57cfca06d7SDimitry Andric 
operator =(const SBLaunchInfo & rhs)58cfca06d7SDimitry Andric SBLaunchInfo &SBLaunchInfo::operator=(const SBLaunchInfo &rhs) {
596f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
60cfca06d7SDimitry Andric 
61cfca06d7SDimitry Andric   m_opaque_sp = rhs.m_opaque_sp;
626f8fc217SDimitry Andric   return *this;
63cfca06d7SDimitry Andric }
64cfca06d7SDimitry Andric 
65cfca06d7SDimitry Andric SBLaunchInfo::~SBLaunchInfo() = default;
6612bd4897SEd Maste 
ref() const6714f1b3e8SDimitry Andric const lldb_private::ProcessLaunchInfo &SBLaunchInfo::ref() const {
6812bd4897SEd Maste   return *m_opaque_sp;
6912bd4897SEd Maste }
7012bd4897SEd Maste 
set_ref(const ProcessLaunchInfo & info)71f73363f1SDimitry Andric void SBLaunchInfo::set_ref(const ProcessLaunchInfo &info) {
72f73363f1SDimitry Andric   *m_opaque_sp = info;
73f73363f1SDimitry Andric }
74f73363f1SDimitry Andric 
GetProcessID()755f29bb8aSDimitry Andric lldb::pid_t SBLaunchInfo::GetProcessID() {
766f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
775e95aa85SEd Maste 
785f29bb8aSDimitry Andric   return m_opaque_sp->GetProcessID();
795f29bb8aSDimitry Andric }
8012bd4897SEd Maste 
GetUserID()815f29bb8aSDimitry Andric uint32_t SBLaunchInfo::GetUserID() {
826f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
8312bd4897SEd Maste 
845f29bb8aSDimitry Andric   return m_opaque_sp->GetUserID();
855f29bb8aSDimitry Andric }
8612bd4897SEd Maste 
GetGroupID()875f29bb8aSDimitry Andric uint32_t SBLaunchInfo::GetGroupID() {
886f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
8912bd4897SEd Maste 
905f29bb8aSDimitry Andric   return m_opaque_sp->GetGroupID();
915f29bb8aSDimitry Andric }
9212bd4897SEd Maste 
UserIDIsValid()935f29bb8aSDimitry Andric bool SBLaunchInfo::UserIDIsValid() {
946f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
955f29bb8aSDimitry Andric 
965f29bb8aSDimitry Andric   return m_opaque_sp->UserIDIsValid();
975f29bb8aSDimitry Andric }
985f29bb8aSDimitry Andric 
GroupIDIsValid()995f29bb8aSDimitry Andric bool SBLaunchInfo::GroupIDIsValid() {
1006f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1015f29bb8aSDimitry Andric 
1025f29bb8aSDimitry Andric   return m_opaque_sp->GroupIDIsValid();
1035f29bb8aSDimitry Andric }
1045f29bb8aSDimitry Andric 
SetUserID(uint32_t uid)1055f29bb8aSDimitry Andric void SBLaunchInfo::SetUserID(uint32_t uid) {
1066f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, uid);
1075f29bb8aSDimitry Andric 
1085f29bb8aSDimitry Andric   m_opaque_sp->SetUserID(uid);
1095f29bb8aSDimitry Andric }
1105f29bb8aSDimitry Andric 
SetGroupID(uint32_t gid)1115f29bb8aSDimitry Andric void SBLaunchInfo::SetGroupID(uint32_t gid) {
1126f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, gid);
1135f29bb8aSDimitry Andric 
1145f29bb8aSDimitry Andric   m_opaque_sp->SetGroupID(gid);
1155f29bb8aSDimitry Andric }
11612bd4897SEd Maste 
GetExecutableFile()11714f1b3e8SDimitry Andric SBFileSpec SBLaunchInfo::GetExecutableFile() {
1186f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1195f29bb8aSDimitry Andric 
1206f8fc217SDimitry Andric   return SBFileSpec(m_opaque_sp->GetExecutableFile());
12112bd4897SEd Maste }
12212bd4897SEd Maste 
SetExecutableFile(SBFileSpec exe_file,bool add_as_first_arg)12314f1b3e8SDimitry Andric void SBLaunchInfo::SetExecutableFile(SBFileSpec exe_file,
12414f1b3e8SDimitry Andric                                      bool add_as_first_arg) {
1256f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, exe_file, add_as_first_arg);
1265f29bb8aSDimitry Andric 
12712bd4897SEd Maste   m_opaque_sp->SetExecutableFile(exe_file.ref(), add_as_first_arg);
12812bd4897SEd Maste }
12912bd4897SEd Maste 
GetListener()13014f1b3e8SDimitry Andric SBListener SBLaunchInfo::GetListener() {
1316f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1325f29bb8aSDimitry Andric 
1336f8fc217SDimitry Andric   return SBListener(m_opaque_sp->GetListener());
13412bd4897SEd Maste }
13512bd4897SEd Maste 
SetListener(SBListener & listener)13614f1b3e8SDimitry Andric void SBLaunchInfo::SetListener(SBListener &listener) {
1376f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, listener);
1385f29bb8aSDimitry Andric 
13912bd4897SEd Maste   m_opaque_sp->SetListener(listener.GetSP());
14012bd4897SEd Maste }
14112bd4897SEd Maste 
GetNumArguments()14214f1b3e8SDimitry Andric uint32_t SBLaunchInfo::GetNumArguments() {
1436f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1445f29bb8aSDimitry Andric 
14512bd4897SEd Maste   return m_opaque_sp->GetArguments().GetArgumentCount();
14612bd4897SEd Maste }
14712bd4897SEd Maste 
GetArgumentAtIndex(uint32_t idx)14814f1b3e8SDimitry Andric const char *SBLaunchInfo::GetArgumentAtIndex(uint32_t idx) {
1496f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, idx);
1505f29bb8aSDimitry Andric 
1517fa27ce4SDimitry Andric   return ConstString(m_opaque_sp->GetArguments().GetArgumentAtIndex(idx))
1527fa27ce4SDimitry Andric       .GetCString();
15312bd4897SEd Maste }
15412bd4897SEd Maste 
SetArguments(const char ** argv,bool append)15514f1b3e8SDimitry Andric void SBLaunchInfo::SetArguments(const char **argv, bool append) {
1566f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, argv, append);
1575f29bb8aSDimitry Andric 
15814f1b3e8SDimitry Andric   if (append) {
15912bd4897SEd Maste     if (argv)
16012bd4897SEd Maste       m_opaque_sp->GetArguments().AppendArguments(argv);
16114f1b3e8SDimitry Andric   } else {
16212bd4897SEd Maste     if (argv)
16312bd4897SEd Maste       m_opaque_sp->GetArguments().SetArguments(argv);
16412bd4897SEd Maste     else
16512bd4897SEd Maste       m_opaque_sp->GetArguments().Clear();
16612bd4897SEd Maste   }
16712bd4897SEd Maste }
16812bd4897SEd Maste 
GetNumEnvironmentEntries()16914f1b3e8SDimitry Andric uint32_t SBLaunchInfo::GetNumEnvironmentEntries() {
1706f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1715f29bb8aSDimitry Andric 
172f73363f1SDimitry Andric   return m_opaque_sp->GetEnvironment().size();
17312bd4897SEd Maste }
17412bd4897SEd Maste 
GetEnvironmentEntryAtIndex(uint32_t idx)17514f1b3e8SDimitry Andric const char *SBLaunchInfo::GetEnvironmentEntryAtIndex(uint32_t idx) {
1766f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, idx);
1775f29bb8aSDimitry Andric 
178f73363f1SDimitry Andric   if (idx > GetNumEnvironmentEntries())
179f73363f1SDimitry Andric     return nullptr;
1807fa27ce4SDimitry Andric   return ConstString(m_opaque_sp->GetEnvp()[idx]).GetCString();
18112bd4897SEd Maste }
18212bd4897SEd Maste 
SetEnvironmentEntries(const char ** envp,bool append)18314f1b3e8SDimitry Andric void SBLaunchInfo::SetEnvironmentEntries(const char **envp, bool append) {
1846f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, envp, append);
185cfca06d7SDimitry Andric   SetEnvironment(SBEnvironment(Environment(envp)), append);
186cfca06d7SDimitry Andric }
1875f29bb8aSDimitry Andric 
SetEnvironment(const SBEnvironment & env,bool append)188cfca06d7SDimitry Andric void SBLaunchInfo::SetEnvironment(const SBEnvironment &env, bool append) {
1896f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, env, append);
190cfca06d7SDimitry Andric   Environment &refEnv = env.ref();
191b60736ecSDimitry Andric   if (append) {
192b60736ecSDimitry Andric     for (auto &KV : refEnv)
193b60736ecSDimitry Andric       m_opaque_sp->GetEnvironment().insert_or_assign(KV.first(), KV.second);
194b60736ecSDimitry Andric   } else
195cfca06d7SDimitry Andric     m_opaque_sp->GetEnvironment() = refEnv;
196f73363f1SDimitry Andric   m_opaque_sp->RegenerateEnvp();
19712bd4897SEd Maste }
19812bd4897SEd Maste 
GetEnvironment()199cfca06d7SDimitry Andric SBEnvironment SBLaunchInfo::GetEnvironment() {
2006f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2016f8fc217SDimitry Andric   return SBEnvironment(Environment(m_opaque_sp->GetEnvironment()));
202cfca06d7SDimitry Andric }
203cfca06d7SDimitry Andric 
Clear()2045f29bb8aSDimitry Andric void SBLaunchInfo::Clear() {
2056f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2065f29bb8aSDimitry Andric 
2075f29bb8aSDimitry Andric   m_opaque_sp->Clear();
2085f29bb8aSDimitry Andric }
20912bd4897SEd Maste 
GetWorkingDirectory() const21014f1b3e8SDimitry Andric const char *SBLaunchInfo::GetWorkingDirectory() const {
2116f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2125f29bb8aSDimitry Andric 
213e3b55780SDimitry Andric   return m_opaque_sp->GetWorkingDirectory().GetPathAsConstString().AsCString();
21412bd4897SEd Maste }
21512bd4897SEd Maste 
SetWorkingDirectory(const char * working_dir)21614f1b3e8SDimitry Andric void SBLaunchInfo::SetWorkingDirectory(const char *working_dir) {
2176f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, working_dir);
2185f29bb8aSDimitry Andric 
21994994d37SDimitry Andric   m_opaque_sp->SetWorkingDirectory(FileSpec(working_dir));
22012bd4897SEd Maste }
22112bd4897SEd Maste 
GetLaunchFlags()22214f1b3e8SDimitry Andric uint32_t SBLaunchInfo::GetLaunchFlags() {
2236f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2245f29bb8aSDimitry Andric 
22512bd4897SEd Maste   return m_opaque_sp->GetFlags().Get();
22612bd4897SEd Maste }
22712bd4897SEd Maste 
SetLaunchFlags(uint32_t flags)22814f1b3e8SDimitry Andric void SBLaunchInfo::SetLaunchFlags(uint32_t flags) {
2296f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, flags);
2305f29bb8aSDimitry Andric 
23112bd4897SEd Maste   m_opaque_sp->GetFlags().Reset(flags);
23212bd4897SEd Maste }
23312bd4897SEd Maste 
GetProcessPluginName()23414f1b3e8SDimitry Andric const char *SBLaunchInfo::GetProcessPluginName() {
2356f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2365f29bb8aSDimitry Andric 
2377fa27ce4SDimitry Andric   return ConstString(m_opaque_sp->GetProcessPluginName()).GetCString();
23812bd4897SEd Maste }
23912bd4897SEd Maste 
SetProcessPluginName(const char * plugin_name)24014f1b3e8SDimitry Andric void SBLaunchInfo::SetProcessPluginName(const char *plugin_name) {
2416f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, plugin_name);
2425f29bb8aSDimitry Andric 
24312bd4897SEd Maste   return m_opaque_sp->SetProcessPluginName(plugin_name);
24412bd4897SEd Maste }
24512bd4897SEd Maste 
GetShell()24614f1b3e8SDimitry Andric const char *SBLaunchInfo::GetShell() {
2476f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2485f29bb8aSDimitry Andric 
249f73363f1SDimitry Andric   // Constify this string so that it is saved in the string pool.  Otherwise it
250f73363f1SDimitry Andric   // would be freed when this function goes out of scope.
25112bd4897SEd Maste   ConstString shell(m_opaque_sp->GetShell().GetPath().c_str());
25212bd4897SEd Maste   return shell.AsCString();
25312bd4897SEd Maste }
25412bd4897SEd Maste 
SetShell(const char * path)25514f1b3e8SDimitry Andric void SBLaunchInfo::SetShell(const char *path) {
2566f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, path);
2575f29bb8aSDimitry Andric 
25894994d37SDimitry Andric   m_opaque_sp->SetShell(FileSpec(path));
25912bd4897SEd Maste }
26012bd4897SEd Maste 
GetShellExpandArguments()26114f1b3e8SDimitry Andric bool SBLaunchInfo::GetShellExpandArguments() {
2626f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2635f29bb8aSDimitry Andric 
2645e95aa85SEd Maste   return m_opaque_sp->GetShellExpandArguments();
2655e95aa85SEd Maste }
2665e95aa85SEd Maste 
SetShellExpandArguments(bool expand)26714f1b3e8SDimitry Andric void SBLaunchInfo::SetShellExpandArguments(bool expand) {
2686f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, expand);
2695f29bb8aSDimitry Andric 
2705e95aa85SEd Maste   m_opaque_sp->SetShellExpandArguments(expand);
2715e95aa85SEd Maste }
2725e95aa85SEd Maste 
GetResumeCount()27314f1b3e8SDimitry Andric uint32_t SBLaunchInfo::GetResumeCount() {
2746f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2755f29bb8aSDimitry Andric 
27612bd4897SEd Maste   return m_opaque_sp->GetResumeCount();
27712bd4897SEd Maste }
27812bd4897SEd Maste 
SetResumeCount(uint32_t c)27914f1b3e8SDimitry Andric void SBLaunchInfo::SetResumeCount(uint32_t c) {
2806f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, c);
2815f29bb8aSDimitry Andric 
28212bd4897SEd Maste   m_opaque_sp->SetResumeCount(c);
28312bd4897SEd Maste }
28412bd4897SEd Maste 
AddCloseFileAction(int fd)28514f1b3e8SDimitry Andric bool SBLaunchInfo::AddCloseFileAction(int fd) {
2866f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, fd);
2875f29bb8aSDimitry Andric 
28812bd4897SEd Maste   return m_opaque_sp->AppendCloseFileAction(fd);
28912bd4897SEd Maste }
29012bd4897SEd Maste 
AddDuplicateFileAction(int fd,int dup_fd)29114f1b3e8SDimitry Andric bool SBLaunchInfo::AddDuplicateFileAction(int fd, int dup_fd) {
2926f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, fd, dup_fd);
2935f29bb8aSDimitry Andric 
29412bd4897SEd Maste   return m_opaque_sp->AppendDuplicateFileAction(fd, dup_fd);
29512bd4897SEd Maste }
29612bd4897SEd Maste 
AddOpenFileAction(int fd,const char * path,bool read,bool write)29714f1b3e8SDimitry Andric bool SBLaunchInfo::AddOpenFileAction(int fd, const char *path, bool read,
29814f1b3e8SDimitry Andric                                      bool write) {
2996f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, fd, path, read, write);
3005f29bb8aSDimitry Andric 
30194994d37SDimitry Andric   return m_opaque_sp->AppendOpenFileAction(fd, FileSpec(path), read, write);
30212bd4897SEd Maste }
30312bd4897SEd Maste 
AddSuppressFileAction(int fd,bool read,bool write)30414f1b3e8SDimitry Andric bool SBLaunchInfo::AddSuppressFileAction(int fd, bool read, bool write) {
3056f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, fd, read, write);
3065f29bb8aSDimitry Andric 
30712bd4897SEd Maste   return m_opaque_sp->AppendSuppressFileAction(fd, read, write);
30812bd4897SEd Maste }
30912bd4897SEd Maste 
SetLaunchEventData(const char * data)31014f1b3e8SDimitry Andric void SBLaunchInfo::SetLaunchEventData(const char *data) {
3116f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, data);
3125f29bb8aSDimitry Andric 
31312bd4897SEd Maste   m_opaque_sp->SetLaunchEventData(data);
31412bd4897SEd Maste }
31512bd4897SEd Maste 
GetLaunchEventData() const31614f1b3e8SDimitry Andric const char *SBLaunchInfo::GetLaunchEventData() const {
3176f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
3185f29bb8aSDimitry Andric 
3197fa27ce4SDimitry Andric   return ConstString(m_opaque_sp->GetLaunchEventData()).GetCString();
32012bd4897SEd Maste }
32112bd4897SEd Maste 
SetDetachOnError(bool enable)32214f1b3e8SDimitry Andric void SBLaunchInfo::SetDetachOnError(bool enable) {
3236f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, enable);
3245f29bb8aSDimitry Andric 
32512bd4897SEd Maste   m_opaque_sp->SetDetachOnError(enable);
32612bd4897SEd Maste }
32712bd4897SEd Maste 
GetDetachOnError() const32814f1b3e8SDimitry Andric bool SBLaunchInfo::GetDetachOnError() const {
3296f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
3305f29bb8aSDimitry Andric 
33112bd4897SEd Maste   return m_opaque_sp->GetDetachOnError();
33212bd4897SEd Maste }
3335f29bb8aSDimitry Andric 
GetScriptedProcessClassName() const334344a3780SDimitry Andric const char *SBLaunchInfo::GetScriptedProcessClassName() const {
3356f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
336344a3780SDimitry Andric 
3377fa27ce4SDimitry Andric   ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();
3387fa27ce4SDimitry Andric 
3397fa27ce4SDimitry Andric   if (!metadata_sp || !*metadata_sp)
3407fa27ce4SDimitry Andric     return nullptr;
3417fa27ce4SDimitry Andric 
342344a3780SDimitry Andric   // Constify this string so that it is saved in the string pool.  Otherwise it
343344a3780SDimitry Andric   // would be freed when this function goes out of scope.
3447fa27ce4SDimitry Andric   ConstString class_name(metadata_sp->GetClassName().data());
345344a3780SDimitry Andric   return class_name.AsCString();
346344a3780SDimitry Andric }
347344a3780SDimitry Andric 
SetScriptedProcessClassName(const char * class_name)348344a3780SDimitry Andric void SBLaunchInfo::SetScriptedProcessClassName(const char *class_name) {
3496f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, class_name);
3507fa27ce4SDimitry Andric   ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();
3517fa27ce4SDimitry Andric   StructuredData::DictionarySP dict_sp =
3527fa27ce4SDimitry Andric       metadata_sp ? metadata_sp->GetArgsSP() : nullptr;
3537fa27ce4SDimitry Andric   metadata_sp = std::make_shared<ScriptedMetadata>(class_name, dict_sp);
3547fa27ce4SDimitry Andric   m_opaque_sp->SetScriptedMetadata(metadata_sp);
355344a3780SDimitry Andric }
356344a3780SDimitry Andric 
GetScriptedProcessDictionary() const357344a3780SDimitry Andric lldb::SBStructuredData SBLaunchInfo::GetScriptedProcessDictionary() const {
3586f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this);
359344a3780SDimitry Andric 
3607fa27ce4SDimitry Andric   ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();
361344a3780SDimitry Andric 
362344a3780SDimitry Andric   SBStructuredData data;
3637fa27ce4SDimitry Andric   if (!metadata_sp)
3647fa27ce4SDimitry Andric     return data;
3657fa27ce4SDimitry Andric 
3667fa27ce4SDimitry Andric   lldb_private::StructuredData::DictionarySP dict_sp = metadata_sp->GetArgsSP();
367344a3780SDimitry Andric   data.m_impl_up->SetObjectSP(dict_sp);
368344a3780SDimitry Andric 
3696f8fc217SDimitry Andric   return data;
370344a3780SDimitry Andric }
371344a3780SDimitry Andric 
SetScriptedProcessDictionary(lldb::SBStructuredData dict)372344a3780SDimitry Andric void SBLaunchInfo::SetScriptedProcessDictionary(lldb::SBStructuredData dict) {
3736f8fc217SDimitry Andric   LLDB_INSTRUMENT_VA(this, dict);
374c0981da4SDimitry Andric   if (!dict.IsValid() || !dict.m_impl_up)
375344a3780SDimitry Andric     return;
376344a3780SDimitry Andric 
377c0981da4SDimitry Andric   StructuredData::ObjectSP obj_sp = dict.m_impl_up->GetObjectSP();
378c0981da4SDimitry Andric 
379c0981da4SDimitry Andric   if (!obj_sp)
380c0981da4SDimitry Andric     return;
381c0981da4SDimitry Andric 
382c0981da4SDimitry Andric   StructuredData::DictionarySP dict_sp =
383c0981da4SDimitry Andric       std::make_shared<StructuredData::Dictionary>(obj_sp);
384c0981da4SDimitry Andric   if (!dict_sp || dict_sp->GetType() == lldb::eStructuredDataTypeInvalid)
385c0981da4SDimitry Andric     return;
386344a3780SDimitry Andric 
3877fa27ce4SDimitry Andric   ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();
3887fa27ce4SDimitry Andric   llvm::StringRef class_name = metadata_sp ? metadata_sp->GetClassName() : "";
3897fa27ce4SDimitry Andric   metadata_sp = std::make_shared<ScriptedMetadata>(class_name, dict_sp);
3907fa27ce4SDimitry Andric   m_opaque_sp->SetScriptedMetadata(metadata_sp);
3917fa27ce4SDimitry Andric }
3927fa27ce4SDimitry Andric 
GetShadowListener()3937fa27ce4SDimitry Andric SBListener SBLaunchInfo::GetShadowListener() {
3947fa27ce4SDimitry Andric   LLDB_INSTRUMENT_VA(this);
3957fa27ce4SDimitry Andric 
3967fa27ce4SDimitry Andric   lldb::ListenerSP shadow_sp = m_opaque_sp->GetShadowListener();
3977fa27ce4SDimitry Andric   if (!shadow_sp)
3987fa27ce4SDimitry Andric     return SBListener();
3997fa27ce4SDimitry Andric   return SBListener(shadow_sp);
4007fa27ce4SDimitry Andric }
4017fa27ce4SDimitry Andric 
SetShadowListener(SBListener & listener)4027fa27ce4SDimitry Andric void SBLaunchInfo::SetShadowListener(SBListener &listener) {
4037fa27ce4SDimitry Andric   LLDB_INSTRUMENT_VA(this, listener);
4047fa27ce4SDimitry Andric 
405ac9a064cSDimitry Andric   m_opaque_sp->SetShadowListener(listener.GetSP());
406344a3780SDimitry Andric }
407