コード例 #1
0
ファイル: ILImporter.cs プロジェクト: drcjt/CSharp-80
        private int GrabTemp(StackValueKind kind, int?exactSize)
        {
            var temp = new LocalVariableDescriptor()
            {
                IsParameter = false,
                IsTemp      = true,
                Kind        = kind,
                ExactSize   = exactSize ?? 0,
            };

            _localVariableTable.Add(temp);

            return(_localVariableTable.Count - 1);
        }
コード例 #2
0
ファイル: MethodCompiler.cs プロジェクト: drcjt/CSharp-80
        private void InitReturnBufferArg(TypeSig returnType, bool hasThis)
        {
            if (returnType.IsStruct())
            {
                var returnBuffer = new LocalVariableDescriptor()
                {
                    IsParameter = true,
                    Kind        = StackValueKind.ByRef,
                    IsTemp      = false,
                    ExactSize   = TypeList.GetExactSize(StackValueKind.ByRef),
                };

                // Ensure return buffer parameter goes after the this parameter if present
                _returnBufferArgIndex = hasThis ? 1 : 0;
                _localVariableTable.Insert(_returnBufferArgIndex.Value, returnBuffer);

                _parameterCount++;
            }
        }
コード例 #3
0
ファイル: MethodCompiler.cs プロジェクト: drcjt/CSharp-80
        private void SetupLocalVariableTable(MethodDef method)
        {
            var body = method.MethodBody as CilBody;

            // Setup local variable table - includes parameters as well as locals in method
            for (int parameterIndex = 0; parameterIndex < method.Parameters.Count; parameterIndex++)
            {
                var kind  = method.Parameters[parameterIndex].Type.GetStackValueKind();
                var local = new LocalVariableDescriptor()
                {
                    IsParameter = true,
                    Kind        = kind,
                    IsTemp      = false,
                    Name        = method.Parameters[parameterIndex].Name,
                    ExactSize   = method.Parameters[parameterIndex].Type.GetExactSize(),
                };
                _localVariableTable.Add(local);
            }

            if (body != null)
            {
                for (int variableIndex = 0; variableIndex < body.Variables.Count; variableIndex++)
                {
                    var kind  = body.Variables[variableIndex].Type.GetStackValueKind();
                    var local = new LocalVariableDescriptor()
                    {
                        IsParameter = false,
                        Kind        = kind,
                        IsTemp      = false,
                        Name        = body.Variables[variableIndex].Name,
                        ExactSize   = body.Variables[variableIndex].Type.GetExactSize(),
                    };
                    _localVariableTable.Add(local);
                }
            }

            if (method.HasReturnType)
            {
                var returnType = method.ReturnType;
                InitReturnBufferArg(returnType, method.HasThis);
            }
        }