15ffd83dbSDimitry Andric //===-- SBLaunchInfo.cpp --------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/API/SBLaunchInfo.h"
1004eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
110b57cec5SDimitry Andric 
125ffd83dbSDimitry Andric #include "lldb/API/SBEnvironment.h"
13fe6060f1SDimitry Andric #include "lldb/API/SBError.h"
140b57cec5SDimitry Andric #include "lldb/API/SBFileSpec.h"
150b57cec5SDimitry Andric #include "lldb/API/SBListener.h"
16fe6060f1SDimitry Andric #include "lldb/API/SBStream.h"
17fe6060f1SDimitry Andric #include "lldb/API/SBStructuredData.h"
18fe6060f1SDimitry Andric #include "lldb/Core/StructuredDataImpl.h"
190b57cec5SDimitry Andric #include "lldb/Host/ProcessLaunchInfo.h"
2006c3fb27SDimitry Andric #include "lldb/Utility/Listener.h"
2106c3fb27SDimitry Andric #include "lldb/Utility/ScriptedMetadata.h"
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric using namespace lldb;
240b57cec5SDimitry Andric using namespace lldb_private;
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric class lldb_private::SBLaunchInfoImpl : public ProcessLaunchInfo {
270b57cec5SDimitry Andric public:
SBLaunchInfoImpl()2804eeddc0SDimitry Andric   SBLaunchInfoImpl() : m_envp(GetEnvironment().getEnvp()) {}
290b57cec5SDimitry Andric 
GetEnvp() const300b57cec5SDimitry Andric   const char *const *GetEnvp() const { return m_envp; }
RegenerateEnvp()310b57cec5SDimitry Andric   void RegenerateEnvp() { m_envp = GetEnvironment().getEnvp(); }
320b57cec5SDimitry Andric 
operator =(const ProcessLaunchInfo & rhs)330b57cec5SDimitry Andric   SBLaunchInfoImpl &operator=(const ProcessLaunchInfo &rhs) {
340b57cec5SDimitry Andric     ProcessLaunchInfo::operator=(rhs);
350b57cec5SDimitry Andric     RegenerateEnvp();
360b57cec5SDimitry Andric     return *this;
370b57cec5SDimitry Andric   }
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric private:
400b57cec5SDimitry Andric   Environment::Envp m_envp;
410b57cec5SDimitry Andric };
420b57cec5SDimitry Andric 
SBLaunchInfo(const char ** argv)430b57cec5SDimitry Andric SBLaunchInfo::SBLaunchInfo(const char **argv)
440b57cec5SDimitry Andric     : m_opaque_sp(new SBLaunchInfoImpl()) {
4504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, argv);
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric   m_opaque_sp->GetFlags().Reset(eLaunchFlagDebug | eLaunchFlagDisableASLR);
480b57cec5SDimitry Andric   if (argv && argv[0])
490b57cec5SDimitry Andric     m_opaque_sp->GetArguments().SetArguments(argv);
500b57cec5SDimitry Andric }
510b57cec5SDimitry Andric 
SBLaunchInfo(const SBLaunchInfo & rhs)525ffd83dbSDimitry Andric SBLaunchInfo::SBLaunchInfo(const SBLaunchInfo &rhs) {
5304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
545ffd83dbSDimitry Andric 
555ffd83dbSDimitry Andric   m_opaque_sp = rhs.m_opaque_sp;
565ffd83dbSDimitry Andric }
575ffd83dbSDimitry Andric 
operator =(const SBLaunchInfo & rhs)585ffd83dbSDimitry Andric SBLaunchInfo &SBLaunchInfo::operator=(const SBLaunchInfo &rhs) {
5904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
605ffd83dbSDimitry Andric 
615ffd83dbSDimitry Andric   m_opaque_sp = rhs.m_opaque_sp;
6204eeddc0SDimitry Andric   return *this;
635ffd83dbSDimitry Andric }
645ffd83dbSDimitry Andric 
655ffd83dbSDimitry Andric SBLaunchInfo::~SBLaunchInfo() = default;
660b57cec5SDimitry Andric 
ref() const670b57cec5SDimitry Andric const lldb_private::ProcessLaunchInfo &SBLaunchInfo::ref() const {
680b57cec5SDimitry Andric   return *m_opaque_sp;
690b57cec5SDimitry Andric }
700b57cec5SDimitry Andric 
set_ref(const ProcessLaunchInfo & info)710b57cec5SDimitry Andric void SBLaunchInfo::set_ref(const ProcessLaunchInfo &info) {
720b57cec5SDimitry Andric   *m_opaque_sp = info;
730b57cec5SDimitry Andric }
740b57cec5SDimitry Andric 
GetProcessID()750b57cec5SDimitry Andric lldb::pid_t SBLaunchInfo::GetProcessID() {
7604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric   return m_opaque_sp->GetProcessID();
790b57cec5SDimitry Andric }
800b57cec5SDimitry Andric 
GetUserID()810b57cec5SDimitry Andric uint32_t SBLaunchInfo::GetUserID() {
8204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
830b57cec5SDimitry Andric 
840b57cec5SDimitry Andric   return m_opaque_sp->GetUserID();
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric 
GetGroupID()870b57cec5SDimitry Andric uint32_t SBLaunchInfo::GetGroupID() {
8804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric   return m_opaque_sp->GetGroupID();
910b57cec5SDimitry Andric }
920b57cec5SDimitry Andric 
UserIDIsValid()930b57cec5SDimitry Andric bool SBLaunchInfo::UserIDIsValid() {
9404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
950b57cec5SDimitry Andric 
960b57cec5SDimitry Andric   return m_opaque_sp->UserIDIsValid();
970b57cec5SDimitry Andric }
980b57cec5SDimitry Andric 
GroupIDIsValid()990b57cec5SDimitry Andric bool SBLaunchInfo::GroupIDIsValid() {
10004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1010b57cec5SDimitry Andric 
1020b57cec5SDimitry Andric   return m_opaque_sp->GroupIDIsValid();
1030b57cec5SDimitry Andric }
1040b57cec5SDimitry Andric 
SetUserID(uint32_t uid)1050b57cec5SDimitry Andric void SBLaunchInfo::SetUserID(uint32_t uid) {
10604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, uid);
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric   m_opaque_sp->SetUserID(uid);
1090b57cec5SDimitry Andric }
1100b57cec5SDimitry Andric 
SetGroupID(uint32_t gid)1110b57cec5SDimitry Andric void SBLaunchInfo::SetGroupID(uint32_t gid) {
11204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, gid);
1130b57cec5SDimitry Andric 
1140b57cec5SDimitry Andric   m_opaque_sp->SetGroupID(gid);
1150b57cec5SDimitry Andric }
1160b57cec5SDimitry Andric 
GetExecutableFile()1170b57cec5SDimitry Andric SBFileSpec SBLaunchInfo::GetExecutableFile() {
11804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1190b57cec5SDimitry Andric 
12004eeddc0SDimitry Andric   return SBFileSpec(m_opaque_sp->GetExecutableFile());
1210b57cec5SDimitry Andric }
1220b57cec5SDimitry Andric 
SetExecutableFile(SBFileSpec exe_file,bool add_as_first_arg)1230b57cec5SDimitry Andric void SBLaunchInfo::SetExecutableFile(SBFileSpec exe_file,
1240b57cec5SDimitry Andric                                      bool add_as_first_arg) {
12504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, exe_file, add_as_first_arg);
1260b57cec5SDimitry Andric 
1270b57cec5SDimitry Andric   m_opaque_sp->SetExecutableFile(exe_file.ref(), add_as_first_arg);
1280b57cec5SDimitry Andric }
1290b57cec5SDimitry Andric 
GetListener()1300b57cec5SDimitry Andric SBListener SBLaunchInfo::GetListener() {
13104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1320b57cec5SDimitry Andric 
13304eeddc0SDimitry Andric   return SBListener(m_opaque_sp->GetListener());
1340b57cec5SDimitry Andric }
1350b57cec5SDimitry Andric 
SetListener(SBListener & listener)1360b57cec5SDimitry Andric void SBLaunchInfo::SetListener(SBListener &listener) {
13704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, listener);
1380b57cec5SDimitry Andric 
1390b57cec5SDimitry Andric   m_opaque_sp->SetListener(listener.GetSP());
1400b57cec5SDimitry Andric }
1410b57cec5SDimitry Andric 
GetNumArguments()1420b57cec5SDimitry Andric uint32_t SBLaunchInfo::GetNumArguments() {
14304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1440b57cec5SDimitry Andric 
1450b57cec5SDimitry Andric   return m_opaque_sp->GetArguments().GetArgumentCount();
1460b57cec5SDimitry Andric }
1470b57cec5SDimitry Andric 
GetArgumentAtIndex(uint32_t idx)1480b57cec5SDimitry Andric const char *SBLaunchInfo::GetArgumentAtIndex(uint32_t idx) {
14904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, idx);
1500b57cec5SDimitry Andric 
15106c3fb27SDimitry Andric   return ConstString(m_opaque_sp->GetArguments().GetArgumentAtIndex(idx))
15206c3fb27SDimitry Andric       .GetCString();
1530b57cec5SDimitry Andric }
1540b57cec5SDimitry Andric 
SetArguments(const char ** argv,bool append)1550b57cec5SDimitry Andric void SBLaunchInfo::SetArguments(const char **argv, bool append) {
15604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, argv, append);
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric   if (append) {
1590b57cec5SDimitry Andric     if (argv)
1600b57cec5SDimitry Andric       m_opaque_sp->GetArguments().AppendArguments(argv);
1610b57cec5SDimitry Andric   } else {
1620b57cec5SDimitry Andric     if (argv)
1630b57cec5SDimitry Andric       m_opaque_sp->GetArguments().SetArguments(argv);
1640b57cec5SDimitry Andric     else
1650b57cec5SDimitry Andric       m_opaque_sp->GetArguments().Clear();
1660b57cec5SDimitry Andric   }
1670b57cec5SDimitry Andric }
1680b57cec5SDimitry Andric 
GetNumEnvironmentEntries()1690b57cec5SDimitry Andric uint32_t SBLaunchInfo::GetNumEnvironmentEntries() {
17004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1710b57cec5SDimitry Andric 
1720b57cec5SDimitry Andric   return m_opaque_sp->GetEnvironment().size();
1730b57cec5SDimitry Andric }
1740b57cec5SDimitry Andric 
GetEnvironmentEntryAtIndex(uint32_t idx)1750b57cec5SDimitry Andric const char *SBLaunchInfo::GetEnvironmentEntryAtIndex(uint32_t idx) {
17604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, idx);
1770b57cec5SDimitry Andric 
1780b57cec5SDimitry Andric   if (idx > GetNumEnvironmentEntries())
1790b57cec5SDimitry Andric     return nullptr;
18006c3fb27SDimitry Andric   return ConstString(m_opaque_sp->GetEnvp()[idx]).GetCString();
1810b57cec5SDimitry Andric }
1820b57cec5SDimitry Andric 
SetEnvironmentEntries(const char ** envp,bool append)1830b57cec5SDimitry Andric void SBLaunchInfo::SetEnvironmentEntries(const char **envp, bool append) {
18404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, envp, append);
1855ffd83dbSDimitry Andric   SetEnvironment(SBEnvironment(Environment(envp)), append);
1865ffd83dbSDimitry Andric }
1870b57cec5SDimitry Andric 
SetEnvironment(const SBEnvironment & env,bool append)1885ffd83dbSDimitry Andric void SBLaunchInfo::SetEnvironment(const SBEnvironment &env, bool append) {
18904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, env, append);
1905ffd83dbSDimitry Andric   Environment &refEnv = env.ref();
191e8d8bef9SDimitry Andric   if (append) {
192e8d8bef9SDimitry Andric     for (auto &KV : refEnv)
193e8d8bef9SDimitry Andric       m_opaque_sp->GetEnvironment().insert_or_assign(KV.first(), KV.second);
194e8d8bef9SDimitry Andric   } else
1955ffd83dbSDimitry Andric     m_opaque_sp->GetEnvironment() = refEnv;
1960b57cec5SDimitry Andric   m_opaque_sp->RegenerateEnvp();
1970b57cec5SDimitry Andric }
1980b57cec5SDimitry Andric 
GetEnvironment()1995ffd83dbSDimitry Andric SBEnvironment SBLaunchInfo::GetEnvironment() {
20004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
20104eeddc0SDimitry Andric   return SBEnvironment(Environment(m_opaque_sp->GetEnvironment()));
2025ffd83dbSDimitry Andric }
2035ffd83dbSDimitry Andric 
Clear()2040b57cec5SDimitry Andric void SBLaunchInfo::Clear() {
20504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2060b57cec5SDimitry Andric 
2070b57cec5SDimitry Andric   m_opaque_sp->Clear();
2080b57cec5SDimitry Andric }
2090b57cec5SDimitry Andric 
GetWorkingDirectory() const2100b57cec5SDimitry Andric const char *SBLaunchInfo::GetWorkingDirectory() const {
21104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2120b57cec5SDimitry Andric 
213bdd1243dSDimitry Andric   return m_opaque_sp->GetWorkingDirectory().GetPathAsConstString().AsCString();
2140b57cec5SDimitry Andric }
2150b57cec5SDimitry Andric 
SetWorkingDirectory(const char * working_dir)2160b57cec5SDimitry Andric void SBLaunchInfo::SetWorkingDirectory(const char *working_dir) {
21704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, working_dir);
2180b57cec5SDimitry Andric 
2190b57cec5SDimitry Andric   m_opaque_sp->SetWorkingDirectory(FileSpec(working_dir));
2200b57cec5SDimitry Andric }
2210b57cec5SDimitry Andric 
GetLaunchFlags()2220b57cec5SDimitry Andric uint32_t SBLaunchInfo::GetLaunchFlags() {
22304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2240b57cec5SDimitry Andric 
2250b57cec5SDimitry Andric   return m_opaque_sp->GetFlags().Get();
2260b57cec5SDimitry Andric }
2270b57cec5SDimitry Andric 
SetLaunchFlags(uint32_t flags)2280b57cec5SDimitry Andric void SBLaunchInfo::SetLaunchFlags(uint32_t flags) {
22904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, flags);
2300b57cec5SDimitry Andric 
2310b57cec5SDimitry Andric   m_opaque_sp->GetFlags().Reset(flags);
2320b57cec5SDimitry Andric }
2330b57cec5SDimitry Andric 
GetProcessPluginName()2340b57cec5SDimitry Andric const char *SBLaunchInfo::GetProcessPluginName() {
23504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2360b57cec5SDimitry Andric 
23706c3fb27SDimitry Andric   return ConstString(m_opaque_sp->GetProcessPluginName()).GetCString();
2380b57cec5SDimitry Andric }
2390b57cec5SDimitry Andric 
SetProcessPluginName(const char * plugin_name)2400b57cec5SDimitry Andric void SBLaunchInfo::SetProcessPluginName(const char *plugin_name) {
24104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, plugin_name);
2420b57cec5SDimitry Andric 
2430b57cec5SDimitry Andric   return m_opaque_sp->SetProcessPluginName(plugin_name);
2440b57cec5SDimitry Andric }
2450b57cec5SDimitry Andric 
GetShell()2460b57cec5SDimitry Andric const char *SBLaunchInfo::GetShell() {
24704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2480b57cec5SDimitry Andric 
2490b57cec5SDimitry Andric   // Constify this string so that it is saved in the string pool.  Otherwise it
2500b57cec5SDimitry Andric   // would be freed when this function goes out of scope.
2510b57cec5SDimitry Andric   ConstString shell(m_opaque_sp->GetShell().GetPath().c_str());
2520b57cec5SDimitry Andric   return shell.AsCString();
2530b57cec5SDimitry Andric }
2540b57cec5SDimitry Andric 
SetShell(const char * path)2550b57cec5SDimitry Andric void SBLaunchInfo::SetShell(const char *path) {
25604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, path);
2570b57cec5SDimitry Andric 
2580b57cec5SDimitry Andric   m_opaque_sp->SetShell(FileSpec(path));
2590b57cec5SDimitry Andric }
2600b57cec5SDimitry Andric 
GetShellExpandArguments()2610b57cec5SDimitry Andric bool SBLaunchInfo::GetShellExpandArguments() {
26204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2630b57cec5SDimitry Andric 
2640b57cec5SDimitry Andric   return m_opaque_sp->GetShellExpandArguments();
2650b57cec5SDimitry Andric }
2660b57cec5SDimitry Andric 
SetShellExpandArguments(bool expand)2670b57cec5SDimitry Andric void SBLaunchInfo::SetShellExpandArguments(bool expand) {
26804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, expand);
2690b57cec5SDimitry Andric 
2700b57cec5SDimitry Andric   m_opaque_sp->SetShellExpandArguments(expand);
2710b57cec5SDimitry Andric }
2720b57cec5SDimitry Andric 
GetResumeCount()2730b57cec5SDimitry Andric uint32_t SBLaunchInfo::GetResumeCount() {
27404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2750b57cec5SDimitry Andric 
2760b57cec5SDimitry Andric   return m_opaque_sp->GetResumeCount();
2770b57cec5SDimitry Andric }
2780b57cec5SDimitry Andric 
SetResumeCount(uint32_t c)2790b57cec5SDimitry Andric void SBLaunchInfo::SetResumeCount(uint32_t c) {
28004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, c);
2810b57cec5SDimitry Andric 
2820b57cec5SDimitry Andric   m_opaque_sp->SetResumeCount(c);
2830b57cec5SDimitry Andric }
2840b57cec5SDimitry Andric 
AddCloseFileAction(int fd)2850b57cec5SDimitry Andric bool SBLaunchInfo::AddCloseFileAction(int fd) {
28604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, fd);
2870b57cec5SDimitry Andric 
2880b57cec5SDimitry Andric   return m_opaque_sp->AppendCloseFileAction(fd);
2890b57cec5SDimitry Andric }
2900b57cec5SDimitry Andric 
AddDuplicateFileAction(int fd,int dup_fd)2910b57cec5SDimitry Andric bool SBLaunchInfo::AddDuplicateFileAction(int fd, int dup_fd) {
29204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, fd, dup_fd);
2930b57cec5SDimitry Andric 
2940b57cec5SDimitry Andric   return m_opaque_sp->AppendDuplicateFileAction(fd, dup_fd);
2950b57cec5SDimitry Andric }
2960b57cec5SDimitry Andric 
AddOpenFileAction(int fd,const char * path,bool read,bool write)2970b57cec5SDimitry Andric bool SBLaunchInfo::AddOpenFileAction(int fd, const char *path, bool read,
2980b57cec5SDimitry Andric                                      bool write) {
29904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, fd, path, read, write);
3000b57cec5SDimitry Andric 
3010b57cec5SDimitry Andric   return m_opaque_sp->AppendOpenFileAction(fd, FileSpec(path), read, write);
3020b57cec5SDimitry Andric }
3030b57cec5SDimitry Andric 
AddSuppressFileAction(int fd,bool read,bool write)3040b57cec5SDimitry Andric bool SBLaunchInfo::AddSuppressFileAction(int fd, bool read, bool write) {
30504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, fd, read, write);
3060b57cec5SDimitry Andric 
3070b57cec5SDimitry Andric   return m_opaque_sp->AppendSuppressFileAction(fd, read, write);
3080b57cec5SDimitry Andric }
3090b57cec5SDimitry Andric 
SetLaunchEventData(const char * data)3100b57cec5SDimitry Andric void SBLaunchInfo::SetLaunchEventData(const char *data) {
31104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, data);
3120b57cec5SDimitry Andric 
3130b57cec5SDimitry Andric   m_opaque_sp->SetLaunchEventData(data);
3140b57cec5SDimitry Andric }
3150b57cec5SDimitry Andric 
GetLaunchEventData() const3160b57cec5SDimitry Andric const char *SBLaunchInfo::GetLaunchEventData() const {
31704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
3180b57cec5SDimitry Andric 
31906c3fb27SDimitry Andric   return ConstString(m_opaque_sp->GetLaunchEventData()).GetCString();
3200b57cec5SDimitry Andric }
3210b57cec5SDimitry Andric 
SetDetachOnError(bool enable)3220b57cec5SDimitry Andric void SBLaunchInfo::SetDetachOnError(bool enable) {
32304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, enable);
3240b57cec5SDimitry Andric 
3250b57cec5SDimitry Andric   m_opaque_sp->SetDetachOnError(enable);
3260b57cec5SDimitry Andric }
3270b57cec5SDimitry Andric 
GetDetachOnError() const3280b57cec5SDimitry Andric bool SBLaunchInfo::GetDetachOnError() const {
32904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
3300b57cec5SDimitry Andric 
3310b57cec5SDimitry Andric   return m_opaque_sp->GetDetachOnError();
3320b57cec5SDimitry Andric }
3330b57cec5SDimitry Andric 
GetScriptedProcessClassName() const334fe6060f1SDimitry Andric const char *SBLaunchInfo::GetScriptedProcessClassName() const {
33504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
336fe6060f1SDimitry Andric 
33706c3fb27SDimitry Andric   ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();
33806c3fb27SDimitry Andric 
33906c3fb27SDimitry Andric   if (!metadata_sp || !*metadata_sp)
34006c3fb27SDimitry Andric     return nullptr;
34106c3fb27SDimitry Andric 
342fe6060f1SDimitry Andric   // Constify this string so that it is saved in the string pool.  Otherwise it
343fe6060f1SDimitry Andric   // would be freed when this function goes out of scope.
34406c3fb27SDimitry Andric   ConstString class_name(metadata_sp->GetClassName().data());
345fe6060f1SDimitry Andric   return class_name.AsCString();
346fe6060f1SDimitry Andric }
347fe6060f1SDimitry Andric 
SetScriptedProcessClassName(const char * class_name)348fe6060f1SDimitry Andric void SBLaunchInfo::SetScriptedProcessClassName(const char *class_name) {
34904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, class_name);
35006c3fb27SDimitry Andric   ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();
35106c3fb27SDimitry Andric   StructuredData::DictionarySP dict_sp =
35206c3fb27SDimitry Andric       metadata_sp ? metadata_sp->GetArgsSP() : nullptr;
35306c3fb27SDimitry Andric   metadata_sp = std::make_shared<ScriptedMetadata>(class_name, dict_sp);
35406c3fb27SDimitry Andric   m_opaque_sp->SetScriptedMetadata(metadata_sp);
355fe6060f1SDimitry Andric }
356fe6060f1SDimitry Andric 
GetScriptedProcessDictionary() const357fe6060f1SDimitry Andric lldb::SBStructuredData SBLaunchInfo::GetScriptedProcessDictionary() const {
35804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
359fe6060f1SDimitry Andric 
36006c3fb27SDimitry Andric   ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();
361fe6060f1SDimitry Andric 
362fe6060f1SDimitry Andric   SBStructuredData data;
36306c3fb27SDimitry Andric   if (!metadata_sp)
36406c3fb27SDimitry Andric     return data;
36506c3fb27SDimitry Andric 
36606c3fb27SDimitry Andric   lldb_private::StructuredData::DictionarySP dict_sp = metadata_sp->GetArgsSP();
367fe6060f1SDimitry Andric   data.m_impl_up->SetObjectSP(dict_sp);
368fe6060f1SDimitry Andric 
36904eeddc0SDimitry Andric   return data;
370fe6060f1SDimitry Andric }
371fe6060f1SDimitry Andric 
SetScriptedProcessDictionary(lldb::SBStructuredData dict)372fe6060f1SDimitry Andric void SBLaunchInfo::SetScriptedProcessDictionary(lldb::SBStructuredData dict) {
37304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, dict);
374349cc55cSDimitry Andric   if (!dict.IsValid() || !dict.m_impl_up)
375fe6060f1SDimitry Andric     return;
376fe6060f1SDimitry Andric 
377349cc55cSDimitry Andric   StructuredData::ObjectSP obj_sp = dict.m_impl_up->GetObjectSP();
378349cc55cSDimitry Andric 
379349cc55cSDimitry Andric   if (!obj_sp)
380349cc55cSDimitry Andric     return;
381349cc55cSDimitry Andric 
382349cc55cSDimitry Andric   StructuredData::DictionarySP dict_sp =
383349cc55cSDimitry Andric       std::make_shared<StructuredData::Dictionary>(obj_sp);
384349cc55cSDimitry Andric   if (!dict_sp || dict_sp->GetType() == lldb::eStructuredDataTypeInvalid)
385349cc55cSDimitry Andric     return;
386fe6060f1SDimitry Andric 
38706c3fb27SDimitry Andric   ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();
38806c3fb27SDimitry Andric   llvm::StringRef class_name = metadata_sp ? metadata_sp->GetClassName() : "";
38906c3fb27SDimitry Andric   metadata_sp = std::make_shared<ScriptedMetadata>(class_name, dict_sp);
39006c3fb27SDimitry Andric   m_opaque_sp->SetScriptedMetadata(metadata_sp);
39106c3fb27SDimitry Andric }
39206c3fb27SDimitry Andric 
GetShadowListener()39306c3fb27SDimitry Andric SBListener SBLaunchInfo::GetShadowListener() {
39406c3fb27SDimitry Andric   LLDB_INSTRUMENT_VA(this);
39506c3fb27SDimitry Andric 
39606c3fb27SDimitry Andric   lldb::ListenerSP shadow_sp = m_opaque_sp->GetShadowListener();
39706c3fb27SDimitry Andric   if (!shadow_sp)
39806c3fb27SDimitry Andric     return SBListener();
39906c3fb27SDimitry Andric   return SBListener(shadow_sp);
40006c3fb27SDimitry Andric }
40106c3fb27SDimitry Andric 
SetShadowListener(SBListener & listener)40206c3fb27SDimitry Andric void SBLaunchInfo::SetShadowListener(SBListener &listener) {
40306c3fb27SDimitry Andric   LLDB_INSTRUMENT_VA(this, listener);
40406c3fb27SDimitry Andric 
40506c3fb27SDimitry Andric   ListenerSP listener_sp = listener.GetSP();
40606c3fb27SDimitry Andric   if (listener_sp && listener.IsValid())
40706c3fb27SDimitry Andric     listener_sp->SetShadow(true);
40806c3fb27SDimitry Andric   else
40906c3fb27SDimitry Andric     listener_sp = nullptr;
41006c3fb27SDimitry Andric 
41106c3fb27SDimitry Andric   m_opaque_sp->SetShadowListener(listener_sp);
412fe6060f1SDimitry Andric }
413