Allow primop creation from immutable eval state
This commit is contained in:
@@ -886,7 +886,7 @@ impl EvalState {
|
||||
#[doc(alias = "create_thunk")]
|
||||
#[doc(alias = "lazy_value")]
|
||||
pub fn new_value_thunk(
|
||||
&mut self,
|
||||
&self,
|
||||
name: &str,
|
||||
f: Box<dyn Fn(&mut EvalState) -> std::result::Result<Value, Box<dyn std::error::Error>>>,
|
||||
) -> Result<Value> {
|
||||
@@ -2282,7 +2282,7 @@ mod tests {
|
||||
fn eval_state_primop_anon_call() {
|
||||
gc_registering_current_thread(|| {
|
||||
let store = Store::open(None, []).unwrap();
|
||||
let mut es = EvalState::new(store, []).unwrap();
|
||||
let es = EvalState::new(store, []).unwrap();
|
||||
let bias: Arc<Mutex<Int>> = Arc::new(Mutex::new(0));
|
||||
let bias_control = bias.clone();
|
||||
|
||||
@@ -2301,7 +2301,7 @@ mod tests {
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let f = primop.new_value(&mut es).unwrap();
|
||||
let f = primop.new_value(&es).unwrap();
|
||||
|
||||
{
|
||||
*bias_control.lock().unwrap() = 10;
|
||||
@@ -2364,7 +2364,7 @@ mod tests {
|
||||
fn eval_state_primop_anon_call_no_args() {
|
||||
gc_registering_current_thread(|| {
|
||||
let store = Store::open(None, []).unwrap();
|
||||
let mut es = EvalState::new(store, []).unwrap();
|
||||
let es = EvalState::new(store, []).unwrap();
|
||||
let v = es
|
||||
.new_value_thunk(
|
||||
"test_thunk",
|
||||
@@ -2385,7 +2385,7 @@ mod tests {
|
||||
fn eval_state_primop_anon_call_no_args_lazy() {
|
||||
gc_registering_current_thread(|| {
|
||||
let store = Store::open(None, []).unwrap();
|
||||
let mut es = EvalState::new(store, []).unwrap();
|
||||
let es = EvalState::new(store, []).unwrap();
|
||||
let v = es
|
||||
.new_value_thunk(
|
||||
"test_thunk",
|
||||
@@ -2423,7 +2423,7 @@ mod tests {
|
||||
pub fn eval_state_primop_custom() {
|
||||
gc_registering_current_thread(|| {
|
||||
let store = Store::open(None, []).unwrap();
|
||||
let mut es = EvalState::new(store, []).unwrap();
|
||||
let es = EvalState::new(store, []).unwrap();
|
||||
let primop = primop::PrimOp::new(
|
||||
primop::PrimOpMeta {
|
||||
name: cstr!("frobnicate"),
|
||||
@@ -2437,7 +2437,7 @@ mod tests {
|
||||
}),
|
||||
)
|
||||
.unwrap();
|
||||
let f = primop.new_value(&mut es).unwrap();
|
||||
let f = primop.new_value(&es).unwrap();
|
||||
let a = es.new_value_int(2).unwrap();
|
||||
let b = es.new_value_int(3).unwrap();
|
||||
let fa = es.call(f, a).unwrap();
|
||||
@@ -2455,7 +2455,7 @@ mod tests {
|
||||
pub fn eval_state_primop_custom_throw() {
|
||||
gc_registering_current_thread(|| {
|
||||
let store = Store::open(None, []).unwrap();
|
||||
let mut es = EvalState::new(store, []).unwrap();
|
||||
let es = EvalState::new(store, []).unwrap();
|
||||
let primop = primop::PrimOp::new(
|
||||
primop::PrimOpMeta {
|
||||
name: cstr!("frobnicate"),
|
||||
@@ -2469,7 +2469,7 @@ mod tests {
|
||||
}),
|
||||
)
|
||||
.unwrap();
|
||||
let f = primop.new_value(&mut es).unwrap();
|
||||
let f = primop.new_value(&es).unwrap();
|
||||
let a = es.new_value_int(0).unwrap();
|
||||
match es.call(f, a) {
|
||||
Ok(_) => panic!("expected an error"),
|
||||
@@ -2916,7 +2916,7 @@ mod tests {
|
||||
fn eval_state_primop_recoverable_error() {
|
||||
gc_registering_current_thread(|| {
|
||||
let store = Store::open(None, []).unwrap();
|
||||
let mut es = EvalState::new(store, []).unwrap();
|
||||
let es = EvalState::new(store, []).unwrap();
|
||||
|
||||
let call_count = std::cell::Cell::new(0u32);
|
||||
let v = es
|
||||
@@ -2958,7 +2958,7 @@ mod tests {
|
||||
fn eval_state_primop_recoverable_error_in_chain() {
|
||||
gc_registering_current_thread(|| {
|
||||
let store = Store::open(None, []).unwrap();
|
||||
let mut es = EvalState::new(store, []).unwrap();
|
||||
let es = EvalState::new(store, []).unwrap();
|
||||
|
||||
let call_count = std::cell::Cell::new(0u32);
|
||||
let v = es
|
||||
|
||||
@@ -92,7 +92,7 @@ impl PrimOp {
|
||||
/// does not affect `builtins`.
|
||||
#[doc(alias = "make_primop")]
|
||||
#[doc(alias = "create_function")]
|
||||
pub fn new_value(self, eval_state: &mut EvalState) -> Result<Value, EvalStateError> {
|
||||
pub fn new_value(self, eval_state: &EvalState) -> Result<Value, EvalStateError> {
|
||||
let value = eval_state.new_value_uninitialized()?;
|
||||
let mut ctx = Context::new();
|
||||
unsafe {
|
||||
|
||||
Reference in New Issue
Block a user