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("// with possible manualy fixes");
|
||||||
writer2.println();
|
writer2.println();
|
||||||
writer2.println("#include <r3/binders/auto.h>");
|
writer2.println("#include <r3/binders/auto.h>");
|
||||||
|
writer2.println("#include <r3/binders/stub.h>");
|
||||||
writer2.println("#include <gh_global.h>");
|
writer2.println("#include <gh_global.h>");
|
||||||
writer2.println("#include <stdexcept>");
|
|
||||||
writer2.println();
|
writer2.println();
|
||||||
writer2.println("// " + externalFunction.getEntryPoint());
|
writer2.println("// " + externalFunction.getEntryPoint());
|
||||||
writer2.println("// " + externalFunction.getName());
|
writer2.println("// " + externalFunction.getName());
|
||||||
writer2.println("extern \"C\" " + externalFunction.getSignature().getPrototypeString(false) + " {");
|
|
||||||
writer2.println(" // TODO: Implement this function");
|
// Parse function signature to extract calling convention, return type, and parameters
|
||||||
writer2
|
String signature = externalFunction.getSignature().getPrototypeString(false);
|
||||||
.println(" throw GHStubException(\"Function not implemented: " + externalFunction.getName() + "\");");
|
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("}");
|
writer2.println("}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue