From da09990a81c6234653015ea272b34da8f865040d Mon Sep 17 00:00:00 2001 From: Ambr0se Date: Thu, 28 Aug 2025 20:24:45 +0800 Subject: [PATCH] fix: Incorrect class_ptr handling in C# layer When building a class in the C# layer, class_ptr would consistently receive an incorrect value, experience erroneous pointer dereferencing, or fail to update the class_name --- src/engine/classes.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/engine/classes.cpp b/src/engine/classes.cpp index 8b34304..75f62e1 100644 --- a/src/engine/classes.cpp +++ b/src/engine/classes.cpp @@ -122,6 +122,28 @@ void DotnetClassCallback(EContext* ctx, CallContext& call_ctx, bool bypassClassC if (splits[0] == splits[1]) { data = new ClassData({}, splits[0], ctx); + + void* classPtr = nullptr; + int argType = call_ctx.GetArgumentType(1); + uint64_t argValue = call_ctx.GetArgument(1); + + switch (argType) + { + case 18: // Argument is ClassData* + { + classPtr = reinterpret_cast(argValue)->GetData("class_ptr"); + break; + } + case 14: // Argument is std::string* (hex address) + { + classPtr = reinterpret_cast(std::stoull(*reinterpret_cast(argValue), nullptr, 16)); + break; + } + } + + data->SetData("class_ptr", classPtr); + data->SetData("class_name", splits[0]); + Stack::pushDotnet(ctx, &call_ctx, data, true); MarkDeleteOnGC(data); }