Skip to content

Commit

Permalink
Object pointer size is bumped up to 8. First the actual data pointer,…
Browse files Browse the repository at this point in the history
… then the pointer to the next object pointer
  • Loading branch information
mterwoord committed Jun 18, 2016
1 parent 030ba36 commit 6ea1ca7
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 25 deletions.
22 changes: 10 additions & 12 deletions source/Cosmos.IL2CPU/AppAssembler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -878,7 +878,7 @@ protected void Ldsflda(MethodInfo aMethod, FieldInfo aFieldInfo)

protected int GetVTableEntrySize()
{
return 16; // todo: retrieve from actual type info
return 24; // todo: retrieve from actual type info
}

public const string InitVMTCodeLabel = "___INIT__VMT__CODE____";
Expand Down Expand Up @@ -912,9 +912,8 @@ public virtual void GenerateVMTCode(HashSet<Type> aTypesSet, HashSet<MethodBase>
Array.Copy(xTemp, 0, xData, 8, 4);
xTemp = BitConverter.GetBytes(GetVTableEntrySize());
Array.Copy(xTemp, 0, xData, 12, 4);
Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember(xTheName + "__Contents", xData));
Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember(xTheName + "__Handle", ElementReference.New(xTheName + "__Contents")));
Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember(xTheName, ElementReference.New(xTheName + "__Handle")));
XS.DataMemberBytes(xTheName + "__Contents", xData);
XS.DataMember(xTheName, 2, "dd", xTheName + "__Contents,0");
#if VMT_DEBUG
using (var xVmtDebugOutput = XmlWriter.Create(@"vmt_debug.xml"))
{
Expand Down Expand Up @@ -1034,8 +1033,7 @@ public virtual void GenerateVMTCode(HashSet<Type> aTypesSet, HashSet<MethodBase>
{
Push(aGetTypeID(xType));
Move("VMT__TYPE_ID_HOLDER__" + DataMember.FilterStringForIncorrectChars(LabelName.GetFullName(xType) + " ASM_IS__" + xType.Assembly.GetName().Name), (int)aGetTypeID(xType));
Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(
new DataMember("VMT__TYPE_ID_HOLDER__" + DataMember.FilterStringForIncorrectChars(LabelName.GetFullName(xType) + " ASM_IS__" + xType.Assembly.GetName().Name), new int[] { (int)aGetTypeID(xType) }));
XS.DataMember("VMT__TYPE_ID_HOLDER__" + DataMember.FilterStringForIncorrectChars(LabelName.GetFullName(xType) + " ASM_IS__" + xType.Assembly.GetName().Name), aGetTypeID(xType) );
Push((uint)xBaseIndex.Value);
xData = new byte[16 + (xEmittedMethods.Count * 4)];
xTemp = BitConverter.GetBytes(aGetTypeID(typeof(Array)));
Expand All @@ -1048,12 +1046,12 @@ public virtual void GenerateVMTCode(HashSet<Type> aTypesSet, HashSet<MethodBase>
Array.Copy(xTemp, 0, xData, 12, 4);
string xDataName = "____SYSTEM____TYPE___" + DataMember.FilterStringForIncorrectChars(LabelName.GetFullName(xType) + " ASM_IS__" + xType.Assembly.GetName().Name) + "__MethodIndexesArray";
Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember(xDataName, xData));
Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember(xDataName + "_Handle", ElementReference.New(xDataName)));
Push(xDataName + "_Handle");
Push(0);
Push(xDataName);
xDataName = "____SYSTEM____TYPE___" + DataMember.FilterStringForIncorrectChars(LabelName.GetFullName(xType) + " ASM_IS__" + xType.Assembly.GetName().Name) + "__MethodAddressesArray";
Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember(xDataName, xData));
Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember(xDataName + "_Handle", ElementReference.New(xDataName)));
Push(xDataName + "_Handle");
Push(0);
Push(xDataName);
xData = new byte[16 + Encoding.Unicode.GetByteCount(xType.FullName + ", " + xType.Module.Assembly.GetName().FullName)];
xTemp = BitConverter.GetBytes(aGetTypeID(typeof(Array)));
Array.Copy(xTemp, 0, xData, 0, 4);
Expand All @@ -1065,7 +1063,6 @@ public virtual void GenerateVMTCode(HashSet<Type> aTypesSet, HashSet<MethodBase>
Array.Copy(xTemp, 0, xData, 12, 4);
xDataName = "____SYSTEM____TYPE___" + DataMember.FilterStringForIncorrectChars(LabelName.GetFullName(xType) + " ASM_IS__" + xType.Assembly.GetName().Name);
Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember(xDataName, xData));
Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember(xDataName + "_Handle", ElementReference.New(xDataName)));
Push("0" + xEmittedMethods.Count.ToString("X") + "h");
Call(xSetTypeInfoRef);
}
Expand Down Expand Up @@ -1121,7 +1118,7 @@ public virtual void GenerateVMTCode(HashSet<Type> aTypesSet, HashSet<MethodBase>
Push((uint)xMethodId);
if (xMethod.IsAbstract)
{
// abstract methods dont have bodies, oiw, are not emitted
// abstract methods dont have bodies, iow, are not emitted
Push(0);
}
else
Expand Down Expand Up @@ -1492,6 +1489,7 @@ protected void BeforeOp(MethodInfo aMethod, ILOpCode aOpCode, bool emitInt3NotNo
XS.Push(EAX);
XS.Push(EBX);
XS.Call("DebugStub_SendSimpleNumber");
XS.Add(ESP, 4);
XS.Call("DebugStub_SendSimpleNumber");

XS.ClearInterruptFlag();
Expand Down
21 changes: 12 additions & 9 deletions source/Cosmos.IL2CPU/IL/Ldelema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Cosmos.IL2CPU.ILOpCodes;
using Cosmos.IL2CPU.Plugs.System;
using XSharp.Compiler;
using static XSharp.Compiler.XSRegisters;

namespace Cosmos.IL2CPU.X86.IL
{
Expand All @@ -23,23 +24,25 @@ public static void Assemble(Cosmos.Assembler.Assembler aAssembler, OpType aOpTyp

DoNullReferenceCheck(aAssembler, debugEnabled, 4);
// calculate element offset into array memory (including header)
XS.Pop(XSRegisters.EAX);
XS.Set(XSRegisters.EDX, aElementSize);
XS.Multiply(XSRegisters.EDX);
XS.Add(XSRegisters.EAX, (uint)(ObjectImpl.FieldDataOffset + 4));
XS.Pop(EAX);
XS.Pop(EDX);
XS.Set(EDX, aElementSize);
//XS.Add(ESP, 4);
XS.Multiply(EDX);
XS.Add(EAX, (uint)(ObjectImpl.FieldDataOffset + 4));

// pop the array now
XS.Pop(XSRegisters.EDX);
XS.Pop(EDX);
// translate it to actual memory
XS.Set(XSRegisters.EDX, XSRegisters.EDX, sourceIsIndirect: true);
XS.Set(EDX, EDX, sourceIsIndirect: true);

if (aOpType.StackPopTypes.Last().GetElementType().IsClass)
{
XS.Set(XSRegisters.EDX, XSRegisters.EDX, sourceIsIndirect: true);
XS.Set(EDX, EDX, sourceIsIndirect: true);
}

XS.Add(XSRegisters.EDX, XSRegisters.EAX);
XS.Push(XSRegisters.EDX);
XS.Add(EDX, EAX);
XS.Push(EDX);
}

public override void Execute(MethodInfo aMethod, ILOpCode aOpCode)
Expand Down
6 changes: 5 additions & 1 deletion source/Cosmos.IL2CPU/ILOp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,14 @@ public static uint SizeOfType(Type aType) {
{
throw new ArgumentNullException("aType");
}
if (aType.IsPointer)
{
return 4;
}
if (aType.FullName == "System.Void") {
return 0;
} else if ((!aType.IsValueType && aType.IsClass) || aType.IsInterface) {
return 4;
return 8;
}
if (aType.IsByRef) {
return 4;
Expand Down
5 changes: 2 additions & 3 deletions source/Cosmos.IL2CPU/VTablesImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ public static bool IsInstance(uint aObjectType, uint aDesiredObjectType)

public static void SetTypeInfo(int aType, uint aBaseType, int[] aMethodIndexes, int[] aMethodAddresses, int aMethodCount)
{
//mTypes[aType] = new VTable();
mTypes[aType].BaseTypeIdentifier = aBaseType;
mTypes[aType].MethodIndexes = aMethodIndexes;
mTypes[aType].MethodAddresses = aMethodAddresses;
Expand Down Expand Up @@ -133,7 +132,7 @@ public static int GetMethodAddressForType(uint aType, uint aMethodId)
}
}

[StructLayout(LayoutKind.Explicit, Size = 16)]
[StructLayout(LayoutKind.Explicit, Size = 24)]
public struct VTable
{
[FieldOffset(0)]
Expand All @@ -145,7 +144,7 @@ public struct VTable
[FieldOffset(8)]
public int[] MethodIndexes;

[FieldOffset(12)]
[FieldOffset(16)]
public int[] MethodAddresses;
}
}
5 changes: 5 additions & 0 deletions source/XSharp.Compiler/XS.cs
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,11 @@ public static void DataMember(string name, string value)
Assembler.CurrentInstance.DataMembers.Add(new DataMember(name, value));
}

public static void DataMemberBytes(string name, byte[] value)
{
Assembler.CurrentInstance.DataMembers.Add(new DataMember(name, value));
}

public static void DataMember(string name, uint elementCount, string size, string value)
{
new LiteralAssemblerCode(name + ": TIMES " + elementCount + " " + size + " " + value);
Expand Down

0 comments on commit 6ea1ca7

Please sign in to comment.