phasm/tests/integration/test_stdlib_alloc.py
2022-08-06 20:50:43 +02:00

103 lines
2.8 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)
# Garbage in the memory so we can test for it
runner.interpreter_write_memory(0, range(128))
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)
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
) == runner.interpreter_read_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(Exception, match='unreachable'):
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)
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\x7C\x00\x00\x00'
b'\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00'
) == runner.interpreter_read_memory(0, 0x60)
assert 0x14 == offset0
assert 0x38 == offset1
assert 0x5C == offset2