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);
        }
Exemple #2
0
        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);
            }
        }