Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions src/cs/Executor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ public record struct ThreadInfoData(int Activator);

public class StackUnderflowException : Exception {}

public enum CallFuncResult {
NextOp,
ReevaluateState,
}

public readonly ref struct ThreadHandle
{
private readonly unsafe Interop.Thread* m_ptr;
Expand Down Expand Up @@ -150,11 +155,16 @@ unsafe static byte GenericCallFunc(void* funcContext, Interop.Thread* thread, ui
var argsSpan = new ReadOnlySpan<uint>(argv, (int)argc);
var args = argsSpan.ToArray();

var result = (byte)(delegateCallFunc.Invoke(new ThreadHandle(thread), args) ? 1 : 0);
var result = delegateCallFunc.Invoke(new ThreadHandle(thread), args) switch
{
CallFuncResult.NextOp => (byte)0,
CallFuncResult.ReevaluateState => (byte)1,
_ => (byte)0,
};
return result;
}

public delegate bool CallFunc(ThreadHandle threadHandle, uint[] args);
public delegate CallFuncResult CallFunc(ThreadHandle threadHandle, uint[] args);
public void AddCodeDataACS0(uint code, string args, uint stackArgC, CallFunc callFunc) {
var argsBytes = (sbyte[]) (Array) Encoding.UTF8.GetBytes(args + "\0");
var argsHandle = AddPinnedHandle(argsBytes);
Expand Down
24 changes: 12 additions & 12 deletions tests/Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public override bool CheckTag(uint type, uint tag) {
public List<uint> ranLineSpecials = [];
public List<uint[]> ranLineSpecialArgs = [];

public bool CF_Random(HelionACS.ThreadHandle thread, uint[] args) {
public HelionACS.CallFuncResult CF_Random(HelionACS.ThreadHandle thread, uint[] args) {
var min = (int)args[0];
var max = (int)args[1];
thread.PushStack(
Expand All @@ -54,46 +54,46 @@ public bool CF_Random(HelionACS.ThreadHandle thread, uint[] args) {
(_, _) => 0,
})
);
return false;
return HelionACS.CallFuncResult.NextOp;
}
public bool CF_EndPrint(HelionACS.ThreadHandle thread, uint[] args) {
public HelionACS.CallFuncResult CF_EndPrint(HelionACS.ThreadHandle thread, uint[] args) {
var threadInfo = thread.GetThreadInfo();
Assert.Equal(512, threadInfo.Activator);
printBufferOutput.Add(thread.GetPrintBuf());
return false;
return HelionACS.CallFuncResult.NextOp;
}
public bool CF_TagWait(HelionACS.ThreadHandle thread, uint[] args) {
public HelionACS.CallFuncResult CF_TagWait(HelionACS.ThreadHandle thread, uint[] args) {
Assert.Equal(10u, args[0]);
thread.MakeTagWait(0, args[0]);
return true;
return HelionACS.CallFuncResult.ReevaluateState;
}
public bool CF_GetActorVelX(HelionACS.ThreadHandle thread, uint[] args) {
public HelionACS.CallFuncResult CF_GetActorVelX(HelionACS.ThreadHandle thread, uint[] args) {
if (args[0] == 5) {
thread.PushStack((24 << 16) + (1 << 15)); // 24.5 in fixed point
} else {
thread.PushStack(0);
}
return false;
return HelionACS.CallFuncResult.NextOp;
}
public bool CF_Spawn(HelionACS.ThreadHandle thread, uint[] args) {
public HelionACS.CallFuncResult CF_Spawn(HelionACS.ThreadHandle thread, uint[] args) {
Assert.Equal("something", thread.GetString(args[0]));
Assert.Equal(1u, args[1]);
Assert.Equal(2u, args[2]);
Assert.Equal(3u, args[3]);
Assert.Equal(0u, args[4]);
Assert.Equal(0u, args[5]);
thread.PushStack(1);
return false;
return HelionACS.CallFuncResult.NextOp;
}
public bool CF_SpawnBroken(HelionACS.ThreadHandle thread, uint[] args) {
public HelionACS.CallFuncResult CF_SpawnBroken(HelionACS.ThreadHandle thread, uint[] args) {
Assert.Equal("something", thread.GetString(args[0]));
Assert.Equal(1u, args[1]);
Assert.Equal(2u, args[2]);
Assert.Equal(3u, args[3]);
Assert.Equal(0u, args[4]);
Assert.Equal(0u, args[5]);
// lack of stack push
return true;
return HelionACS.CallFuncResult.ReevaluateState;
}
}

Expand Down
Loading