using System;
using System.Linq;


using CPU = Indy.IL2CPU.Assembler.X86;
using Indy.IL2CPU.Assembler;

namespace Indy.IL2CPU.IL.X86 {
	[OpCode(OpCodeEnum.Ldarga)]
	public class Ldarga: Op {
		private string mAddress;
		protected void SetArgIndex(int aIndex, MethodInformation aMethodInfo) {
			mAddress = aMethodInfo.Arguments[aIndex].VirtualAddresses.First();
		}
		public Ldarga(MethodInformation aMethodInfo, int aIndex)
			: base(null, aMethodInfo) {
			SetArgIndex(aIndex, aMethodInfo);
		}

		public Ldarga(ILReader aReader, MethodInformation aMethodInfo)
			: base(aReader, aMethodInfo) {
			if (aReader != null) {
				SetArgIndex(aReader.OperandValueInt32, aMethodInfo);
				//ParameterDefinition xParam = aReader.Operand as ParameterDefinition;
				//if (xParam != null) {
				//    SetArgIndex(xParam.Sequence - 1, aMethodInfo);
				//}
			}
		}
		public override void DoAssemble() {
			string[] mAddressParts = mAddress.Split('+');
			new CPU.Pushd(mAddressParts[0]);
			Assembler.StackContents.Push(new StackContent(4, typeof(uint)));
			new CPU.Pushd(mAddressParts[1]);
			Assembler.StackContents.Push(new StackContent(4, typeof(uint)));
			Add(Assembler);
		}
	}
}