mirror of
https://github.com/Ryujinx/Opentk.git
synced 2025-06-21 17:07:49 +00:00
Implemented string return types
This commit is contained in:
parent
ac65eb7b09
commit
daf5b828c9
|
@ -44,6 +44,8 @@ namespace OpenTK.Rewrite
|
||||||
program.Rewrite(file, key);
|
program.Rewrite(file, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static AssemblyDefinition mscorlib;
|
||||||
|
|
||||||
void Rewrite(string file, string keyfile)
|
void Rewrite(string file, string keyfile)
|
||||||
{
|
{
|
||||||
// Specify assembly read and write parameters
|
// Specify assembly read and write parameters
|
||||||
|
@ -87,17 +89,27 @@ namespace OpenTK.Rewrite
|
||||||
{
|
{
|
||||||
foreach (var module in assembly.Modules)
|
foreach (var module in assembly.Modules)
|
||||||
{
|
{
|
||||||
if (rewritten == null)
|
foreach (var reference in module.AssemblyReferences)
|
||||||
{
|
{
|
||||||
foreach (var reference in module.AssemblyReferences)
|
var resolved = module.AssemblyResolver.Resolve(reference);
|
||||||
|
if (reference.Name == "mscorlib")
|
||||||
{
|
{
|
||||||
module.AssemblyResolver.Resolve(reference);
|
mscorlib = resolved;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var type in module.Types)
|
if (mscorlib == null)
|
||||||
{
|
{
|
||||||
Rewrite(type);
|
Console.Error.WriteLine("Falied to locate mscorlib");
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var module in assembly.Modules)
|
||||||
|
{
|
||||||
|
foreach (var type in module.Types)
|
||||||
|
{
|
||||||
|
Rewrite(type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -138,8 +150,8 @@ namespace OpenTK.Rewrite
|
||||||
ProcessMethod(wrapper, signature, slot, entry_points);
|
ProcessMethod(wrapper, signature, slot, entry_points);
|
||||||
}
|
}
|
||||||
|
|
||||||
//RemoveNativeSignatures();
|
RemoveNativeSignatures(type, native_signatures);
|
||||||
//RemoveSupportingAttributes();
|
RemoveSupportingAttributes(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type.Name == "RewrittenAttribute")
|
if (type.Name == "RewrittenAttribute")
|
||||||
|
@ -150,21 +162,41 @@ namespace OpenTK.Rewrite
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RemoveNativeSignatures(TypeDefinition type, List<MethodDefinition> methods)
|
||||||
|
{
|
||||||
|
while (methods.Count > 0)
|
||||||
|
{
|
||||||
|
type.Methods.Remove(methods.Last());
|
||||||
|
methods.RemoveAt(methods.Count - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveSupportingAttributes(TypeDefinition type)
|
||||||
|
{
|
||||||
|
foreach (var method in type.Methods)
|
||||||
|
{
|
||||||
|
var attr = method.CustomAttributes;
|
||||||
|
for (int i = 0; i < attr.Count; i++)
|
||||||
|
{
|
||||||
|
if (attr[i].AttributeType.Name == "AutoGeneratedAttribute")
|
||||||
|
{
|
||||||
|
attr.RemoveAt(i);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create body for method
|
// Create body for method
|
||||||
static void ProcessMethod(MethodDefinition wrapper, MethodDefinition native, int slot, FieldDefinition entry_points)
|
static void ProcessMethod(MethodDefinition wrapper, MethodDefinition native, int slot, FieldDefinition entry_points)
|
||||||
{
|
{
|
||||||
var nint = wrapper.DeclaringType.Module.Import(typeof(IntPtr));
|
var nint = wrapper.DeclaringType.Module.Import(mscorlib.MainModule.GetType("System.IntPtr"));
|
||||||
//var nint = new TypeReference("System", "IntPtr", wrapper.DeclaringType.Module, null);
|
//var nint = new TypeReference("System", "IntPtr", wrapper.DeclaringType.Module, null);
|
||||||
var body = wrapper.Body;
|
var body = wrapper.Body;
|
||||||
var il = body.GetILProcessor();
|
var il = body.GetILProcessor();
|
||||||
var instructions = body.Instructions;
|
var instructions = body.Instructions;
|
||||||
instructions.Clear();
|
instructions.Clear();
|
||||||
|
|
||||||
if (wrapper.ReturnType != native.ReturnType)
|
|
||||||
{
|
|
||||||
Console.Error.WriteLine("Return type wrappers not implemented yet ({0})", native.Name);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Declare pinned variables for every reference and array parameter
|
// Declare pinned variables for every reference and array parameter
|
||||||
// and push each parameter on the stack
|
// and push each parameter on the stack
|
||||||
EmitParameters(wrapper, nint, body, il);
|
EmitParameters(wrapper, nint, body, il);
|
||||||
|
@ -233,7 +265,33 @@ namespace OpenTK.Rewrite
|
||||||
}
|
}
|
||||||
else if (wrapper.ReturnType != native.ReturnType)
|
else if (wrapper.ReturnType != native.ReturnType)
|
||||||
{
|
{
|
||||||
Console.Error.WriteLine("Return wrappers not implemented yet ({0})", native.Name);
|
if (wrapper.ReturnType.Name == "String")
|
||||||
|
{
|
||||||
|
// String return-type wrapper
|
||||||
|
// return new string((sbyte*)((void*)GetString()));
|
||||||
|
|
||||||
|
var intptr_to_voidpointer = wrapper.Module.Import(typeof(IntPtr).GetMethods()
|
||||||
|
.First(m =>
|
||||||
|
{
|
||||||
|
return
|
||||||
|
m.Name == "op_Explicit" &&
|
||||||
|
m.ReturnType.Name == "Void*";
|
||||||
|
}));
|
||||||
|
|
||||||
|
var string_constructor = wrapper.Module.Import(typeof(string).GetConstructors()
|
||||||
|
.First(m =>
|
||||||
|
{
|
||||||
|
var p = m.GetParameters();
|
||||||
|
return p.Length > 0 && p[0].ParameterType.Name == "SByte*";
|
||||||
|
}));
|
||||||
|
|
||||||
|
il.Emit(OpCodes.Call, intptr_to_voidpointer);
|
||||||
|
il.Emit(OpCodes.Newobj, string_constructor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine("Return wrappers not implemented yet ({0})", native.Name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue