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