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); }
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++; } }
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); } }