| import os |
| |
| from scripts.test import shared |
| |
| from . import utils |
| |
| """Test that MemoryPacking correctly respects the web limitations by not |
| generating more than 100K data segments""" |
| |
| |
| class MemoryPackingTest(utils.BinaryenTestCase): |
| def test_large_segment(self): |
| data = '"' + (('A' + ('\\00' * 9)) * 100001) + '"' |
| module = f''' |
| (module |
| (memory 256 256) |
| (data $d (i32.const 0) {data}) |
| ) |
| ''' |
| opts = ['--memory-packing', '--disable-bulk-memory', '--print', |
| '-o', os.devnull] |
| p = shared.run_process(shared.WASM_OPT + opts, input=module, |
| check=False, capture_output=True) |
| output = [ |
| '(data $d (i32.const 0) "A")', |
| '(data $d.1 (i32.const 10) "A")', |
| '(data $d.99998 (i32.const 999980) "A")', |
| '(data $d.99999 (i32.const 999990) "A' + ('\\00' * 9) + 'A")', |
| ] |
| self.assertEqual(p.returncode, 0) |
| for line in output: |
| self.assertIn(line, p.stdout) |
| |
| def test_large_segment_unmergeable(self): |
| data = '\n'.join(f'(data (i32.const {i}) "A")' for i in range(100001)) |
| module = f'(module (memory 256 256) {data})' |
| opts = ['--memory-packing', '--enable-bulk-memory', '--print', |
| '-o', os.devnull] |
| p = shared.run_process(shared.WASM_OPT + opts, input=module, |
| check=False, capture_output=True) |
| self.assertEqual(p.returncode, 0) |
| self.assertIn('Some VMs may not accept this binary', p.stderr) |
| self.assertIn('Run the limit-segments pass to merge segments.', p.stderr) |