Exemplo n.º 1
0
        public CilBody ToCilBody(bool forceRebuild = false)
        {
            if (Result != null && !forceRebuild)
            {
                return(Result);
            }

            _position = 0;

            // Locals
            var newLocals = new List <Local>();

            foreach (var local in _locals)
            {
                newLocals.Add(new Local(_memberConverter.ImportAsOsuModuleType(local.LocalType).ToTypeSig(), "", local.LocalIndex));
            }

            // Parameters
            var newParameters = new List <Parameter>();

            foreach (var param in _parameters)
            {
                newParameters.Add(new Parameter(param.Position, _memberConverter.ImportAsOsuModuleType(param.ParameterType).ToTypeSig()));
            }

            // Instrs
            var newInstrs = ConvertBytesToInstructions(newLocals, newParameters);

            // Handlers
            var newHandlers = new List <ExceptionHandler>();

            foreach (var handler in _handlers)
            {
                var newHandler = new ExceptionHandler((ExceptionHandlerType)handler.Flags);

                if (handler.Flags == ExceptionHandlingClauseOptions.Clause)
                {
                    newHandler.CatchType = _memberConverter.ImportAsOsuModuleType(handler.CatchType);
                }

                if ((handler.Flags & ExceptionHandlingClauseOptions.Filter) != 0)
                {
                    newHandler.FilterStart = newInstrs[(uint)handler.FilterOffset];
                }

                newHandler.HandlerStart = newInstrs[(uint)handler.HandlerOffset];
                newHandler.HandlerEnd   = newInstrs[(uint)(handler.HandlerOffset + handler.HandlerLength)];
                newHandler.TryStart     = newInstrs[(uint)handler.TryOffset];
                newHandler.TryEnd       = newInstrs[(uint)(handler.TryOffset + handler.TryLength)];
                newHandler.HandlerType  = (ExceptionHandlerType)handler.Flags;

                newHandlers.Add(newHandler);
            }

            return(Result = new CilBody(_initLocals, newInstrs.Values.ToList(), newHandlers, newLocals));
        }
Exemplo n.º 2
0
        public MethodDefUser ToMethodDef(bool forceBodyRebuild = false)
        {
            var newMethodDef = new MethodDefUser(_name, _methodSig, MethodImplAttributes.IL | MethodImplAttributes.Managed);

            newMethodDef.Body = _bodyConverter.ToCilBody(forceBodyRebuild);

            var idx = _hasThis ? 1 : 0;

            for (int i = idx; i < _parameters.Count; i++)
            {
                newMethodDef.ParamDefs.Add(new ParamDefUser(_parameters[i].Name, (ushort)(i + (idx ^ 1)), (ParamAttributes)_parameters[i].Attributes));
            }

            newMethodDef.ReturnType = _memberConverter.ImportAsOsuModuleType(_returnType).ToTypeSig();
            return(newMethodDef);
        }