Skip to main content

rexlang_engine/
lib.rs

1#![forbid(unsafe_code)]
2#![cfg_attr(not(test), deny(clippy::unwrap_used, clippy::expect_used))]
3
4//! Evaluation engine for Rex.
5
6mod cancel;
7mod engine;
8mod env;
9mod error;
10mod modules;
11mod prelude;
12mod stack;
13mod value;
14
15pub use cancel::CancellationToken;
16pub use engine::{
17    AsyncHandler, AsyncNativeCallable, AsyncNativeCallableCancellable, Engine, EngineOptions,
18    Export, Handler, Module, NativeFn, NativeFuture, OverloadedFn, PRELUDE_MODULE_NAME,
19    PreludeMode, ROOT_MODULE_NAME, RexAdt, RexDefault, SyncNativeCallable,
20    collect_adts_error_to_engine,
21};
22pub use env::Env;
23pub use error::{EngineError, ModuleError};
24pub use modules::virtual_export_name;
25pub use modules::{
26    CanonicalSymbol, ModuleExports, ModuleId, ModuleInstance, ModuleKey, ReplState, ResolveRequest,
27    ResolvedModule, SymbolKind,
28};
29pub use stack::DEFAULT_STACK_SIZE_BYTES;
30pub use value::{
31    Closure, FromPointer, Heap, IntoPointer, Pointer, RexType, Value, ValueDisplayOptions,
32    ValueRef, closure_debug, closure_eq, pointer_display, pointer_display_with, pointer_eq,
33    value_debug, value_eq,
34};
35
36#[macro_export]
37macro_rules! assert_pointer_eq {
38    ($heap:expr, $left:expr, $right:expr $(,)?) => {{
39        let __heap = $heap;
40        match (&$left, &$right) {
41            (__left, __right) => {
42                let __left_ptr: &$crate::Pointer = __left;
43                let __right_ptr: &$crate::Pointer = __right;
44                let __equal =
45                    $crate::pointer_eq(__heap, __left_ptr, __right_ptr).unwrap_or_else(|err| {
46                        panic!("assert_pointer_eq failed to compare pointers: {err}")
47                    });
48                if !__equal {
49                    let __left_value = __heap.get(__left_ptr).unwrap_or_else(|err| {
50                        panic!("assert_pointer_eq failed to dereference left pointer: {err}")
51                    });
52                    let __right_value = __heap.get(__right_ptr).unwrap_or_else(|err| {
53                        panic!("assert_pointer_eq failed to dereference right pointer: {err}")
54                    });
55                    let __left_dbg = $crate::value_debug(__heap, __left_value.as_ref())
56                        .unwrap_or_else(|err| format!("<value_debug error: {err}>"));
57                    let __right_dbg = $crate::value_debug(__heap, __right_value.as_ref())
58                        .unwrap_or_else(|err| format!("<value_debug error: {err}>"));
59                    panic!(
60                        "assertion `pointer values are equal` failed\n  left: {}\n right: {}",
61                        __left_dbg, __right_dbg
62                    );
63                }
64            }
65        }
66    }};
67}