Format array like objects.
This commit is contained in:
@@ -164,6 +164,23 @@ DebugAdapterProtocol::Variable ASVariableFormatter::GetAsDAPVariable(asIScriptEn
|
||||
}
|
||||
return DebugAdapterProtocol::Variable::FromPointer(name, typeData->GetName(), stringified, reference);
|
||||
}
|
||||
|
||||
template <typename T, int (asIScriptContext::*SetArg)(asUINT, T), T (asIScriptContext::*GetLength)()>
|
||||
void ASVariableFormatter::FormatArrayLike(std::vector<DebugAdapterProtocol::Variable>& vars, asIScriptEngine* engine,
|
||||
asIScriptContext* ctx, void* address, AngelscriptDebugger* debugger,
|
||||
asIScriptFunction* indexFunc) {
|
||||
auto length = (ctx->*GetLength)();
|
||||
for (T i = 0; i < length; ++i) {
|
||||
assert(ctx->Prepare(indexFunc) >= 0);
|
||||
ctx->SetObject(address);
|
||||
(ctx->*SetArg)(0, i);
|
||||
ctx->Execute();
|
||||
auto name = std::to_string(i);
|
||||
vars.push_back(GetAsDAPVariable(engine, ctx, debugger, name, indexFunc->GetReturnTypeId(),
|
||||
ctx->GetAddressOfReturnValue()));
|
||||
}
|
||||
}
|
||||
|
||||
void ASVariableFormatter::GetChildDAPVariables(std::vector<DebugAdapterProtocol::Variable>& vars,
|
||||
asIScriptEngine* engine, asIScriptContext* ctx,
|
||||
AngelscriptDebugger* debugger, int type, void* address) {
|
||||
@@ -205,4 +222,25 @@ void ASVariableFormatter::GetChildDAPVariables(std::vector<DebugAdapterProtocol:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto indexFunc = typeData->GetMethodByName("get_opIndex", true);
|
||||
if (indexFunc != nullptr && indexFunc->GetParamCount() == 1) {
|
||||
auto lengthFunc = typeData->GetMethodByName("get_Length", true);
|
||||
int t;
|
||||
indexFunc->GetParam(0, &t);
|
||||
if (lengthFunc != nullptr && lengthFunc->GetParamCount() == 0 && lengthFunc->GetReturnTypeId() == t) {
|
||||
assert(ctx->Prepare(lengthFunc) >= 0);
|
||||
ctx->SetObject(address);
|
||||
ctx->Execute();
|
||||
if (t == asTYPEID_UINT64) {
|
||||
FormatArrayLike<uint64_t, &asIScriptContext::SetArgQWord, &asIScriptContext::GetReturnQWord>(
|
||||
vars, engine, ctx, address, debugger, indexFunc);
|
||||
}
|
||||
else if (t == asTYPEID_INT32){
|
||||
FormatArrayLike<uint32_t, &asIScriptContext::SetArgDWord, &asIScriptContext::GetReturnDWord>(
|
||||
vars, engine, ctx, address, debugger, indexFunc);
|
||||
}
|
||||
}
|
||||
// vars.push_back(DebugAdapterProtocol::Variable("has_indexer", "true", "string", {}));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,10 @@ public:
|
||||
static DebugAdapterProtocol::Variable GetAsDAPVariable(asIScriptEngine* engine, asIScriptContext* ctx,
|
||||
AngelscriptDebugger* debugger, const std::string& name, int,
|
||||
void*);
|
||||
template <typename T, int (asIScriptContext::*SetArg)(asUINT, T), T (asIScriptContext::*GetLength)()>
|
||||
static void FormatArrayLike(std::vector<DebugAdapterProtocol::Variable>& vars, asIScriptEngine* engine,
|
||||
asIScriptContext* ctx, void* address, AngelscriptDebugger* debugger,
|
||||
asIScriptFunction* indexFunc);
|
||||
static void GetChildDAPVariables(std::vector<DebugAdapterProtocol::Variable>&, asIScriptEngine* engine,
|
||||
asIScriptContext* ctx, AngelscriptDebugger* debugger, int, void*);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user