Skip to content

Commit 48301da

Browse files
committed
Extract r_safe_eval() from call_in()
1 parent ae288b3 commit 48301da

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

crates/harp/src/exec.rs

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -85,38 +85,42 @@ impl RFunction {
8585
}
8686

8787
pub fn call_in(&mut self, env: SEXP) -> Result<RObject> {
88-
unsafe {
89-
let user_call = self.call.build();
90-
let eval_call = RCall::new(r_symbol!("safe_evalq"))
91-
.add(user_call.sexp)
92-
.add(env)
93-
.build();
88+
let user_call = self.call.build();
89+
r_safe_eval(user_call, env.into())
90+
}
91+
}
9492

95-
let result = RObject::new(Rf_eval(eval_call.sexp, HARP_ENV.unwrap()));
93+
pub fn r_safe_eval(expr: RObject, env: RObject) -> crate::Result<RObject> {
94+
unsafe {
95+
let eval_call = RCall::new(r_symbol!("safe_evalq"))
96+
.add(expr.sexp)
97+
.add(env)
98+
.build();
9699

97-
// Invariant of return value: List of length 2 [output, error].
98-
// These are exclusive.
99-
let out = r_list_get(result.sexp, 0);
100-
let err = r_list_get(result.sexp, 1);
100+
let result = RObject::new(Rf_eval(eval_call.sexp, HARP_ENV.unwrap()));
101101

102-
if err != r_null() {
103-
let code = r_stringify(user_call.sexp, "\n")?;
102+
// Invariant of return value: List of length 2 [output, error].
103+
// These are exclusive.
104+
let out = r_list_get(result.sexp, 0);
105+
let err = r_list_get(result.sexp, 1);
104106

105-
// Invariant of error slot: Character vector of length 2 [message, trace],
106-
// with `trace` possibly an empty string.
107-
let err = CharacterVector::new(err)?;
107+
if err != r_null() {
108+
let code = r_stringify(expr.sexp, "\n")?;
108109

109-
let message = err.get_value(0)?;
110-
let trace = err.get_value(1)?;
110+
// Invariant of error slot: Character vector of length 2 [message, trace],
111+
// with `trace` possibly an empty string.
112+
let err = CharacterVector::new(err)?;
111113

112-
return Err(Error::EvaluationError {
113-
code,
114-
message: message + "\nTrace:\n" + &trace,
115-
});
116-
}
114+
let message = err.get_value(0)?;
115+
let trace = err.get_value(1)?;
117116

118-
return Ok(RObject::new(out));
117+
return Err(Error::EvaluationError {
118+
code,
119+
message: message + "\nTrace:\n" + &trace,
120+
});
119121
}
122+
123+
return Ok(RObject::new(out));
120124
}
121125
}
122126

0 commit comments

Comments
 (0)