MemberReference ReplaceMemberRef(MemberReference m) { if (m is MethodReference) { // Every instruction is only process once, so nothing should be resolved //Debug.Assert(!(m is MethodDefinition)); var reference = (m as MethodReference); var declatingType = AddAndResolveType(reference.DeclaringType); var parameters = reference.Parameters.Select(x => AddAndResolveType(x.ParameterType).Name); if (declatingType != null) { try { return(m_resolver.GetMethodReference(declatingType, reference.Name, parameters)); } catch { } } } if (m is FieldReference) { var reference = m as FieldReference; var resolved = AddAndResolveType(reference.DeclaringType); if (resolved != null) { return(m_resolver.GetField(resolved.FullName, reference.Name)); } } return(m); }
public void RethrowCallException(MethodDefinition m, VariableDefinition exceptionVariable) { if (!m.HasBody) { return; } var ilp = m.Body.GetILProcessor(); for (int idx = 0; idx < m.Body.Instructions.Count; idx++) { var i = m.Body.Instructions[idx]; var next = i.Next; if (i.OpCode != OpCodes.Call && i.OpCode != OpCodes.Callvirt) { continue; } var target = (i.Operand as MethodReference).Resolve(); if (!m_helper.CanThrow(target)) { continue; } // load exception var fieldref = m_resolver.GetField("ESharp.EException", "S_EException_LastException"); ilp.InsertBefore(next, ilp.Create(OpCodes.Ldsfld, fieldref)); ilp.InsertBefore(next, ilp.Create(OpCodes.Stloc, exceptionVariable)); //clear global variable S_EException_LastException ilp.InsertBefore(next, ilp.Create(OpCodes.Ldnull)); ilp.InsertBefore(next, ilp.Create(OpCodes.Stsfld, fieldref)); // throw exception if != null var after = ilp.Create(OpCodes.Nop); ilp.InsertBefore(next, ilp.Create(OpCodes.Ldloc, exceptionVariable)); ilp.InsertBefore(next, ilp.Create(OpCodes.Brfalse, after)); ilp.InsertBefore(next, ilp.Create(OpCodes.Throw)); ilp.InsertBefore(next, after); } }