use crate::{
code::{Code, CodeAndId},
ids::CodeId,
message::DispatchKind,
pages::{WasmPage, WasmPagesAmount},
};
use alloc::{collections::BTreeSet, vec::Vec};
use scale_info::{
scale::{Decode, Encode},
TypeInfo,
};
#[derive(Clone, Debug, PartialEq, Eq, Decode, Encode, TypeInfo)]
pub struct InstantiatedSectionSizes {
pub code_section: u32,
pub data_section: u32,
pub global_section: u32,
pub table_section: u32,
pub element_section: u32,
pub type_section: u32,
}
impl InstantiatedSectionSizes {
pub const EMPTY: Self = Self {
code_section: 0,
data_section: 0,
global_section: 0,
table_section: 0,
element_section: 0,
type_section: 0,
};
}
#[derive(Clone, Debug, Decode, Encode, TypeInfo)]
pub struct InstrumentedCode {
pub(crate) code: Vec<u8>,
pub(crate) original_code_len: u32,
pub(crate) exports: BTreeSet<DispatchKind>,
pub(crate) static_pages: WasmPagesAmount,
pub(crate) stack_end: Option<WasmPage>,
pub(crate) instantiated_section_sizes: InstantiatedSectionSizes,
pub(crate) version: u32,
}
impl InstrumentedCode {
pub unsafe fn new_unchecked(
code: Vec<u8>,
original_code_len: u32,
exports: BTreeSet<DispatchKind>,
static_pages: WasmPagesAmount,
stack_end: Option<WasmPage>,
instantiated_section_sizes: InstantiatedSectionSizes,
version: u32,
) -> Self {
Self {
code,
original_code_len,
exports,
static_pages,
stack_end,
instantiated_section_sizes,
version,
}
}
pub fn code(&self) -> &[u8] {
&self.code
}
pub fn original_code_len(&self) -> u32 {
self.original_code_len
}
pub fn instruction_weights_version(&self) -> u32 {
self.version
}
pub fn exports(&self) -> &BTreeSet<DispatchKind> {
&self.exports
}
pub fn static_pages(&self) -> WasmPagesAmount {
self.static_pages
}
pub fn stack_end(&self) -> Option<WasmPage> {
self.stack_end
}
pub fn instantiated_section_sizes(&self) -> &InstantiatedSectionSizes {
&self.instantiated_section_sizes
}
pub fn into_code(self) -> Vec<u8> {
self.code
}
}
impl From<Code> for InstrumentedCode {
fn from(code: Code) -> Self {
code.into_parts().0
}
}
#[derive(Clone, Debug)]
pub struct InstrumentedCodeAndId {
code: InstrumentedCode,
code_id: CodeId,
}
impl InstrumentedCodeAndId {
pub fn code(&self) -> &InstrumentedCode {
&self.code
}
pub fn code_id(&self) -> CodeId {
self.code_id
}
pub fn into_parts(self) -> (InstrumentedCode, CodeId) {
(self.code, self.code_id)
}
}
impl From<CodeAndId> for InstrumentedCodeAndId {
fn from(code_and_id: CodeAndId) -> Self {
let (code, code_id) = code_and_id.into_parts();
let (code, _) = code.into_parts();
Self { code, code_id }
}
}