101 lines
2.5 KiB
Python
101 lines
2.5 KiB
Python
import sys
|
|
|
|
import pytest
|
|
|
|
from .helpers import DASHES
|
|
from .runners import RunnerPywasm3
|
|
|
|
def setup_interpreter(phash_code: str) -> RunnerPywasm3:
|
|
runner = RunnerPywasm3(phash_code)
|
|
|
|
runner.parse()
|
|
runner.compile_ast()
|
|
runner.compile_wat()
|
|
runner.compile_wasm()
|
|
runner.interpreter_setup()
|
|
runner.interpreter_load()
|
|
|
|
sys.stderr.write(f'{DASHES} Phasm {DASHES}\n')
|
|
runner.dump_phasm_code(sys.stderr)
|
|
sys.stderr.write(f'{DASHES} Assembly {DASHES}\n')
|
|
runner.dump_wasm_wat(sys.stderr)
|
|
|
|
return runner
|
|
|
|
@pytest.mark.integration_test
|
|
def test___init__():
|
|
code_py = """
|
|
@exported
|
|
def testEntry() -> u8:
|
|
return 13
|
|
"""
|
|
|
|
runner = setup_interpreter(code_py)
|
|
memory = runner.rtime.get_memory(0)
|
|
|
|
# Garbage in the memory so we can test for it
|
|
for idx in range(128):
|
|
memory[idx] = idx
|
|
|
|
sys.stderr.write(f'{DASHES} Memory (pre run) {DASHES}\n')
|
|
runner.interpreter_dump_memory(sys.stderr)
|
|
|
|
runner.call('stdlib.alloc.__init__')
|
|
|
|
sys.stderr.write(f'{DASHES} Memory (post run) {DASHES}\n')
|
|
runner.interpreter_dump_memory(sys.stderr)
|
|
|
|
memory = memory.tobytes()
|
|
|
|
assert (
|
|
b'\xC0\xA1\x00\x00'
|
|
b'\x00\x00\x00\x00'
|
|
b'\x00\x00\x00\x00'
|
|
b'\x10\x00\x00\x00'
|
|
b'\x10\x11\x12\x13' # Untouched because unused
|
|
) == memory[0:20]
|
|
|
|
@pytest.mark.integration_test
|
|
def test___alloc___no_init():
|
|
code_py = """
|
|
@exported
|
|
def testEntry() -> u8:
|
|
return 13
|
|
"""
|
|
|
|
runner = setup_interpreter(code_py)
|
|
|
|
sys.stderr.write(f'{DASHES} Memory (pre run) {DASHES}\n')
|
|
runner.interpreter_dump_memory(sys.stderr)
|
|
|
|
with pytest.raises(RuntimeError, match='unreachable executed'):
|
|
runner.call('stdlib.alloc.__alloc__', 32)
|
|
|
|
@pytest.mark.integration_test
|
|
def test___alloc___ok():
|
|
code_py = """
|
|
@exported
|
|
def testEntry() -> u8:
|
|
return 13
|
|
"""
|
|
|
|
runner = setup_interpreter(code_py)
|
|
memory = runner.rtime.get_memory(0)
|
|
|
|
sys.stderr.write(f'{DASHES} Memory (pre run) {DASHES}\n')
|
|
runner.interpreter_dump_memory(sys.stderr)
|
|
|
|
runner.call('stdlib.alloc.__init__')
|
|
offset0 = runner.call('stdlib.alloc.__alloc__', 32)
|
|
offset1 = runner.call('stdlib.alloc.__alloc__', 32)
|
|
offset2 = runner.call('stdlib.alloc.__alloc__', 32)
|
|
|
|
sys.stderr.write(f'{DASHES} Memory (post run) {DASHES}\n')
|
|
runner.interpreter_dump_memory(sys.stderr)
|
|
|
|
assert b'\xC0\xA1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' == memory[0:12]
|
|
|
|
assert 0x14 == offset0
|
|
assert 0x38 == offset1
|
|
assert 0x5C == offset2
|