Update stub dumping routines
This commit is contained in:
parent
e19a123b94
commit
5ce1a399b1
|
@ -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("}");
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue