xref: /openbsd-src/gnu/llvm/lldb/include/lldb/Interpreter/ScriptedInterface.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1 //===-- ScriptedInterface.h -------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_INTERPRETER_SCRIPTEDINTERFACE_H
10 #define LLDB_INTERPRETER_SCRIPTEDINTERFACE_H
11 
12 #include "lldb/Core/StructuredDataImpl.h"
13 #include "lldb/Target/ExecutionContext.h"
14 #include "lldb/Utility/LLDBLog.h"
15 #include "lldb/Utility/Log.h"
16 #include "lldb/lldb-private.h"
17 
18 #include "llvm/Support/Compiler.h"
19 
20 #include <string>
21 
22 namespace lldb_private {
23 class ScriptedInterface {
24 public:
25   ScriptedInterface() = default;
26   virtual ~ScriptedInterface() = default;
27 
28   virtual StructuredData::GenericSP
29   CreatePluginObject(llvm::StringRef class_name, ExecutionContext &exe_ctx,
30                      StructuredData::DictionarySP args_sp,
31                      StructuredData::Generic *script_obj = nullptr) = 0;
32 
33   template <typename Ret>
34   static Ret ErrorWithMessage(llvm::StringRef caller_name,
35                               llvm::StringRef error_msg, Status &error,
36                               LLDBLog log_caterogy = LLDBLog::Process) {
37     LLDB_LOGF(GetLog(log_caterogy), "%s ERROR = %s", caller_name.data(),
38               error_msg.data());
39     error.SetErrorString(llvm::Twine(caller_name + llvm::Twine(" ERROR = ") +
40                                      llvm::Twine(error_msg))
41                              .str());
42     return {};
43   }
44 
45   template <typename T = StructuredData::ObjectSP>
CheckStructuredDataObject(llvm::StringRef caller,T obj,Status & error)46   bool CheckStructuredDataObject(llvm::StringRef caller, T obj, Status &error) {
47     if (!obj) {
48       return ErrorWithMessage<bool>(caller,
49                                     llvm::Twine("Null StructuredData object (" +
50                                                 llvm::Twine(error.AsCString()) +
51                                                 llvm::Twine(")."))
52                                         .str(),
53                                     error);
54     }
55 
56     if (!obj->IsValid()) {
57       return ErrorWithMessage<bool>(
58           caller,
59           llvm::Twine("Invalid StructuredData object (" +
60                       llvm::Twine(error.AsCString()) + llvm::Twine(")."))
61               .str(),
62           error);
63     }
64 
65     if (error.Fail())
66       return ErrorWithMessage<bool>(caller, error.AsCString(), error);
67 
68     return true;
69   }
70 
71 protected:
72   StructuredData::GenericSP m_object_instance_sp;
73 };
74 } // namespace lldb_private
75 #endif // LLDB_INTERPRETER_SCRIPTEDINTERFACE_H
76