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_INTERFACES_SCRIPTEDINTERFACE_H 10 #define LLDB_INTERPRETER_INTERFACES_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/Utility/UnimplementedError.h" 17 #include "lldb/lldb-private.h" 18 19 #include "llvm/Support/Compiler.h" 20 21 #include <string> 22 23 namespace lldb_private { 24 class ScriptedInterface { 25 public: 26 ScriptedInterface() = default; 27 virtual ~ScriptedInterface() = default; 28 29 StructuredData::GenericSP GetScriptObjectInstance() { 30 return m_object_instance_sp; 31 } 32 33 virtual llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const = 0; 34 35 template <typename Ret> 36 static Ret ErrorWithMessage(llvm::StringRef caller_name, 37 llvm::StringRef error_msg, Status &error, 38 LLDBLog log_caterogy = LLDBLog::Process) { 39 LLDB_LOGF(GetLog(log_caterogy), "%s ERROR = %s", caller_name.data(), 40 error_msg.data()); 41 std::string full_error_message = 42 llvm::Twine(caller_name + llvm::Twine(" ERROR = ") + 43 llvm::Twine(error_msg)) 44 .str(); 45 if (const char *detailed_error = error.AsCString()) 46 full_error_message += 47 llvm::Twine(llvm::Twine(" (") + llvm::Twine(detailed_error) + 48 llvm::Twine(")")) 49 .str(); 50 error.SetErrorString(full_error_message); 51 return {}; 52 } 53 54 template <typename T = StructuredData::ObjectSP> 55 bool CheckStructuredDataObject(llvm::StringRef caller, T obj, Status &error) { 56 if (!obj) 57 return ErrorWithMessage<bool>(caller, "Null Structured Data object", 58 error); 59 60 if (!obj->IsValid()) { 61 return ErrorWithMessage<bool>(caller, "Invalid StructuredData object", 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_INTERFACES_SCRIPTEDINTERFACE_H 76