pub struct Code { /* private fields */ }Expand description
Contains original and instrumented binary code of a program.
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>,
) -> 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>, ) -> 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 instrumented_code(&self) -> &InstrumentedCode
pub fn instrumented_code(&self) -> &InstrumentedCode
Returns the instrumented code.
Sourcepub fn metadata(&self) -> &CodeMetadata
pub fn metadata(&self) -> &CodeMetadata
Returns the code metadata.
Sourcepub fn into_parts(self) -> (Vec<u8>, InstrumentedCode, CodeMetadata)
pub fn into_parts(self) -> (Vec<u8>, InstrumentedCode, CodeMetadata)
Consumes this instance and returns the instrumented and raw binary codes.
Sourcepub fn into_instrumented_code_and_metadata(self) -> InstrumentedCodeAndMetadata
pub fn into_instrumented_code_and_metadata(self) -> InstrumentedCodeAndMetadata
Consumes this instance and returns the instrumented code and metadata struct.
Trait Implementations§
Source§impl From<Code> for InstrumentedCode
impl From<Code> for InstrumentedCode
Source§impl From<Code> for InstrumentedCodeAndMetadata
impl From<Code> for InstrumentedCodeAndMetadata
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