Skip to content

Commit 21ef8a7

Browse files
committed
fix(extension) Use mapping protocol on *MemoryView classes.
By replacing the `PySequenceProtocol` by `PyMappingProtocol`, the `__setitem__` method finally compiles.
1 parent c57b455 commit 21ef8a7

File tree

2 files changed

+35
-37
lines changed

2 files changed

+35
-37
lines changed

src/memory_view.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! The `Buffer` Python object to build WebAssembly values.
22
3-
use pyo3::{class::PySequenceProtocol, exceptions::IndexError, prelude::*};
3+
use pyo3::{class::PyMappingProtocol, exceptions::IndexError, prelude::*};
44
use std::mem::size_of;
55
use wasmer_runtime::memory::Memory;
66

@@ -21,7 +21,7 @@ macro_rules! memory_view {
2121
}
2222

2323
#[pyproto]
24-
impl PySequenceProtocol for $class_name {
24+
impl PyMappingProtocol for $class_name {
2525
fn __len__(&self) -> PyResult<usize> {
2626
Ok(self.memory.view::<$wasm_type>()[self.offset..].len() / size_of::<$wasm_type>())
2727
}
@@ -49,7 +49,6 @@ macro_rules! memory_view {
4949
}
5050
}
5151

52-
/*
5352
fn __setitem__(&mut self, index: isize, value: u8) -> PyResult<()> {
5453
let offset = self.offset;
5554
let view = self.memory.view::<u8>();
@@ -74,7 +73,6 @@ macro_rules! memory_view {
7473
Ok(())
7574
}
7675
}
77-
*/
7876
}
7977
};
8078
}

tests/memory_view.py

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ def test_length(self):
3333
1114112
3434
)
3535

36-
#def test_get(self):
37-
# memory = Instance(TEST_BYTES).uint8_memory_view()
38-
# index = 7
39-
# value = 42
40-
# memory[index] = value
36+
def test_get(self):
37+
memory = Instance(TEST_BYTES).uint8_memory_view()
38+
index = 7
39+
value = 42
40+
memory[index] = value
4141

42-
# self.assertEqual(memory[index], value)
42+
self.assertEqual(memory[index], value)
4343

4444
def test_get_out_of_range(self):
4545
with self.assertRaises(IndexError) as context_manager:
@@ -52,16 +52,16 @@ def test_get_out_of_range(self):
5252
'Out of bound: Absolute index 1114113 is larger than the memory size 1114112.'
5353
)
5454

55-
#def test_set_out_of_range(self):
56-
# with self.assertRaises(IndexError) as context_manager:
57-
# memory = Instance(TEST_BYTES).uint8_memory_view()
58-
# memory[len(memory) + 1] = 42
55+
def test_set_out_of_range(self):
56+
with self.assertRaises(IndexError) as context_manager:
57+
memory = Instance(TEST_BYTES).uint8_memory_view()
58+
memory[len(memory) + 1] = 42
5959

60-
# exception = context_manager.exception
61-
# self.assertEqual(
62-
# str(exception),
63-
# 'Out of bound: Absolute index 1114113 is larger than the memory size 1114112.'
64-
# )
60+
exception = context_manager.exception
61+
self.assertEqual(
62+
str(exception),
63+
'Out of bound: Absolute index 1114113 is larger than the memory size 1114112.'
64+
)
6565

6666
def test_hello_world(self):
6767
instance = Instance(TEST_BYTES)
@@ -76,21 +76,21 @@ def test_hello_world(self):
7676

7777
self.assertEqual(string, 'Hello, World!')
7878

79-
#def test_memory_views_share_the_same_buffer(self):
80-
# instance = Instance(TEST_BYTES)
81-
# int8 = instance.int8_memory_view()
82-
# int16 = instance.int16_memory_view()
83-
# int32 = instance.int32_memory_view()
84-
85-
# int8[0] = 0b00000001
86-
# int8[1] = 0b00000100
87-
# int8[2] = 0b00010000
88-
# int8[3] = 0b01000000
89-
90-
# self.assertEqual(int8[0], 0b00000001)
91-
# self.assertEqual(int8[1], 0b00000100)
92-
# self.assertEqual(int8[2], 0b00010000)
93-
# self.assertEqual(int8[3], 0b01000000)
94-
# self.assertEqual(int16[0], 0b00000100_00000001)
95-
# self.assertEqual(int16[1], 0b01000000_00010000)
96-
# self.assertEqual(int32[0], 0b01000000_00010000_00000100_00000001)
79+
def test_memory_views_share_the_same_buffer(self):
80+
instance = Instance(TEST_BYTES)
81+
int8 = instance.int8_memory_view()
82+
int16 = instance.int16_memory_view()
83+
int32 = instance.int32_memory_view()
84+
85+
int8[0] = 0b00000001
86+
int8[1] = 0b00000100
87+
int8[2] = 0b00010000
88+
int8[3] = 0b01000000
89+
90+
self.assertEqual(int8[0], 0b00000001)
91+
self.assertEqual(int8[1], 0b00000100)
92+
self.assertEqual(int8[2], 0b00010000)
93+
self.assertEqual(int8[3], 0b01000000)
94+
self.assertEqual(int16[0], 0b00000100_00000001)
95+
self.assertEqual(int16[1], 0b01000000_00010000)
96+
self.assertEqual(int32[0], 0b01000000_00010000_00000100_00000001)

0 commit comments

Comments
 (0)