Skip to content

Instantly share code, notes, and snippets.

@jontro
Created December 18, 2017 23:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jontro/b3e247bcc2d92a081191bc4cdf56e0b0 to your computer and use it in GitHub Desktop.
Save jontro/b3e247bcc2d92a081191bc4cdf56e0b0 to your computer and use it in GitHub Desktop.
diff --git a/index.html b/index.html
index dd19415..e015780 100644
--- a/index.html
+++ b/index.html
@@ -14,20 +14,23 @@ fetch('target/wasm32-unknown-unknown/release/wasmmem.wasm')
.then(bytes => WebAssembly.instantiate(bytes, {
env: {
- draw: function(data_ptr, counter) {
+ draw: function(counter) {
console.log("Called draw with counter: ", counter);
- console.log("Called draw with ptr:", data_ptr);
for(var i = 0; i < 5; i++) {
- console.log("data[", i, "]:", rust_memory[data_ptr + i]);
+ console.log("data[", i, "]:", rust_memory[i]);
}
}
}
}))
.then(results => {
- rust_memory = new Uint8Array(results.instance.exports.memory.buffer);
var gamestate_ptr = results.instance.exports.start();
+ var pointer = results.instance.exports.data_address(gamestate_ptr);
+ var len = results.instance.exports.data_length(gamestate_ptr);
+ console.log(pointer, len);
+ rust_memory = new Uint8Array(results.instance.exports.memory.buffer, pointer, len);
+
console.log("Gamestate pointer:", gamestate_ptr);
results.instance.exports.update(gamestate_ptr);
diff --git a/src/main.rs b/src/main.rs
index 0d2ee27..9fcc499 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,5 +1,7 @@
+use std::os::raw::c_void;
+
extern {
- fn draw(data: *const u8, counter: i32);
+ fn draw(counter: i32);
}
pub struct Gamestate {
@@ -13,7 +15,7 @@ impl Gamestate {
// NOTE: changing this to `66_000` will make the web
// client show zeros instead of the initial values set
// here as well as in `update`.
- data: vec![5; 65_000],
+ data: vec![5; 66_000],
counter: 0,
}
}
@@ -26,6 +28,26 @@ pub fn start() -> *mut Gamestate {
Box::into_raw(state)
}
+
+#[no_mangle]
+pub extern "C" fn data_address(state_ptr: *mut Gamestate) -> *mut c_void {
+ let mut state = unsafe { Box::from_raw(state_ptr) };
+
+ let ptr = state.data.as_mut_ptr();
+ std::mem::forget(state);
+ return ptr as *mut c_void;
+}
+
+#[no_mangle]
+pub extern "C" fn data_length(state_ptr: *mut Gamestate) -> usize {
+ let state = unsafe { Box::from_raw(state_ptr) };
+
+ let ret = state.data.len();
+ std::mem::forget(state);
+ return ret;
+
+}
+
#[no_mangle]
pub fn update(state_ptr: *mut Gamestate) {
let mut state = unsafe { Box::from_raw(state_ptr) };
@@ -39,11 +61,10 @@ pub fn update(state_ptr: *mut Gamestate) {
*num = 42 + counter as u8;
}
- let data_ptr = state.data.as_ptr();
std::mem::forget(state);
unsafe {
- draw(data_ptr, counter)
+ draw(counter)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment