Skip to content

Commit

Permalink
Refactor the RelocateValueType method
Browse files Browse the repository at this point in the history
  • Loading branch information
liiir1985 committed Apr 3, 2020
1 parent a06efd8 commit 32a3765
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 12 deletions.
9 changes: 1 addition & 8 deletions ILRuntime/Runtime/Intepreter/ILIntepreter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1965,14 +1965,7 @@ public object Run(ILMethod method, object instance, object[] p)
val = Minus(dst, ((CLRType)ft).FieldIndexMapping[(int)ip->TokenLong] + 1);
if (val->ObjectType == ObjectTypes.ValueTypeObjectReference && ret->ObjectType == ObjectTypes.ValueTypeObjectReference)
{
int start = int.MaxValue;
int end = int.MaxValue;
objRef2 = dst;
stack.CountValueTypeManaged(ret, ref start, ref end, &objRef2);
stack.RelocateValueType(val, ref dst, ref start);
stack.ValueTypeStackPointer = dst;
if (start <= end)
stack.RemoveManagedStackRange(start, end);
stack.RelocateValueTypeAndFreeAfterDst(val, ret);
}
else
{
Expand Down
21 changes: 17 additions & 4 deletions ILRuntime/Runtime/Stack/RuntimeStack.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public StackObject* ValueTypeStackPointer
{
return valueTypePtr;
}
set
private set
{
if (value > ValueTypeStackBase)
throw new StackOverflowException();
Expand Down Expand Up @@ -145,7 +145,20 @@ public void PushFrame(ref StackFrame frame)
return ret;
}

public void RelocateValueType(StackObject* src, ref StackObject* dst, ref int mStackBase)
public void RelocateValueTypeAndFreeAfterDst(StackObject* src, StackObject* dst)
{
dst = ILIntepreter.ResolveReference(dst);
int start = int.MaxValue;
int end = int.MaxValue;
var objRef2 = dst;
CountValueTypeManaged(dst, ref start, ref end, &objRef2);
RelocateValueType(src, ref dst, ref start);
ValueTypeStackPointer = dst;
if (start <= end)
RemoveManagedStackRange(start, end);
}

void RelocateValueType(StackObject* src, ref StackObject* dst, ref int mStackBase)
{
StackObject* descriptor = ILIntepreter.ResolveReference(src);
if (descriptor > dst)
Expand Down Expand Up @@ -351,7 +364,7 @@ public void ClearValueTypeObject(IType type, StackObject* ptr)
}
}

public void RemoveManagedStackRange(int start, int end)
void RemoveManagedStackRange(int start, int end)
{
if (start != int.MaxValue)
{
Expand Down Expand Up @@ -384,7 +397,7 @@ public void FreeValueTypeObject(StackObject* esp)
RemoveManagedStackRange(start, end);
}

public void CountValueTypeManaged(StackObject* esp, ref int start, ref int end, StackObject** endAddr)
void CountValueTypeManaged(StackObject* esp, ref int start, ref int end, StackObject** endAddr)
{
StackObject* descriptor = ILIntepreter.ResolveReference(esp);
int cnt = descriptor->ValueLow;
Expand Down

0 comments on commit 32a3765

Please sign in to comment.