use super::call_frame::*;
use crate::errors::*;
use crate::internal_prelude::*;
use crate::kernel::kernel_callback_api::*;
use crate::track::interface::*;
use radix_engine_interface::api::field_api::*;
use radix_substate_store_interface::db_key_mapper::*;
pub struct DroppedNode {
pub substates: NodeSubstates,
pub pinned_to_heap: bool,
}
pub trait KernelNodeApi {
fn kernel_pin_node(&mut self, node_id: NodeId) -> Result<(), RuntimeError>;
fn kernel_allocate_node_id(&mut self, entity_type: EntityType) -> Result<NodeId, RuntimeError>;
fn kernel_create_node(
&mut self,
node_id: NodeId,
node_substates: NodeSubstates,
) -> Result<(), RuntimeError>;
fn kernel_create_node_from(
&mut self,
node_id: NodeId,
partitions: BTreeMap<PartitionNumber, (NodeId, PartitionNumber)>,
) -> Result<(), RuntimeError>;
fn kernel_drop_node(&mut self, node_id: &NodeId) -> Result<DroppedNode, RuntimeError>;
}
pub trait KernelSubstateApi<L> {
fn kernel_mark_substate_as_transient(
&mut self,
node_id: NodeId,
partition_num: PartitionNumber,
key: SubstateKey,
) -> Result<(), RuntimeError>;
fn kernel_open_substate_with_default<F: FnOnce() -> IndexedScryptoValue>(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
substate_key: &SubstateKey,
flags: LockFlags,
default: Option<F>,
lock_data: L,
) -> Result<SubstateHandle, RuntimeError>;
fn kernel_open_substate(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
substate_key: &SubstateKey,
flags: LockFlags,
lock_data: L,
) -> Result<SubstateHandle, RuntimeError> {
self.kernel_open_substate_with_default(
node_id,
partition_num,
substate_key,
flags,
None::<fn() -> IndexedScryptoValue>,
lock_data,
)
}
fn kernel_get_lock_data(&mut self, lock_handle: SubstateHandle) -> Result<L, RuntimeError>;
fn kernel_close_substate(&mut self, lock_handle: SubstateHandle) -> Result<(), RuntimeError>;
fn kernel_read_substate(
&mut self,
lock_handle: SubstateHandle,
) -> Result<&IndexedScryptoValue, RuntimeError>;
fn kernel_write_substate(
&mut self,
lock_handle: SubstateHandle,
value: IndexedScryptoValue,
) -> Result<(), RuntimeError>;
fn kernel_set_substate(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
substate_key: SubstateKey,
value: IndexedScryptoValue,
) -> Result<(), RuntimeError>;
fn kernel_remove_substate(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
substate_key: &SubstateKey,
) -> Result<Option<IndexedScryptoValue>, RuntimeError>;
fn kernel_scan_sorted_substates(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
count: u32,
) -> Result<Vec<(SortedKey, IndexedScryptoValue)>, RuntimeError>;
fn kernel_scan_keys<K: SubstateKeyContent>(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
count: u32,
) -> Result<Vec<SubstateKey>, RuntimeError>;
fn kernel_drain_substates<K: SubstateKeyContent>(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
count: u32,
) -> Result<Vec<(SubstateKey, IndexedScryptoValue)>, RuntimeError>;
}
#[derive(Debug, Clone)]
pub struct KernelInvocation<C> {
pub call_frame_data: C,
pub args: IndexedScryptoValue,
}
impl<C: CallFrameReferences> KernelInvocation<C> {
#[allow(clippy::len_without_is_empty)]
pub fn len(&self) -> usize {
self.call_frame_data.len() + self.args.len()
}
}
pub trait KernelInvokeApi<C> {
fn kernel_invoke(
&mut self,
invocation: Box<KernelInvocation<C>>,
) -> Result<IndexedScryptoValue, RuntimeError>;
}
pub trait KernelStackApi {
type CallFrameData;
fn kernel_get_stack_id(&mut self) -> Result<usize, RuntimeError>;
fn kernel_switch_stack(&mut self, id: usize) -> Result<(), RuntimeError>;
fn kernel_send_to_stack(
&mut self,
id: usize,
value: &IndexedScryptoValue,
) -> Result<(), RuntimeError>;
fn kernel_set_call_frame_data(&mut self, data: Self::CallFrameData)
-> Result<(), RuntimeError>;
fn kernel_get_owned_nodes(&mut self) -> Result<Vec<NodeId>, RuntimeError>;
}
pub struct SystemState<'a, M: KernelCallbackObject> {
pub system: &'a mut M,
pub current_call_frame: &'a M::CallFrameData,
pub caller_call_frame: &'a M::CallFrameData,
}
pub trait KernelInternalApi {
type System: KernelCallbackObject;
#[inline]
fn kernel_get_system(&mut self) -> &mut Self::System {
self.kernel_get_system_state().system
}
fn kernel_get_system_state(&mut self) -> SystemState<'_, Self::System>;
fn kernel_get_current_stack_depth_uncosted(&self) -> usize;
fn kernel_get_current_stack_id_uncosted(&self) -> usize;
fn kernel_get_node_visibility_uncosted(&self, node_id: &NodeId) -> NodeVisibility;
fn kernel_read_substate_uncosted(
&self,
node_id: &NodeId,
partition_num: PartitionNumber,
substate_key: &SubstateKey,
) -> Option<&IndexedScryptoValue>;
}
pub trait KernelApi:
KernelNodeApi
+ KernelSubstateApi<<Self::CallbackObject as KernelCallbackObject>::LockData>
+ KernelInvokeApi<<Self::CallbackObject as KernelCallbackObject>::CallFrameData>
+ KernelStackApi<CallFrameData = <Self::CallbackObject as KernelCallbackObject>::CallFrameData>
+ KernelInternalApi<System = Self::CallbackObject>
{
type CallbackObject: KernelCallbackObject;
}