Struct gear_core::code::Code

source ·
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

source

pub fn try_new<R, GetRulesFn>( original_code: Vec<u8>, version: u32, get_gas_rules: GetRulesFn, stack_height: Option<u32> ) -> Result<Self, CodeError>
where R: Rules, GetRulesFn: FnMut(&Module) -> R,

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 -->
  )
)
source

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.

source

pub fn try_new_mock_with_rules<R, GetRulesFn>( original_code: Vec<u8>, get_gas_rules: GetRulesFn, config: TryNewCodeConfig ) -> Result<Self, CodeError>
where R: Rules, GetRulesFn: FnMut(&Module) -> R,

Create new code for mock goals with custom instrumentation rules.

source

pub fn original_code(&self) -> &[u8]

Returns the original code.

source

pub fn code(&self) -> &[u8]

Returns reference to the instrumented binary code.

source

pub fn exports(&self) -> &BTreeSet<DispatchKind>

Returns wasm module exports.

source

pub fn instruction_weights_version(&self) -> u32

Returns instruction weights version.

source

pub fn static_pages(&self) -> WasmPage

Returns initial memory size from memory import.

source

pub fn into_parts(self) -> (InstrumentedCode, Vec<u8>)

Consumes this instance and returns the instrumented and raw binary codes.

Trait Implementations§

source§

impl Clone for Code

source§

fn clone(&self) -> Code

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Code

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Code

source§

fn eq(&self, other: &Code) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Eq for Code

source§

impl StructuralEq for Code

source§

impl StructuralPartialEq for Code

Auto Trait Implementations§

§

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> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> JsonSchemaMaybe for T