1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
import os
from scripts.test import shared
from . import utils
class PoppyValidationTest(utils.BinaryenTestCase):
def check_invalid(self, module, error):
p = shared.run_process(shared.WASM_OPT +
['--experimental-poppy', '--print', '-o', os.devnull],
input=module, check=False, capture_output=True)
self.assertIn(error, p.stderr)
self.assertIn('Fatal: error validating input', p.stderr)
self.assertNotEqual(p.returncode, 0)
def check_valid(self, module):
p = shared.run_process(shared.WASM_OPT +
['--experimental-poppy', '--print', '-o', os.devnull],
input=module, check=False, capture_output=True)
self.assertEqual(p.stderr, "")
self.assertEqual(p.returncode, 0)
def test_top_level_pop(self):
module = '''
(module
(func $foo (result i32)
(block (result i32)
(i32.const 0)
(pop i32)
)
)
)
'''
self.check_invalid(module, "Unexpected top-level pop in block")
def test_top_level_pop_fixed(self):
module = '''
(module
(func $foo (result i32)
(block (result i32)
(i32.const 0)
)
)
)
'''
self.check_valid(module)
def test_incompatible_type(self):
module = '''
(module
(func $foo (result i32)
(f32.const 42)
(i32.const 42)
(i32.add
(pop i32)
(pop i32)
)
)
)
'''
self.check_invalid(module, "block element has incompatible type")
self.check_invalid(module, "required: (i32 i32), available: (f32 i32)")
def test_incorrect_pop_type(self):
module = '''
(module
(func $foo (result i32)
(i32.const 42)
(i32.const 42)
(i32.add
(pop i32)
(pop f32)
)
)
)
'''
self.check_invalid(module, "binary child types must be equal")
def test_incompatible_type_fixed(self):
module = '''
(module
(func $foo (result i32)
(i32.const 42)
(i32.const 42)
(i32.add
(pop i32)
(pop i32)
)
)
)
'''
self.check_valid(module)
def test_incorrect_block_type(self):
module = '''
(module
(func $foo (result i32)
(f32.const 42)
(nop)
)
)
'''
self.check_invalid(module, "block contents should satisfy block type")
def test_nonblock_body(self):
module = '''
(module
(func $foo (result f32)
(f32.const 42)
)
)
'''
self.check_invalid(module, "Function body must be a block")
def test_nonpop_if_condition(self):
module = '''
(module
(func $foo
(nop)
(i32.const 1)
(if
(i32.const 42)
(block)
)
)
)
'''
self.check_invalid(module, "Expected condition to be a Pop")
def test_nonblock_if_true(self):
module = '''
(module
(func $foo
(nop)
(i32.const 1)
(if
(pop i32)
(nop)
)
)
)
'''
self.check_invalid(module, "Expected control flow child to be a block")
def test_nonblock_if_false(self):
module = '''
(module
(func $foo
(nop)
(i32.const 1)
(if
(pop i32)
(block)
(nop)
)
)
)
'''
self.check_invalid(module, "Expected control flow child to be a block")
def test_nonblock_if_fixed(self):
module = '''
(module
(func $foo
(nop)
(i32.const 1)
(if
(pop i32)
(block)
(block)
)
)
)
'''
self.check_valid(module)
def test_nonblock_loop_body(self):
module = '''
(module
(func $foo
(nop)
(loop
(nop)
)
)
)
'''
self.check_invalid(module, "Expected control flow child to be a block")
def test_nonpop_child(self):
module = '''
(module
(func $foo (result i32)
(i32.const 42)
(i32.const 5)
(i32.add
(pop i32)
(i32.const -1)
)
)
)
'''
self.check_invalid(module, "Unexpected non-Pop child")
|