Add get_runtime_size for JS

This commit is contained in:
Felix Schütt
2022-10-14 15:45:10 +02:00
parent b645800ae3
commit 638e90e56e
3 changed files with 34 additions and 3 deletions

13
Cargo.lock generated
View File

@@ -2315,6 +2315,17 @@ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]]
name = "serde-wasm-bindgen"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf"
dependencies = [
"js-sys",
"serde",
"wasm-bindgen",
]
[[package]] [[package]]
name = "serde_bytes" name = "serde_bytes"
version = "0.11.7" version = "0.11.7"
@@ -3070,6 +3081,8 @@ dependencies = [
"js-sys", "js-sys",
"macro-wasmer-universal-test", "macro-wasmer-universal-test",
"more-asserts", "more-asserts",
"serde",
"serde-wasm-bindgen",
"target-lexicon 0.12.4", "target-lexicon 0.12.4",
"tempfile", "tempfile",
"thiserror", "thiserror",

View File

@@ -68,6 +68,9 @@ wasmer-derive = { path = "../derive", version = "=3.0.0-beta.2" }
# - Optional dependencies for `js`. # - Optional dependencies for `js`.
wasmparser = { version = "0.83", default-features = false, optional = true } wasmparser = { version = "0.83", default-features = false, optional = true }
hashbrown = { version = "0.11", optional = true } hashbrown = { version = "0.11", optional = true }
serde-wasm-bindgen = { version = "0.4.5" }
serde = { version = "1.0", features = ["derive"] }
# - Development Dependencies for `js`. # - Development Dependencies for `js`.
[target.'cfg(target_arch = "wasm32")'.dev-dependencies] [target.'cfg(target_arch = "wasm32")'.dev-dependencies]
wat = "1.0" wat = "1.0"

View File

@@ -3,9 +3,10 @@ use crate::js::store::{AsStoreMut, AsStoreRef, InternalStoreHandle};
use crate::js::wasm_bindgen_polyfill::Global; use crate::js::wasm_bindgen_polyfill::Global;
use js_sys::Function; use js_sys::Function;
use js_sys::WebAssembly::{Memory, Table}; use js_sys::WebAssembly::{Memory, Table};
use serde::{Deserialize, Serialize};
use std::fmt; use std::fmt;
use wasm_bindgen::{JsCast, JsValue}; use wasm_bindgen::{JsCast, JsValue};
use wasmer_types::{ExternType, FunctionType, GlobalType, MemoryType, TableType}; use wasmer_types::{ExternType, FunctionType, GlobalType, MemoryType, TableType, WASM_PAGE_SIZE};
/// Represents linear memory that is managed by the javascript runtime /// Represents linear memory that is managed by the javascript runtime
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
@@ -17,13 +18,27 @@ pub struct VMMemory {
unsafe impl Send for VMMemory {} unsafe impl Send for VMMemory {}
unsafe impl Sync for VMMemory {} unsafe impl Sync for VMMemory {}
#[derive(Serialize, Deserialize)]
struct DummyBuffer {
#[serde(rename = "byteLength")]
byte_length: u32,
}
impl VMMemory { impl VMMemory {
pub(crate) fn new(memory: Memory, ty: MemoryType) -> Self { pub(crate) fn new(memory: Memory, ty: MemoryType) -> Self {
Self { memory, ty } Self { memory, ty }
} }
/// Returns the size of the memory buffer in pages
pub fn get_runtime_size(&self) -> u32 { pub fn get_runtime_size(&self) -> u32 {
self.memory.get_runtime_size() let dummy: DummyBuffer = match serde_wasm_bindgen::from_value(self.memory.buffer()) {
Ok(o) => o,
Err(_) => return 0,
};
if dummy.byte_length == 0 {
return 0;
}
dummy.byte_length / 65536
} }
/// Attempts to clone this memory (if its clonable) /// Attempts to clone this memory (if its clonable)
@@ -61,7 +76,7 @@ impl VMTable {
Self { table, ty } Self { table, ty }
} }
pub fn get_runtime_size(&self) -> u32 { pub fn get_runtime_size(&self) -> u32 {
self.table.get_runtime_size() self.table.length()
} }
} }