pub struct Code { /* private fields */ }
Expand description
Contains instrumented binary code of a program and initial memory size from memory import.
Implementations§
Source§impl Code
impl Code
Sourcepub fn try_new<R, GetRulesFn>(
original_code: Vec<u8>,
version: u32,
get_gas_rules: GetRulesFn,
stack_height: Option<u32>,
data_segments_amount_limit: Option<u32>,
table_number_limit: Option<u32>,
) -> Result<Self, CodeError>
pub fn try_new<R, GetRulesFn>( original_code: Vec<u8>, version: u32, get_gas_rules: GetRulesFn, stack_height: Option<u32>, data_segments_amount_limit: Option<u32>, table_number_limit: Option<u32>, ) -> Result<Self, CodeError>
Create the code by checking and instrumenting original_code
.
Main logic of instrumentation can be represented by this example:
Let’s take a code:
(module
(import "env" "memory" (memory 1))
(export "init" (func $init))
(func $f1
<-- f1 code -->
)
(func $f2
if (i32.eqz (i32.const 0))
<-- some code -->
else
<-- some code -->
end
)
(func $f3
<-- f3 code -->
)
(func $init
call $f1
call $f2
call $f3
<-- some code -->
)
)
After instrumentation code will be like:
(module
(import "env" "memory" (memory 1))
(export "init" (func $init_export))
(func $gas_charge
<-- gas charge impl --> ;; see utils/wasm-instrument/src/lib.rs
)
(func $f1
i32.const 123
call $gas_charge
<-- f1 code -->
)
(func $f2
i32.const 123
call $gas_charge
if (i32.eqz (i32.const 0))
i32.const 1
call $gas_charge
<-- some code -->
else
i32.const 2
call $gas_charge
<-- some code -->
end
)
(func $init
i32.const 123
call $gas_charge
;; stack limit check impl see in wasm_instrument::inject_stack_limiter
<-- stack limit check and increase -->
call $f1
<-- stack limit decrease -->
<-- stack limit check and increase -->
call $f2
<-- stack limit decrease -->
<-- some code -->
)
(func $init_export
i32.const 123
call $gas_charge
<-- stack limit check and increase -->
call $init
<-- stack limit decrease -->
)
)
Sourcepub fn try_new_mock_const_or_no_rules(
original_code: Vec<u8>,
const_rules: bool,
config: TryNewCodeConfig,
) -> Result<Self, CodeError>
pub fn try_new_mock_const_or_no_rules( original_code: Vec<u8>, const_rules: bool, config: TryNewCodeConfig, ) -> Result<Self, CodeError>
Create new code for mock goals with const or no instrumentation rules.
Sourcepub fn try_new_mock_with_rules<R, GetRulesFn>(
original_code: Vec<u8>,
get_gas_rules: GetRulesFn,
config: TryNewCodeConfig,
) -> Result<Self, CodeError>
pub fn try_new_mock_with_rules<R, GetRulesFn>( original_code: Vec<u8>, get_gas_rules: GetRulesFn, config: TryNewCodeConfig, ) -> Result<Self, CodeError>
Create new code for mock goals with custom instrumentation rules.
Sourcepub fn original_code(&self) -> &[u8]
pub fn original_code(&self) -> &[u8]
Returns the original code.
Sourcepub fn exports(&self) -> &BTreeSet<DispatchKind>
pub fn exports(&self) -> &BTreeSet<DispatchKind>
Returns wasm module exports.
Sourcepub fn instruction_weights_version(&self) -> u32
pub fn instruction_weights_version(&self) -> u32
Returns instruction weights version.
Sourcepub fn static_pages(&self) -> WasmPagesAmount
pub fn static_pages(&self) -> WasmPagesAmount
Returns initial memory size from memory import.
Sourcepub fn into_parts(self) -> (InstrumentedCode, Vec<u8>)
pub fn into_parts(self) -> (InstrumentedCode, Vec<u8>)
Consumes this instance and returns the instrumented and raw binary codes.
Trait Implementations§
Source§impl From<Code> for InstrumentedCode
impl From<Code> for InstrumentedCode
impl Eq for Code
impl StructuralPartialEq for Code
Auto Trait Implementations§
impl Freeze for Code
impl RefUnwindSafe for Code
impl Send for Code
impl Sync for Code
impl Unpin for Code
impl UnwindSafe for Code
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more