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 libraries;
11mod prelude;
12mod stack;
13mod value;
14
15pub use cancel::CancellationToken;
16pub use engine::{
17    AsyncHandler, AsyncNativeCallable, AsyncNativeCallableCancellable, Engine, EngineOptions,
18    Export, Handler, NativeFn, NativeFuture, OverloadedFn, PRELUDE_LIBRARY_NAME, PreludeMode,
19    ROOT_LIBRARY_NAME, RexAdt, RexDefault, SyncNativeCallable, collect_adts_error_to_engine,
20};
21pub use env::Env;
22pub use error::{EngineError, LibraryError};
23pub use libraries::virtual_export_name;
24pub use libraries::{
25    CanonicalSymbol, Library, LibraryExports, LibraryId, LibraryInstance, LibraryKey, ReplState,
26    ResolveRequest, ResolvedLibrary, SymbolKind,
27};
28pub use stack::DEFAULT_STACK_SIZE_BYTES;
29pub use value::{
30    Closure, FromPointer, Heap, IntoPointer, Pointer, RexType, Value, ValueDisplayOptions,
31    ValueRef, closure_debug, closure_eq, pointer_display, pointer_display_with, pointer_eq,
32    value_debug, value_eq,
33};
34
35#[macro_export]
36macro_rules! assert_pointer_eq {
37    ($heap:expr, $left:expr, $right:expr $(,)?) => {{
38        let __heap = $heap;
39        match (&$left, &$right) {
40            (__left, __right) => {
41                let __left_ptr: &$crate::Pointer = __left;
42                let __right_ptr: &$crate::Pointer = __right;
43                let __equal =
44                    $crate::pointer_eq(__heap, __left_ptr, __right_ptr).unwrap_or_else(|err| {
45                        panic!("assert_pointer_eq failed to compare pointers: {err}")
46                    });
47                if !__equal {
48                    let __left_value = __heap.get(__left_ptr).unwrap_or_else(|err| {
49                        panic!("assert_pointer_eq failed to dereference left pointer: {err}")
50                    });
51                    let __right_value = __heap.get(__right_ptr).unwrap_or_else(|err| {
52                        panic!("assert_pointer_eq failed to dereference right pointer: {err}")
53                    });
54                    let __left_dbg = $crate::value_debug(__heap, __left_value.as_ref())
55                        .unwrap_or_else(|err| format!("<value_debug error: {err}>"));
56                    let __right_dbg = $crate::value_debug(__heap, __right_value.as_ref())
57                        .unwrap_or_else(|err| format!("<value_debug error: {err}>"));
58                    panic!(
59                        "assertion `pointer values are equal` failed\n  left: {}\n right: {}",
60                        __left_dbg, __right_dbg
61                    );
62                }
63            }
64        }
65    }};
66}