1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
// 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.
#include "tools/v8windbg/src/cur-isolate.h"
HRESULT GetIsolateLocation(WRL::ComPtr<IDebugHostContext>& sp_ctx,
Location* location) {
auto sp_v8_module = Extension::Current()->GetV8Module(sp_ctx);
if (sp_v8_module == nullptr) return E_FAIL;
WRL::ComPtr<IDebugHostSymbol> sp_isolate_sym;
RETURN_IF_FAIL(
sp_v8_module->FindSymbolByName(kIsolateOffset, &sp_isolate_sym));
SymbolKind kind;
RETURN_IF_FAIL(sp_isolate_sym->GetSymbolKind(&kind));
if (kind != SymbolData) return E_FAIL;
WRL::ComPtr<IDebugHostData> sp_isolate_key_data;
RETURN_IF_FAIL(sp_isolate_sym.As(&sp_isolate_key_data));
RETURN_IF_FAIL(sp_isolate_key_data->GetLocation(location));
return S_OK;
}
HRESULT GetCurrentIsolate(WRL::ComPtr<IModelObject>& sp_result) {
sp_result = nullptr;
// Get the current context
WRL::ComPtr<IDebugHostContext> sp_host_context;
RETURN_IF_FAIL(sp_debug_host->GetCurrentContext(&sp_host_context));
Location isolate_addr;
RETURN_IF_FAIL(GetIsolateLocation(sp_host_context, &isolate_addr));
// If we got the isolate_key OK, then must have the V8 module loaded
// Get the internal Isolate type from it
WRL::ComPtr<IDebugHostType> sp_isolate_type, sp_isolate_ptr_type;
RETURN_IF_FAIL(Extension::Current()
->GetV8Module(sp_host_context)
->FindTypeByName(kIsolate, &sp_isolate_type));
RETURN_IF_FAIL(
sp_isolate_type->CreatePointerTo(PointerStandard, &sp_isolate_ptr_type));
RETURN_IF_FAIL(sp_data_model_manager->CreateTypedObject(
sp_host_context.Get(), isolate_addr, sp_isolate_type.Get(), &sp_result));
return S_OK;
}
IFACEMETHODIMP CurrIsolateAlias::Call(IModelObject* p_context_object,
ULONG64 arg_count,
IModelObject** pp_arguments,
IModelObject** pp_result,
IKeyStore** pp_metadata) noexcept {
*pp_result = nullptr;
WRL::ComPtr<IModelObject> sp_result;
RETURN_IF_FAIL(GetCurrentIsolate(sp_result));
*pp_result = sp_result.Detach();
return S_OK;
}
|