AssemblyData has now been ported

This commit is contained in:
de4dot 2012-11-01 07:34:40 +01:00
parent 8d87fa02bc
commit 4fc663ce8c
6 changed files with 32 additions and 39 deletions

View File

@ -130,7 +130,8 @@ namespace AssemblyData.methodsrewriter {
if (resolver != null) if (resolver != null)
return resolver.type; return resolver.type;
if (typeRef.IsGenericParameter) var ts = typeRef as TypeSpec;
if (ts != null && ts.TypeSig is GenericSig)
return typeof(MGenericParameter); return typeof(MGenericParameter);
return null; return null;

View File

@ -178,8 +178,8 @@ namespace AssemblyData.methodsrewriter {
void initLocals() { void initLocals() {
locals = new List<LocalBuilder>(); locals = new List<LocalBuilder>();
foreach (var local in methodInfo.methodDef.CilBody.Variables) foreach (var local in methodInfo.methodDef.CilBody.LocalList)
locals.Add(ilg.DeclareLocal(Resolver.getRtType(local.VariableType), local.IsPinned)); locals.Add(ilg.DeclareLocal(Resolver.getRtType(local.Type), local.Type.IsPinned));
tempObjLocal = ilg.DeclareLocal(typeof(object)); tempObjLocal = ilg.DeclareLocal(typeof(object));
tempObjArrayLocal = ilg.DeclareLocal(typeof(object[])); tempObjArrayLocal = ilg.DeclareLocal(typeof(object[]));
} }
@ -256,14 +256,6 @@ namespace AssemblyData.methodsrewriter {
return labels; return labels;
} }
int getArgIndex(Parameter arg) {
return arg.Index;
}
int getLocalIndex(Local local) {
return local.Index;
}
void writeInstr(Instruction instr) { void writeInstr(Instruction instr) {
var opcode = convertOpCode(instr.OpCode); var opcode = convertOpCode(instr.OpCode);
switch (instr.OpCode.OperandType) { switch (instr.OpCode.OperandType) {
@ -324,20 +316,12 @@ namespace AssemblyData.methodsrewriter {
throw new ApplicationException(string.Format("Unknown type: {0}", (obj == null ? obj : obj.GetType()))); throw new ApplicationException(string.Format("Unknown type: {0}", (obj == null ? obj : obj.GetType())));
break; break;
case OperandType.InlineArg:
ilg.Emit(opcode, checked((short)getArgIndex((Parameter)instr.Operand)));
break;
case OperandType.ShortInlineArg:
ilg.Emit(opcode, checked((byte)getArgIndex((Parameter)instr.Operand)));
break;
case OperandType.InlineVar: case OperandType.InlineVar:
ilg.Emit(opcode, checked((short)getLocalIndex((Local)instr.Operand))); ilg.Emit(opcode, checked((short)((IVariable)instr.Operand).Number));
break; break;
case OperandType.ShortInlineVar: case OperandType.ShortInlineVar:
ilg.Emit(opcode, checked((byte)getLocalIndex((Local)instr.Operand))); ilg.Emit(opcode, checked((byte)((IVariable)instr.Operand).Number));
break; break;
case OperandType.InlineSig: //TODO: case OperandType.InlineSig: //TODO:

View File

@ -58,7 +58,7 @@ namespace AssemblyData.methodsrewriter {
} }
} }
public MType getType(ITypeDefOrRef typeRef) { public MType getType(IType typeRef) {
return typeReferenceToType.find(typeRef); return typeReferenceToType.find(typeRef);
} }

View File

@ -64,7 +64,7 @@ namespace AssemblyData.methodsrewriter {
return null; return null;
} }
public static MType getType(ITypeDefOrRef typeRef) { public static MType getType(IType typeRef) {
if (typeRef == null) if (typeRef == null)
return null; return null;
var module = getModule(typeRef.Scope); var module = getModule(typeRef.Scope);
@ -104,7 +104,7 @@ namespace AssemblyData.methodsrewriter {
throw new ApplicationException(string.Format("Unknown MemberReference: {0}", memberRef)); throw new ApplicationException(string.Format("Unknown MemberReference: {0}", memberRef));
} }
public static Type getRtType(ITypeDefOrRef typeRef) { public static Type getRtType(IType typeRef) {
var mtype = getType(typeRef); var mtype = getType(typeRef);
if (mtype != null) if (mtype != null)
return mtype.type; return mtype.type;
@ -139,12 +139,14 @@ namespace AssemblyData.methodsrewriter {
static Type resolve(IType typeRef) { static Type resolve(IType typeRef) {
if (typeRef == null) if (typeRef == null)
return null; return null;
var elemType = typeRef.GetElementType(); var scopeType = typeRef.ScopeType;
var resolver = getAssemblyResolver(elemType); var resolver = getAssemblyResolver(scopeType);
var resolvedType = resolver.resolve(elemType); var resolvedType = resolver.resolve(scopeType);
if (resolvedType != null) if (resolvedType != null)
return fixType(typeRef, resolvedType); return fixType(typeRef, resolvedType);
throw new ApplicationException(string.Format("Could not resolve type {0} ({1:X8}) in assembly {2}", typeRef, typeRef.MDToken.Raw, resolver)); var tdr = typeRef as ITypeDefOrRef;
uint token = tdr == null ? 0 : tdr.MDToken.Raw;
throw new ApplicationException(string.Format("Could not resolve type {0} ({1:X8}) in assembly {2}", typeRef, token, resolver));
} }
static FieldInfo resolve(IField fieldRef) { static FieldInfo resolve(IField fieldRef) {
@ -167,11 +169,13 @@ namespace AssemblyData.methodsrewriter {
throw new ApplicationException(string.Format("Could not resolve method {0} ({1:X8}) in assembly {2}", methodRef, methodRef.MDToken.Raw, resolver)); throw new ApplicationException(string.Format("Could not resolve method {0} ({1:X8}) in assembly {2}", methodRef, methodRef.MDToken.Raw, resolver));
} }
static Type fixType(ITypeDefOrRef typeRef, Type type) { static Type fixType(IType typeRef, Type type) {
var ts = typeRef as TypeSpec; var sig = typeRef as TypeSig;
if (ts == null) if (sig != null) {
return type; var ts = typeRef as TypeSpec;
var sig = ts.TypeSig; if (ts != null)
sig = ts.TypeSig;
}
while (sig != null) { while (sig != null) {
switch (sig.ElementType) { switch (sig.ElementType) {
case ElementType.SZArray: case ElementType.SZArray:

View File

@ -37,12 +37,14 @@ namespace AssemblyData.methodsrewriter {
initFields(); initFields();
List<FieldInfo> list; List<FieldInfo> list;
if (!fields.TryGetValue(fieldRef.Name, out list)) if (!fields.TryGetValue(fieldRef.Name.String, out list))
return null; return null;
var git = fieldRef.DeclaringType.ToGenericInstSig(); var git = fieldRef.DeclaringType.ToGenericInstSig();
if (git != null) if (git != null) {
fieldRef = FieldReferenceInstance.make(fieldRef, git); //TODO: Replace all generic params with generic args and create a new field ref
fieldRef = null;
}
foreach (var field in list) { foreach (var field in list) {
if (ResolverUtils.compareFields(field, fieldRef)) if (ResolverUtils.compareFields(field, fieldRef))
@ -70,12 +72,14 @@ namespace AssemblyData.methodsrewriter {
initMethods(); initMethods();
List<MethodBase> list; List<MethodBase> list;
if (!methods.TryGetValue(methodRef.Name, out list)) if (!methods.TryGetValue(methodRef.Name.String, out list))
return null; return null;
var git = methodRef.DeclaringType.ToGenericInstSig(); var git = methodRef.DeclaringType.ToGenericInstSig();
var gim = methodRef as MethodSpec; var gim = methodRef as MethodSpec;
methodRef = MethodReferenceInstance.make(methodRef, git, gim); if (git != null && gim != null) {
//TODO: Create a new method ref with all generic params replaced with generic args
}
foreach (var method in list) { foreach (var method in list) {
if (ResolverUtils.compareMethods(method, methodRef)) if (ResolverUtils.compareMethods(method, methodRef))

2
dot10

@ -1 +1 @@
Subproject commit 5df20e544a7b220b3155dfc00c23c72362915806 Subproject commit 709b4cce8000c50f969dcb2636637a8840fcb4e8