Beispiel #1
0
        InterMethod IResolver.Resolve(MethodReference methodRef, List <InterGenericArgument> genericArgs)
        {
            InterMethod founded = null;
            InterMethod tmp     = new InterMethod(methodRef, genericArgs, this, M => founded = M);

            if (founded == null)
            {
                Messages.Verbose("Adding method {0} to compile...", tmp.ToString());
                tmp.DeclaringType.Methods.Add(tmp);
                founded = tmp;

                var unionedGenericArgs = tmp.FullGenericArguments;

                if (tmp.HasBody)
                {
                    MethodDefinition methodDef = tmp.Body.Method;

                    ILAstBuilder builder = new ILAstBuilder();
                    ILBlock      ilBody  = new ILBlock();

                    DecompilerContext context = new DecompilerContext(methodDef.Module)
                    {
                        CurrentType = methodDef.DeclaringType, CurrentMethod = methodDef
                    };
                    Utils.SetDecompillerSettings(context.Settings);

                    ilBody.Body = builder.Build(methodDef, true, context);
                    new ILAstOptimizer().Optimize(context, ilBody);
                    ProcessMethodDecencies(tmp, ilBody, tmp.FullGenericArguments);
                }
            }

            return(founded);
        }
Beispiel #2
0
        private Method CompileMethod(InterMethod method)
        {
            Messages.Verbose("    Compiling method {0}...", method.ToString());
            Method result = new Method();

            if (method.IsPublic)
            {
                result.AccessFlags |= MethodAccessFlags.Public;
            }
            else if (method.IsProtected)
            {
                result.AccessFlags |= MethodAccessFlags.Protected;
            }
            else
            {
                result.AccessFlags |= MethodAccessFlags.Private;
            }

            if (method.IsAbstract)
            {
                result.AccessFlags |= MethodAccessFlags.Abstract;
            }
            if ((method.IsFinal) || ((!method.IsVirtual) && (!method.IsConstructor)) && (!method.IsStatic))
            {
                result.AccessFlags |= MethodAccessFlags.Final;
            }
            if (method.IsStatic)
            {
                result.AccessFlags |= MethodAccessFlags.Static;
            }
            if (method.IsSynchronized)
            {
                result.AccessFlags |= MethodAccessFlags.Synchronized;
            }
            if ((method.IsPrivate) && (method.IsVirtual))
            {
                Messages.Message(MessageCode.MethodPrivateAndVirtual, method.ToString());
            }
            if (method.IsVarArg)
            {
                result.AccessFlags |= MethodAccessFlags.VarArgs;
            }

            result.Name       = MethodNameToJava(method.NewName);
            result.Descriptor = GetMethodDescriptor(method);

            if (method.HasBody)
            {
                CodeCompiler codeCompiler = new CodeCompiler(this, this, this, method, currentJavaClass.ConstantPool);
                codeCompiler.Compile();
                result.Attributes.Add(codeCompiler.Result);

                if (Program.Debug)
                {
                    string sourceFileName = codeCompiler.SourceFile;
                    if (sourceFileName != null)
                    {
                        sourceFileNameCounter.Add(sourceFileName);
                    }
                }
            }

            if ((method.IsStatic) && (method.IsConstructor))
            {
                result.AccessFlags = MethodAccessFlags.Static;
            }

            return(result);
        }