mirror of
https://github.com/Smaug123/WoofWare.PawPrint
synced 2025-10-05 06:08:39 +00:00
185 lines
4.1 KiB
C#
185 lines
4.1 KiB
C#
public class TestStackOperations
|
|
{
|
|
// Test LdArg0-3: Load method arguments
|
|
public static int TestLoadArguments(int arg0, int arg1, int arg2, int arg3)
|
|
{
|
|
// LdArg0 loads 'this' for instance methods or first arg for static
|
|
if (arg0 != 10) return 1;
|
|
|
|
// LdArg1 loads second argument
|
|
if (arg1 != 20) return 2;
|
|
|
|
// LdArg2 loads third argument
|
|
if (arg2 != 30) return 3;
|
|
|
|
// LdArg3 loads fourth argument
|
|
if (arg3 != 40) return 4;
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Test Ldloc_0-3 and Stloc_0-3: Load/store local variables
|
|
public static int TestLocalVariables()
|
|
{
|
|
int local0 = 100;
|
|
int local1 = 200;
|
|
int local2 = 300;
|
|
int local3 = 400;
|
|
|
|
// Test loading locals
|
|
if (local0 != 100) return 10;
|
|
if (local1 != 200) return 11;
|
|
if (local2 != 300) return 12;
|
|
if (local3 != 400) return 13;
|
|
|
|
// Test storing to locals
|
|
local0 = local1 + local2; // Stloc_0
|
|
if (local0 != 500) return 14;
|
|
|
|
local1 = local2 * 2; // Stloc_1
|
|
if (local1 != 600) return 15;
|
|
|
|
local2 = local3 - 100; // Stloc_2
|
|
if (local2 != 300) return 16;
|
|
|
|
local3 = local0 / 5; // Stloc_3
|
|
if (local3 != 100) return 17;
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Test Pop: Remove top stack value
|
|
public static int TestPop()
|
|
{
|
|
int value = 42;
|
|
|
|
// Push value on stack then pop it
|
|
PushAndPop(value);
|
|
|
|
// If we get here, pop worked
|
|
return 0;
|
|
}
|
|
|
|
private static void PushAndPop(int value)
|
|
{
|
|
// The compiler will generate pop instructions
|
|
// for unused return values
|
|
GetValue();
|
|
GetValue();
|
|
}
|
|
|
|
private static int GetValue()
|
|
{
|
|
return 123;
|
|
}
|
|
|
|
// Test Dup: Duplicate top stack value
|
|
public static int TestDup()
|
|
{
|
|
int value = 50;
|
|
|
|
// Dup is used when same value is needed twice
|
|
int result1 = value * value; // Compiler may use dup here
|
|
if (result1 != 2500) return 20;
|
|
|
|
// More complex dup scenario
|
|
int x = 10;
|
|
int result2 = AddTwice(x);
|
|
if (result2 != 20) return 21;
|
|
|
|
return 0;
|
|
}
|
|
|
|
private static int AddTwice(int val)
|
|
{
|
|
// Compiler may generate dup to use val twice
|
|
return val + val;
|
|
}
|
|
|
|
// Test Ret: Return from method
|
|
public static int TestReturn()
|
|
{
|
|
// Test void return
|
|
VoidReturn();
|
|
|
|
// Test value return
|
|
int result = ValueReturn(5);
|
|
if (result != 5) return 30;
|
|
|
|
// Test early return
|
|
result = EarlyReturn(true);
|
|
if (result != 1) return 31;
|
|
|
|
result = EarlyReturn(false);
|
|
if (result != 2) return 32;
|
|
|
|
return 0;
|
|
}
|
|
|
|
private static void VoidReturn()
|
|
{
|
|
// Ret with no value
|
|
return;
|
|
}
|
|
|
|
private static int ValueReturn(int x)
|
|
{
|
|
// Ret with value
|
|
return x;
|
|
}
|
|
|
|
private static int EarlyReturn(bool condition)
|
|
{
|
|
if (condition)
|
|
return 1; // Early ret
|
|
|
|
return 2; // Normal ret
|
|
}
|
|
|
|
// Test combinations of stack operations
|
|
public static int TestStackCombinations()
|
|
{
|
|
int a = 10, b = 20, c = 30;
|
|
|
|
// Complex expression using multiple locals
|
|
int result = (a + b) * c - (b - a);
|
|
if (result != 890) return 40;
|
|
|
|
// Nested method calls
|
|
result = Compute(a, Compute(b, c));
|
|
if (result != 60) return 41;
|
|
|
|
return 0;
|
|
}
|
|
|
|
private static int Compute(int x, int y)
|
|
{
|
|
return x + y;
|
|
}
|
|
|
|
public static int Main(string[] argv)
|
|
{
|
|
int result;
|
|
|
|
result = TestLoadArguments(10, 20, 30, 40);
|
|
if (result != 0) return 100 + result;
|
|
|
|
result = TestLocalVariables();
|
|
if (result != 0) return 200 + result;
|
|
|
|
result = TestPop();
|
|
if (result != 0) return 300 + result;
|
|
|
|
result = TestDup();
|
|
if (result != 0) return 400 + result;
|
|
|
|
result = TestReturn();
|
|
if (result != 0) return 500 + result;
|
|
|
|
result = TestStackCombinations();
|
|
if (result != 0) return 600 + result;
|
|
|
|
return 0;
|
|
}
|
|
}
|