| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_TOOLS_V8WINDBG_SRC_V8WINDBG_EXTENSION_H_ |
| #define V8_TOOLS_V8WINDBG_SRC_V8WINDBG_EXTENSION_H_ |
| |
| #include <memory> |
| #include <unordered_map> |
| #include <vector> |
| |
| #include "tools/v8windbg/base/utilities.h" |
| |
| // Responsible for initializing and uninitializing the extension. Also provides |
| // various convenience functions. |
| class Extension { |
| public: |
| Extension(); |
| HRESULT Initialize(); |
| ~Extension(); |
| WRL::ComPtr<IDebugHostModule> GetV8Module( |
| WRL::ComPtr<IDebugHostContext>& sp_ctx); |
| WRL::ComPtr<IDebugHostType> GetTypeFromV8Module( |
| WRL::ComPtr<IDebugHostContext>& sp_ctx, const char16_t* type_name); |
| WRL::ComPtr<IDebugHostType> GetV8ObjectType( |
| WRL::ComPtr<IDebugHostContext>& sp_ctx); |
| void TryRegisterType(WRL::ComPtr<IDebugHostType>& sp_type, |
| std::u16string type_name); |
| bool DoesTypeDeriveFromObject(const WRL::ComPtr<IDebugHostType>& sp_type); |
| static Extension* Current() { return current_extension_.get(); } |
| static void SetExtension(std::unique_ptr<Extension> new_extension) { |
| current_extension_ = std::move(new_extension); |
| } |
| |
| // Returns the parent model for instances of v8::internal::Object and similar |
| // classes, which contain as their first and only field a tagged V8 value. |
| IModelObject* GetObjectDataModel() { return sp_object_data_model_.Get(); } |
| |
| // Returns the parent model that provides indexing support for fields that |
| // contain arrays of something more complicated than basic native types. |
| IModelObject* GetIndexedFieldDataModel() { |
| return sp_indexed_field_model_.Get(); |
| } |
| |
| private: |
| HRESULT OverrideLocalsGetter(IModelObject* parent, const wchar_t* key_name, |
| bool is_parameters); |
| |
| template <class PropertyClass> |
| HRESULT RegisterAndAddPropertyForClass( |
| const wchar_t* class_name, const wchar_t* property_name, |
| WRL::ComPtr<IModelObject> sp_data_model); |
| |
| // A property that has been overridden by this extension. The original value |
| // must be put back in place during ~Extension. |
| struct PropertyOverride { |
| PropertyOverride(); |
| PropertyOverride(IModelObject* parent, std::u16string key_name, |
| IModelObject* original_value, |
| IKeyStore* original_metadata); |
| ~PropertyOverride(); |
| PropertyOverride(const PropertyOverride&); |
| PropertyOverride& operator=(const PropertyOverride&); |
| WRL::ComPtr<IModelObject> parent; |
| std::u16string key_name; |
| WRL::ComPtr<IModelObject> original_value; |
| WRL::ComPtr<IKeyStore> original_metadata; |
| }; |
| |
| struct RegistrationType { |
| RegistrationType(); |
| RegistrationType(IDebugHostTypeSignature* sp_signature, |
| IModelObject* sp_data_model); |
| ~RegistrationType(); |
| RegistrationType(const RegistrationType&); |
| RegistrationType& operator=(const RegistrationType&); |
| |
| WRL::ComPtr<IDebugHostTypeSignature> sp_signature; |
| WRL::ComPtr<IModelObject> sp_data_model; |
| }; |
| |
| static std::unique_ptr<Extension> current_extension_; |
| |
| WRL::ComPtr<IModelObject> sp_object_data_model_; |
| WRL::ComPtr<IModelObject> sp_local_data_model_; |
| WRL::ComPtr<IModelObject> sp_compiler_node_data_model_; |
| WRL::ComPtr<IModelObject> sp_compiler_type_data_model_; |
| WRL::ComPtr<IModelObject> sp_indexed_field_model_; |
| |
| WRL::ComPtr<IDebugHostModule> sp_v8_module_; |
| std::unordered_map<std::u16string, WRL::ComPtr<IDebugHostType>> |
| cached_v8_module_types_; |
| std::vector<RegistrationType> registered_types_; |
| std::vector<PropertyOverride> overridden_properties_; |
| WRL::ComPtr<IDebugHostContext> sp_v8_module_ctx_; |
| ULONG v8_module_proc_id_; |
| }; |
| #endif // V8_TOOLS_V8WINDBG_SRC_V8WINDBG_EXTENSION_H_ |