Files
TransPyC/BenchmarkProject/App/benchmark_main.py
2026-06-16 16:09:42 +08:00

391 lines
8.9 KiB
Python

from stdlib import malloc, free
from stdint import *
import string
import w32.win32console
from stdarg import va_start, va_end, va_arg, va_list
import t
import c
class Struct1:
a: UINT
b: UINT = 123
class Item:
data: t.CVoid | t.CPtr
size: t.CSizeT
class List:
items: Item | t.CPtr
count: t.CSizeT = 0
capacity: t.CSizeT = 4
def __init__(self):
self.count = 0
self.capacity = 4
self.items = malloc(self.capacity * Item.__sizeof__())
def append(self, data: t.CVoid | t.CPtr, size: t.CSizeT):
self.count += 1
item: Item | t.CPtr = self.items[self.count - 1]
item.size = size
item.data = malloc(size + 1)
memcpy(item.data, data, size)
def get(self, index: t.CSizeT) -> t.CInt8T | t.CPtr:
if index >= self.count:
return None
return self.items[index].data
def free(self):
i: t.CSizeT = 0
for i in range(self.count):
if self.items[i].data != 0:
free(self.items[i].data)
free(self.items)
class EnumTest(t.CEnum):
A: c.State
B: c.State
C: c.State
Len: c.State
@t.Object
class OOPTest:
a: UINT
b: UINT = 12345
c: UINT
def __init__(self):
self.a = 451
def set_c(self, v: UINT):
self.c = v
def __call__(self, a: UINT, b: UINT) -> UINT:
return a + b
def __enter__(self) -> 'OOPTest' | t.CPtr:
return self
def __exit__(self):
self.a = 99
self.b = 99
self.c = 99
def __add__(self, other: 'OOPTest' | t.CPtr) -> 'OOPTest' | t.CPtr:
s = OOPTest()
s.a = (self.a + other.a)
return s
def __str__(self) -> str:
return f"OOPTest ({self.a}) ({self.b}) ({self.c})"
def __bool__(self) -> bool:
return bool(self.a != 0)
def __len__(self) -> UINT:
return self.a
@t.Object
class RangeOOPSimulation:
start: UINT
end: UINT
def __init__(self, start: UINT, end: UINT):
self.start = start
self.end = end
def __iter__(self) -> 'RangeOOPSimulation' | t.CPtr:
return self
def __next__(self) -> UINT:
if self.start >= self.end:
raise StopIteration
self.start += 1
return self.start - 1
GLOBAL_VAR: t.CInt = 0
def rebutnotreGLOBAL_VAR() -> t.CInt:
GLOBAL_VAR = 100
def reGLOBAL_VAR() -> t.CInt:
global GLOBAL_VAR
GLOBAL_VAR = 100
def function2function() -> t.CInt:
def func() -> t.CInt:
x = 1000
def func2() -> t.CInt:
nonlocal x
x = 1000000
func2()
return x
return func()
def manyreturn() -> tuple[t.CInt, t.CInt]:
return 114, 514
def str_to_hex(s: str) -> str:
buf: str = malloc(1024)
out: str = buf
hex_chars: list[t.CChar, None] = "0123456789ABCDEF"
while c.Cast(s) != 0:
cr: t.CUnsignedChar = c.CCast(s)
c.Set(c.CCast(out), hex_chars[(cr >> 4) & 0xF])
out += 1
c.Set(c.CCast(out), hex_chars[cr & 0xF])
out += 1
s += 1
c.Set(c.CCast(out), 0)
return buf
def int_to_hex(num: int) -> str:
buf = t.CChar(malloc(128), t.CPtr)
if not buf:
return None
hex_chars: list[t.CChar, None] = "0123456789ABCDEF"
i = 0
buf[i] = '0'
buf[i + 1] = 'x'
i += 2
if num == 0:
buf[i] = '0'
i += 1
buf[i] = '0'
i += 1
buf[i] = '\0'
return buf
temp: list[t.CChar, 32]
temp_idx = 0
n: t.CUnsignedInt = t.CUnsignedInt(num)
while n > 0:
rem: t.CInt = n & 0xF
temp[temp_idx] = hex_chars[rem]
temp_idx += 1
n = n >> 4
while temp_idx > 0:
temp_idx -= 1
buf[i] = temp[temp_idx]
i += 1
buf[i] = '\0'
return buf
def int_to_str(num: int) -> str:
buf: t.CChar | t.CPtr = t.CChar(malloc(128), t.CPtr)
if not buf:
return None
is_negative = 0
i = 0
if num == 0:
buf[i] = '0'
i += 1
buf[i] = '\0'
return buf
if num < 0:
is_negative = 1
num = -num
while num > 0:
rem = num % 10
buf[i] = '0' + rem
i += 1
num = num / 10
if is_negative:
buf[i] = '-'
i += 1
buf[i] = '\0'
start = 0
end = i - 1
while start < end:
tr: t.CChar = buf[start]
buf[start] = buf[end]
buf[end] = tr
start += 1
end -= 1
return buf
def main():
w32.win32console.SetConsoleOutputCP(65001)
w32.win32console.SetConsoleCP(65001)
print("============== BENCHMARK 1: Structures & OOP ==============")
print("\nTesting Struct1:")
s1_: Struct1 = Struct1(10)
print("s1_.a:", s1_.a)
print("s1_.b:", s1_.b)
print("\nTesting OOPTest class:")
d = OOPTest()
d.set_c(100)
d.a = 1
print("d.a:", d.a)
print("d.b:", d.b)
print("d.c:", d.c)
print("\nTesting __call__ (d(1, 2)):")
print("d(1, 2):", d(1, 2))
print("\nTesting __bool__:")
if d:
print("d is truthy (d.a != 0)")
else:
print("d is falsy (d.a == 0)")
print("\nTesting __len__:")
print("len(d):", len(d))
print("\nTesting __str__:")
print("str(d):", str(d))
print("\nTesting __add__:")
l = OOPTest()
l.a = 100
result = d + l
print("(d + l).a:", result.a)
free(l)
free(result)
print("\nTesting context manager (with statement):")
with OOPTest() as d2:
print("Inside with block, d2(1, 2):", d2(1, 2))
print("After exit, d2.__str__():", str(d2))
print("\nTesting List class:")
l = List()
nihao = "你好!世界"
l.append(c.Addr(114514), t.CInt.__sizeof__())
l.append(nihao, len(nihao))
print("List count:", l.count)
l.free()
print("\n============== BENCHMARK 2: Global Variables & Functions ==============")
print("\nTesting global variable re-assignment:")
print("Initial GLOBAL_VAR:", GLOBAL_VAR)
rebutnotreGLOBAL_VAR()
print("After rebutnotreGLOBAL_VAR():", GLOBAL_VAR)
reGLOBAL_VAR()
print("After reGLOBAL_VAR():", GLOBAL_VAR)
print("\nTesting function2function with nonlocal:")
print("function2function():", function2function())
print("\nTesting tuple return:")
a: t.CInt
b: t.CInt
a, b = manyreturn()
print("manyreturn():", a, b)
print("\nTesting walrus operator:")
kkkkk = 0
if not GLOBAL_VAR or (kkkkk := 1):
print("GLOBAL_VAR is 0, kkkkk:", kkkkk)
print("Final kkkkk:", kkkkk)
print("\n============== BENCHMARK 3: Memory & Pointers ==============")
print("\nTesting malloc/free:")
p2 = malloc(100)
i: t.CInt = 0
while i <= 100:
p2[i] = 4
i += 1
all_four = 1
for i in range(0, 100 + 1):
if p2[i] != 4:
all_four = 0
break
if all_four:
print("All 4 - Memory write/read verified")
free(p2)
print("\nTesting for loop with range:")
add_num = 0
for i in range(0, 100 + 1):
add_num += 1
print("i:", i, "add_num:", add_num)
print("\nTesting for loop with continue:")
lll = 0
for i in range(0, 10 + 1):
if i % 2 != 0:
continue
lll += i
print("Sum of even numbers 0-10:", lll)
print("\n============== BENCHMARK 4: Iteration & Strings ==============")
print("\nTesting RangeOOPSimulation (custom iterator):")
print("Iterating RangeOOPSimulation(0, 6):")
for i in RangeOOPSimulation(0, 6):
print("RangeOOPSimulation item:", i)
print("\nTesting str_to_hex:")
hex_str = str_to_hex("ABCDEF")
print("hex of ABCDEF:", hex_str)
free(hex_str)
print("\nTesting int_to_hex:")
hex_num = int_to_hex(255)
print("hex of 255:", hex_num)
free(hex_num)
print("\nTesting int_to_str:")
num_str = int_to_str(-12345)
print("str of -12345:", num_str)
free(num_str)
print("\nTesting f-string with Chinese characters:")
chinese = "你好"
print(f"{chinese},世界")
print("\n============== BENCHMARK 5: Exception Handling ==============")
print("\nTesting try/except/else/finally:")
try:
print("In try block")
assert 1 != 1, "1 == 1"
print("This should not print")
except AssertionError as e:
print("AssertionError caught:", e)
except ValueError as e:
print("ValueError caught:", e)
else:
print("No exception in try block")
finally:
print("Finally block executed")
free(d)
free(d2)
print("\n============== All Benchmarks Completed ==============")
main()