391 lines
8.9 KiB
Python
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() |