Cosmos/source/Indy.IL2CPU.IL.X86/Newobj.cs
2007-10-11 18:04:03 +00:00

49 lines
No EOL
1.7 KiB
C#

using System;
using System.IO;
using Mono.Cecil;
using Mono.Cecil.Cil;
using CPU = Indy.IL2CPU.Assembler;
using CPUx86 = Indy.IL2CPU.Assembler.X86;
using Asm = Indy.IL2CPU.Assembler;
namespace Indy.IL2CPU.IL.X86 {
[OpCode(Code.Newobj, false)]
public class Newobj: Op {
public MethodDefinition CtorDef;
public Newobj()
: base(null, null) {
}
public Newobj(Mono.Cecil.Cil.Instruction aInstruction, MethodInformation aMethodInfo)
: base(aInstruction, aMethodInfo) {
CtorDef = Engine.GetDefinitionFromMethodReference((MethodReference)aInstruction.Operand);
}
public override void DoAssemble() {
Engine.QueueMethodRef(CtorDef);
DoQueueMethod(RuntimeEngineRefs.Heap_AllocNewObjectRef);
int xObjectSize = ObjectUtilities.GetObjectStorageSize(Engine.GetDefinitionFromTypeReference(CtorDef.DeclaringType));
Pushd(4, "0" + xObjectSize.ToString("X").ToUpper() + "h");
Call(new CPU.Label(RuntimeEngineRefs.Heap_AllocNewObjectRef).Name);
Assembler.StackSizes.Pop();
Pushd(4, "eax");
// Move(Assembler, "ecx", "eax");
Pushd(4, "eax");
Move(Assembler, "dword [eax]", "0" + Engine.RegisterTypeRef(CtorDef.DeclaringType).ToString("X") + "h");
Move(Assembler, "dword [eax + 4]", "0" + InstanceTypeEnum.NormalObject.ToString("X") + "h");
//Pushd("ecx");
for (int i = 0; i < CtorDef.Parameters.Count; i++) {
Assembler.Add(new CPUx86.Pushd("[esp + 0x8]"));
}
Call(new CPU.Label(CtorDef).Name);
Pop("eax");
Assembler.StackSizes.Pop();
for (int i = 0; i < CtorDef.Parameters.Count; i++) {
Assembler.Add(new CPUx86.Add("esp", "4"));
Assembler.StackSizes.Pop();
}
Pushd(4, "eax");
//Assembler.Add(new CPUx86.Add("esp", objSize.ToString()));
}
}
}