This patch adds `get_priority()` support to synthetic frame providers to enable priority-based selection when multiple providers match a thread. This is the first step toward supporting frame provider chaining for visualizing coroutines, Swift async tasks, and et al. Priority ordering follows Unix nice convention where lower numbers indicate higher priority (0 = highest). Providers without explicit priority return `std::nullopt`, which maps to UINT32_MAX (lowest priority), ensuring backward compatibility with existing providers. The implementation adds `GetPriority()` as a virtual method to `SyntheticFrameProvider` base class, implements it through the scripting interface hierarchy (`ScriptedFrameProviderInterface` and `ScriptedFrameProviderPythonInterface`), and updates `Thread::GetStackFrameList()` to sort applicable providers by priority before attempting to load them. Python frame providers can now specify priority: ```python @staticmethod def get_priority(): return 10 # Or return None for default priority. ``` Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
66 lines
2.3 KiB
C++
66 lines
2.3 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDFRAMEPROVIDERPYTHONINTERFACE_H
|
|
#define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDFRAMEPROVIDERPYTHONINTERFACE_H
|
|
|
|
#include "lldb/Host/Config.h"
|
|
|
|
#if LLDB_ENABLE_PYTHON
|
|
|
|
#include "ScriptedPythonInterface.h"
|
|
#include "lldb/Core/PluginInterface.h"
|
|
#include "lldb/Interpreter/Interfaces/ScriptedFrameProviderInterface.h"
|
|
#include <optional>
|
|
|
|
namespace lldb_private {
|
|
class ScriptedFrameProviderPythonInterface
|
|
: public ScriptedFrameProviderInterface,
|
|
public ScriptedPythonInterface,
|
|
public PluginInterface {
|
|
public:
|
|
ScriptedFrameProviderPythonInterface(
|
|
ScriptInterpreterPythonImpl &interpreter);
|
|
|
|
bool AppliesToThread(llvm::StringRef class_name,
|
|
lldb::ThreadSP thread_sp) override;
|
|
|
|
llvm::Expected<StructuredData::GenericSP>
|
|
CreatePluginObject(llvm::StringRef class_name,
|
|
lldb::StackFrameListSP input_frames,
|
|
StructuredData::DictionarySP args_sp) override;
|
|
|
|
llvm::SmallVector<AbstractMethodRequirement>
|
|
GetAbstractMethodRequirements() const override {
|
|
return llvm::SmallVector<AbstractMethodRequirement>(
|
|
{{"get_description"}, {"get_frame_at_index"}});
|
|
}
|
|
|
|
std::string GetDescription(llvm::StringRef class_name) override;
|
|
|
|
std::optional<uint32_t> GetPriority(llvm::StringRef class_name) override;
|
|
|
|
StructuredData::ObjectSP GetFrameAtIndex(uint32_t index) override;
|
|
|
|
static void Initialize();
|
|
static void Terminate();
|
|
|
|
static bool CreateInstance(lldb::ScriptLanguage language,
|
|
ScriptedInterfaceUsages usages);
|
|
|
|
static llvm::StringRef GetPluginNameStatic() {
|
|
return "ScriptedFrameProviderPythonInterface";
|
|
}
|
|
|
|
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
|
|
};
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_ENABLE_PYTHON
|
|
#endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDFRAMEPROVIDERPYTHONINTERFACE_H
|