Update stub dumping routines

This commit is contained in:
Guus Waals 2025-05-29 18:05:55 +08:00
parent e19a123b94
commit 5ce1a399b1
1 changed files with 38 additions and 5 deletions

View File

@ -333,15 +333,48 @@ public class FunctionDumper {
writer2.println("// with possible manualy fixes");
writer2.println();
writer2.println("#include <r3/binders/auto.h>");
writer2.println("#include <r3/binders/stub.h>");
writer2.println("#include <gh_global.h>");
writer2.println("#include <stdexcept>");
writer2.println();
writer2.println("// " + externalFunction.getEntryPoint());
writer2.println("// " + externalFunction.getName());
writer2.println("extern \"C\" " + externalFunction.getSignature().getPrototypeString(false) + " {");
writer2.println(" // TODO: Implement this function");
writer2
.println(" throw GHStubException(\"Function not implemented: " + externalFunction.getName() + "\");");
// Parse function signature to extract calling convention, return type, and parameters
String signature = externalFunction.getSignature().getPrototypeString(false);
String callingConvention = externalFunction.getCallingConventionName();
String returnType = externalFunction.getReturnType().toString();
// Generate function stub using appropriate forwarding function
writer2.println("extern \"C\" " + signature + " {");
// Determine which stub function to use based on calling convention
String stubFunction;
if (callingConvention != null && callingConvention.equals("__stdcall")) {
stubFunction = "gh_stub_impl_stdcall";
} else {
// Default to cdecl for most cases
stubFunction = "gh_stub_impl_cdecl";
}
// Generate parameter list for the call
StringBuilder paramList = new StringBuilder();
var params = externalFunction.getParameters();
for (int i = 0; i < params.length; i++) {
if (i > 0) paramList.append(", ");
paramList.append(params[i].getName());
}
// Generate the stub call
if (returnType.equals("void")) {
writer2.println(" " + stubFunction + "<void>((void*)0x" +
externalFunction.getEntryPoint().toString().replace("0x", "") +
(paramList.length() > 0 ? ", " + paramList.toString() : "") + ");");
} else {
writer2.println(" return " + stubFunction + "<" + returnType + ">((void*)0x" +
externalFunction.getEntryPoint().toString().replace("0x", "") +
(paramList.length() > 0 ? ", " + paramList.toString() : "") + ");");
}
writer2.println("}");
}