chore(tvix): Generator{Request|Response} -> VM{Request|Response}
We settled on this being the most reasonable name for this construct. Change-Id: Ic31c45461a842f22aa05f4446123fe3a61dfdbc0 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8291 Tested-by: BuildkiteCI Autosubmit: tazjin <tazjin@tvl.su> Reviewed-by: raitobezarius <tvl@lahfa.xyz>
This commit is contained in:
parent
1e80b9ea8b
commit
d456705352
3 changed files with 121 additions and 130 deletions
|
@ -11,7 +11,7 @@ use std::rc::Rc;
|
|||
use tabwriter::TabWriter;
|
||||
|
||||
use crate::chunk::Chunk;
|
||||
use crate::generators::GeneratorRequest;
|
||||
use crate::generators::VMRequest;
|
||||
use crate::opcode::{CodeIdx, OpCode};
|
||||
use crate::value::Lambda;
|
||||
use crate::SourceCode;
|
||||
|
@ -58,7 +58,7 @@ pub trait RuntimeObserver {
|
|||
fn observe_suspend_generator(&mut self, _frame_at: usize, _name: &str, _stack: &[Value]) {}
|
||||
|
||||
/// Called when a generator requests an action from the VM.
|
||||
fn observe_generator_request(&mut self, _name: &str, _msg: &GeneratorRequest) {}
|
||||
fn observe_generator_request(&mut self, _name: &str, _msg: &VMRequest) {}
|
||||
|
||||
/// Called when the runtime replaces the current call frame for a
|
||||
/// tail call.
|
||||
|
@ -249,7 +249,7 @@ impl<W: Write> RuntimeObserver for TracingObserver<W> {
|
|||
self.write_stack(stack);
|
||||
}
|
||||
|
||||
fn observe_generator_request(&mut self, name: &str, msg: &GeneratorRequest) {
|
||||
fn observe_generator_request(&mut self, name: &str, msg: &VMRequest) {
|
||||
let _ = writeln!(
|
||||
&mut self.writer,
|
||||
"=== generator '{}' requested {} ===",
|
||||
|
|
|
@ -32,12 +32,12 @@ pub(crate) enum GeneratorState {
|
|||
AwaitingValue,
|
||||
}
|
||||
|
||||
/// Messages that can be sent from generators to the VM. In most
|
||||
/// Messages that can be sent from generators *to* the VM. In most
|
||||
/// cases, the VM will suspend the generator when receiving a message
|
||||
/// and enter some other frame to process the request.
|
||||
///
|
||||
/// Responses are returned to generators via the [`GeneratorResponse`] type.
|
||||
pub enum GeneratorRequest {
|
||||
pub enum VMRequest {
|
||||
/// Request that the VM forces this value. This message is first sent to the
|
||||
/// VM with the unforced value, then returned to the generator with the
|
||||
/// forced result.
|
||||
|
@ -125,16 +125,16 @@ pub enum GeneratorRequest {
|
|||
}
|
||||
|
||||
/// Human-readable representation of a generator message, used by observers.
|
||||
impl Display for GeneratorRequest {
|
||||
impl Display for VMRequest {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
GeneratorRequest::ForceValue(v) => write!(f, "force_value({})", v.type_of()),
|
||||
GeneratorRequest::DeepForceValue(v, _) => {
|
||||
VMRequest::ForceValue(v) => write!(f, "force_value({})", v.type_of()),
|
||||
VMRequest::DeepForceValue(v, _) => {
|
||||
write!(f, "deep_force_value({})", v.type_of())
|
||||
}
|
||||
GeneratorRequest::WithValue(_) => write!(f, "with_value"),
|
||||
GeneratorRequest::CapturedWithValue(_) => write!(f, "captured_with_value"),
|
||||
GeneratorRequest::NixEquality(values, ptr_eq) => {
|
||||
VMRequest::WithValue(_) => write!(f, "with_value"),
|
||||
VMRequest::CapturedWithValue(_) => write!(f, "captured_with_value"),
|
||||
VMRequest::NixEquality(values, ptr_eq) => {
|
||||
write!(
|
||||
f,
|
||||
"nix_eq({}, {}, PointerEquality::{:?})",
|
||||
|
@ -143,39 +143,39 @@ impl Display for GeneratorRequest {
|
|||
ptr_eq
|
||||
)
|
||||
}
|
||||
GeneratorRequest::StackPush(v) => write!(f, "stack_push({})", v.type_of()),
|
||||
GeneratorRequest::StackPop => write!(f, "stack_pop"),
|
||||
GeneratorRequest::StringCoerce(v, kind) => match kind {
|
||||
VMRequest::StackPush(v) => write!(f, "stack_push({})", v.type_of()),
|
||||
VMRequest::StackPop => write!(f, "stack_pop"),
|
||||
VMRequest::StringCoerce(v, kind) => match kind {
|
||||
CoercionKind::Weak => write!(f, "weak_string_coerce({})", v.type_of()),
|
||||
CoercionKind::Strong => write!(f, "strong_string_coerce({})", v.type_of()),
|
||||
},
|
||||
GeneratorRequest::Call(v) => write!(f, "call({})", v),
|
||||
GeneratorRequest::EnterLambda { lambda, .. } => {
|
||||
VMRequest::Call(v) => write!(f, "call({})", v),
|
||||
VMRequest::EnterLambda { lambda, .. } => {
|
||||
write!(f, "enter_lambda({:p})", *lambda)
|
||||
}
|
||||
GeneratorRequest::EmitWarning(_) => write!(f, "emit_warning"),
|
||||
GeneratorRequest::EmitWarningKind(_) => write!(f, "emit_warning_kind"),
|
||||
GeneratorRequest::ImportCacheLookup(p) => {
|
||||
VMRequest::EmitWarning(_) => write!(f, "emit_warning"),
|
||||
VMRequest::EmitWarningKind(_) => write!(f, "emit_warning_kind"),
|
||||
VMRequest::ImportCacheLookup(p) => {
|
||||
write!(f, "import_cache_lookup({})", p.to_string_lossy())
|
||||
}
|
||||
GeneratorRequest::ImportCachePut(p, _) => {
|
||||
VMRequest::ImportCachePut(p, _) => {
|
||||
write!(f, "import_cache_put({})", p.to_string_lossy())
|
||||
}
|
||||
GeneratorRequest::PathImport(p) => write!(f, "path_import({})", p.to_string_lossy()),
|
||||
GeneratorRequest::ReadToString(p) => {
|
||||
VMRequest::PathImport(p) => write!(f, "path_import({})", p.to_string_lossy()),
|
||||
VMRequest::ReadToString(p) => {
|
||||
write!(f, "read_to_string({})", p.to_string_lossy())
|
||||
}
|
||||
GeneratorRequest::PathExists(p) => write!(f, "path_exists({})", p.to_string_lossy()),
|
||||
GeneratorRequest::ReadDir(p) => write!(f, "read_dir({})", p.to_string_lossy()),
|
||||
GeneratorRequest::Span => write!(f, "span"),
|
||||
GeneratorRequest::TryForce(v) => write!(f, "try_force({})", v.type_of()),
|
||||
GeneratorRequest::ToJson(v) => write!(f, "to_json({})", v.type_of()),
|
||||
VMRequest::PathExists(p) => write!(f, "path_exists({})", p.to_string_lossy()),
|
||||
VMRequest::ReadDir(p) => write!(f, "read_dir({})", p.to_string_lossy()),
|
||||
VMRequest::Span => write!(f, "span"),
|
||||
VMRequest::TryForce(v) => write!(f, "try_force({})", v.type_of()),
|
||||
VMRequest::ToJson(v) => write!(f, "to_json({})", v.type_of()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Responses returned to generators from the VM.
|
||||
pub enum GeneratorResponse {
|
||||
/// Responses returned to generators *from* the VM.
|
||||
pub enum VMResponse {
|
||||
/// Empty message. Passed to the generator as the first message,
|
||||
/// or when return values were optional.
|
||||
Empty,
|
||||
|
@ -197,24 +197,21 @@ pub enum GeneratorResponse {
|
|||
ForceError,
|
||||
}
|
||||
|
||||
impl Display for GeneratorResponse {
|
||||
impl Display for VMResponse {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
GeneratorResponse::Empty => write!(f, "empty"),
|
||||
GeneratorResponse::Value(v) => write!(f, "value({})", v),
|
||||
GeneratorResponse::Path(p) => write!(f, "path({})", p.to_string_lossy()),
|
||||
GeneratorResponse::Directory(d) => write!(f, "dir(len = {})", d.len()),
|
||||
GeneratorResponse::Span(_) => write!(f, "span"),
|
||||
GeneratorResponse::ForceError => write!(f, "force_error"),
|
||||
VMResponse::Empty => write!(f, "empty"),
|
||||
VMResponse::Value(v) => write!(f, "value({})", v),
|
||||
VMResponse::Path(p) => write!(f, "path({})", p.to_string_lossy()),
|
||||
VMResponse::Directory(d) => write!(f, "dir(len = {})", d.len()),
|
||||
VMResponse::Span(_) => write!(f, "span"),
|
||||
VMResponse::ForceError => write!(f, "force_error"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) type Generator = Gen<
|
||||
GeneratorRequest,
|
||||
GeneratorResponse,
|
||||
Pin<Box<dyn Future<Output = Result<Value, ErrorKind>>>>,
|
||||
>;
|
||||
pub(crate) type Generator =
|
||||
Gen<VMRequest, VMResponse, Pin<Box<dyn Future<Output = Result<Value, ErrorKind>>>>>;
|
||||
|
||||
/// Helper function to provide type annotations which are otherwise difficult to
|
||||
/// infer.
|
||||
|
@ -262,16 +259,16 @@ impl<'o> VM<'o> {
|
|||
frame_id: usize,
|
||||
state: GeneratorState,
|
||||
mut generator: Generator,
|
||||
initial_message: Option<GeneratorResponse>,
|
||||
initial_message: Option<VMResponse>,
|
||||
) -> EvalResult<bool> {
|
||||
// Determine what to send to the generator based on its state.
|
||||
let mut message = match (initial_message, state) {
|
||||
(Some(msg), _) => msg,
|
||||
(_, GeneratorState::Running) => GeneratorResponse::Empty,
|
||||
(_, GeneratorState::Running) => VMResponse::Empty,
|
||||
|
||||
// If control returned here, and the generator is
|
||||
// awaiting a value, send it the top of the stack.
|
||||
(_, GeneratorState::AwaitingValue) => GeneratorResponse::Value(self.stack_pop()),
|
||||
(_, GeneratorState::AwaitingValue) => VMResponse::Value(self.stack_pop()),
|
||||
};
|
||||
|
||||
loop {
|
||||
|
@ -282,26 +279,26 @@ impl<'o> VM<'o> {
|
|||
self.observer.observe_generator_request(name, &request);
|
||||
|
||||
match request {
|
||||
GeneratorRequest::StackPush(value) => {
|
||||
VMRequest::StackPush(value) => {
|
||||
self.stack.push(value);
|
||||
message = GeneratorResponse::Empty;
|
||||
message = VMResponse::Empty;
|
||||
}
|
||||
|
||||
GeneratorRequest::StackPop => {
|
||||
message = GeneratorResponse::Value(self.stack_pop());
|
||||
VMRequest::StackPop => {
|
||||
message = VMResponse::Value(self.stack_pop());
|
||||
}
|
||||
|
||||
// Generator has requested a force, which means that
|
||||
// this function prepares the frame stack and yields
|
||||
// back to the outer VM loop.
|
||||
GeneratorRequest::ForceValue(value) => {
|
||||
VMRequest::ForceValue(value) => {
|
||||
self.reenqueue_generator(name, span.clone(), generator);
|
||||
self.enqueue_generator("force", span, |co| value.force(co));
|
||||
return Ok(false);
|
||||
}
|
||||
|
||||
// Generator has requested a deep-force.
|
||||
GeneratorRequest::DeepForceValue(value, thunk_set) => {
|
||||
VMRequest::DeepForceValue(value, thunk_set) => {
|
||||
self.reenqueue_generator(name, span.clone(), generator);
|
||||
self.enqueue_generator("deep_force", span, |co| {
|
||||
value.deep_force(co, thunk_set)
|
||||
|
@ -312,7 +309,7 @@ impl<'o> VM<'o> {
|
|||
// Generator has requested a value from the with-stack.
|
||||
// Logic is similar to `ForceValue`, except with the
|
||||
// value being taken from that stack.
|
||||
GeneratorRequest::WithValue(idx) => {
|
||||
VMRequest::WithValue(idx) => {
|
||||
self.reenqueue_generator(name, span.clone(), generator);
|
||||
|
||||
let value = self.stack[self.with_stack[idx]].clone();
|
||||
|
@ -324,7 +321,7 @@ impl<'o> VM<'o> {
|
|||
// Generator has requested a value from the *captured*
|
||||
// with-stack. Logic is same as above, except for the
|
||||
// value being from that stack.
|
||||
GeneratorRequest::CapturedWithValue(idx) => {
|
||||
VMRequest::CapturedWithValue(idx) => {
|
||||
self.reenqueue_generator(name, span.clone(), generator);
|
||||
|
||||
let call_frame = self.last_call_frame()
|
||||
|
@ -336,7 +333,7 @@ impl<'o> VM<'o> {
|
|||
return Ok(false);
|
||||
}
|
||||
|
||||
GeneratorRequest::NixEquality(values, ptr_eq) => {
|
||||
VMRequest::NixEquality(values, ptr_eq) => {
|
||||
let values = *values;
|
||||
self.reenqueue_generator(name, span.clone(), generator);
|
||||
self.enqueue_generator("nix_eq", span, |co| {
|
||||
|
@ -345,7 +342,7 @@ impl<'o> VM<'o> {
|
|||
return Ok(false);
|
||||
}
|
||||
|
||||
GeneratorRequest::StringCoerce(val, kind) => {
|
||||
VMRequest::StringCoerce(val, kind) => {
|
||||
self.reenqueue_generator(name, span.clone(), generator);
|
||||
self.enqueue_generator("coerce_to_string", span, |co| {
|
||||
val.coerce_to_string(co, kind)
|
||||
|
@ -353,13 +350,13 @@ impl<'o> VM<'o> {
|
|||
return Ok(false);
|
||||
}
|
||||
|
||||
GeneratorRequest::Call(callable) => {
|
||||
VMRequest::Call(callable) => {
|
||||
self.reenqueue_generator(name, span.clone(), generator);
|
||||
self.call_value(span, None, callable)?;
|
||||
return Ok(false);
|
||||
}
|
||||
|
||||
GeneratorRequest::EnterLambda {
|
||||
VMRequest::EnterLambda {
|
||||
lambda,
|
||||
upvalues,
|
||||
light_span,
|
||||
|
@ -379,71 +376,71 @@ impl<'o> VM<'o> {
|
|||
return Ok(false);
|
||||
}
|
||||
|
||||
GeneratorRequest::EmitWarning(warning) => {
|
||||
VMRequest::EmitWarning(warning) => {
|
||||
self.push_warning(warning);
|
||||
message = GeneratorResponse::Empty;
|
||||
message = VMResponse::Empty;
|
||||
}
|
||||
|
||||
GeneratorRequest::EmitWarningKind(kind) => {
|
||||
VMRequest::EmitWarningKind(kind) => {
|
||||
self.emit_warning(kind);
|
||||
message = GeneratorResponse::Empty;
|
||||
message = VMResponse::Empty;
|
||||
}
|
||||
|
||||
GeneratorRequest::ImportCacheLookup(path) => {
|
||||
VMRequest::ImportCacheLookup(path) => {
|
||||
if let Some(cached) = self.import_cache.get(&path) {
|
||||
message = GeneratorResponse::Value(cached.clone());
|
||||
message = VMResponse::Value(cached.clone());
|
||||
} else {
|
||||
message = GeneratorResponse::Empty;
|
||||
message = VMResponse::Empty;
|
||||
}
|
||||
}
|
||||
|
||||
GeneratorRequest::ImportCachePut(path, value) => {
|
||||
VMRequest::ImportCachePut(path, value) => {
|
||||
self.import_cache.insert(path, value);
|
||||
message = GeneratorResponse::Empty;
|
||||
message = VMResponse::Empty;
|
||||
}
|
||||
|
||||
GeneratorRequest::PathImport(path) => {
|
||||
VMRequest::PathImport(path) => {
|
||||
let imported = self
|
||||
.io_handle
|
||||
.import_path(&path)
|
||||
.map_err(|kind| Error::new(kind, span.span()))?;
|
||||
|
||||
message = GeneratorResponse::Path(imported);
|
||||
message = VMResponse::Path(imported);
|
||||
}
|
||||
|
||||
GeneratorRequest::ReadToString(path) => {
|
||||
VMRequest::ReadToString(path) => {
|
||||
let content = self
|
||||
.io_handle
|
||||
.read_to_string(path)
|
||||
.map_err(|kind| Error::new(kind, span.span()))?;
|
||||
|
||||
message = GeneratorResponse::Value(Value::String(content.into()))
|
||||
message = VMResponse::Value(Value::String(content.into()))
|
||||
}
|
||||
|
||||
GeneratorRequest::PathExists(path) => {
|
||||
VMRequest::PathExists(path) => {
|
||||
let exists = self
|
||||
.io_handle
|
||||
.path_exists(path)
|
||||
.map(Value::Bool)
|
||||
.map_err(|kind| Error::new(kind, span.span()))?;
|
||||
|
||||
message = GeneratorResponse::Value(exists);
|
||||
message = VMResponse::Value(exists);
|
||||
}
|
||||
|
||||
GeneratorRequest::ReadDir(path) => {
|
||||
VMRequest::ReadDir(path) => {
|
||||
let dir = self
|
||||
.io_handle
|
||||
.read_dir(path)
|
||||
.map_err(|kind| Error::new(kind, span.span()))?;
|
||||
|
||||
message = GeneratorResponse::Directory(dir);
|
||||
message = VMResponse::Directory(dir);
|
||||
}
|
||||
|
||||
GeneratorRequest::Span => {
|
||||
message = GeneratorResponse::Span(self.reasonable_light_span());
|
||||
VMRequest::Span => {
|
||||
message = VMResponse::Span(self.reasonable_light_span());
|
||||
}
|
||||
|
||||
GeneratorRequest::TryForce(value) => {
|
||||
VMRequest::TryForce(value) => {
|
||||
self.try_eval_frames.push(frame_id);
|
||||
self.reenqueue_generator(name, span.clone(), generator);
|
||||
|
||||
|
@ -456,7 +453,7 @@ impl<'o> VM<'o> {
|
|||
return Ok(false);
|
||||
}
|
||||
|
||||
GeneratorRequest::ToJson(value) => {
|
||||
VMRequest::ToJson(value) => {
|
||||
self.reenqueue_generator(name, span.clone(), generator);
|
||||
self.enqueue_generator("to_json", span, |co| {
|
||||
value.to_json_generator(co)
|
||||
|
@ -478,14 +475,14 @@ impl<'o> VM<'o> {
|
|||
}
|
||||
}
|
||||
|
||||
pub type GenCo = Co<GeneratorRequest, GeneratorResponse>;
|
||||
pub type GenCo = Co<VMRequest, VMResponse>;
|
||||
|
||||
// -- Implementation of concrete generator use-cases.
|
||||
|
||||
/// Request that the VM place the given value on its stack.
|
||||
pub async fn request_stack_push(co: &GenCo, val: Value) {
|
||||
match co.yield_(GeneratorRequest::StackPush(val)).await {
|
||||
GeneratorResponse::Empty => {}
|
||||
match co.yield_(VMRequest::StackPush(val)).await {
|
||||
VMResponse::Empty => {}
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -496,8 +493,8 @@ pub async fn request_stack_push(co: &GenCo, val: Value) {
|
|||
/// Request that the VM pop a value from the stack and return it to the
|
||||
/// generator.
|
||||
pub async fn request_stack_pop(co: &GenCo) -> Value {
|
||||
match co.yield_(GeneratorRequest::StackPop).await {
|
||||
GeneratorResponse::Value(value) => value,
|
||||
match co.yield_(VMRequest::StackPop).await {
|
||||
VMResponse::Value(value) => value,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -508,8 +505,8 @@ pub async fn request_stack_pop(co: &GenCo) -> Value {
|
|||
/// Force any value and return the evaluated result from the VM.
|
||||
pub async fn request_force(co: &GenCo, val: Value) -> Value {
|
||||
if let Value::Thunk(_) = val {
|
||||
match co.yield_(GeneratorRequest::ForceValue(val)).await {
|
||||
GeneratorResponse::Value(value) => value,
|
||||
match co.yield_(VMRequest::ForceValue(val)).await {
|
||||
VMResponse::Value(value) => value,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -524,9 +521,9 @@ pub async fn request_force(co: &GenCo, val: Value) -> Value {
|
|||
/// error occured.
|
||||
pub(crate) async fn request_try_force(co: &GenCo, val: Value) -> Option<Value> {
|
||||
if let Value::Thunk(_) = val {
|
||||
match co.yield_(GeneratorRequest::TryForce(val)).await {
|
||||
GeneratorResponse::Value(value) => Some(value),
|
||||
GeneratorResponse::ForceError => None,
|
||||
match co.yield_(VMRequest::TryForce(val)).await {
|
||||
VMResponse::Value(value) => Some(value),
|
||||
VMResponse::ForceError => None,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -541,8 +538,8 @@ pub(crate) async fn request_try_force(co: &GenCo, val: Value) -> Option<Value> {
|
|||
/// on the stack.
|
||||
pub async fn request_call(co: &GenCo, val: Value) -> Value {
|
||||
let val = request_force(co, val).await;
|
||||
match co.yield_(GeneratorRequest::Call(val)).await {
|
||||
GeneratorResponse::Value(value) => value,
|
||||
match co.yield_(VMRequest::Call(val)).await {
|
||||
VMResponse::Value(value) => value,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -576,8 +573,8 @@ where
|
|||
pub async fn request_string_coerce(co: &GenCo, val: Value, kind: CoercionKind) -> NixString {
|
||||
match val {
|
||||
Value::String(s) => s,
|
||||
_ => match co.yield_(GeneratorRequest::StringCoerce(val, kind)).await {
|
||||
GeneratorResponse::Value(value) => value
|
||||
_ => match co.yield_(VMRequest::StringCoerce(val, kind)).await {
|
||||
VMResponse::Value(value) => value
|
||||
.to_str()
|
||||
.expect("coerce_to_string always returns a string"),
|
||||
msg => panic!(
|
||||
|
@ -590,11 +587,8 @@ pub async fn request_string_coerce(co: &GenCo, val: Value, kind: CoercionKind) -
|
|||
|
||||
/// Deep-force any value and return the evaluated result from the VM.
|
||||
pub async fn request_deep_force(co: &GenCo, val: Value, thunk_set: SharedThunkSet) -> Value {
|
||||
match co
|
||||
.yield_(GeneratorRequest::DeepForceValue(val, thunk_set))
|
||||
.await
|
||||
{
|
||||
GeneratorResponse::Value(value) => value,
|
||||
match co.yield_(VMRequest::DeepForceValue(val, thunk_set)).await {
|
||||
VMResponse::Value(value) => value,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -610,10 +604,10 @@ pub(crate) async fn check_equality(
|
|||
ptr_eq: PointerEquality,
|
||||
) -> Result<bool, ErrorKind> {
|
||||
match co
|
||||
.yield_(GeneratorRequest::NixEquality(Box::new((a, b)), ptr_eq))
|
||||
.yield_(VMRequest::NixEquality(Box::new((a, b)), ptr_eq))
|
||||
.await
|
||||
{
|
||||
GeneratorResponse::Value(value) => value.as_bool(),
|
||||
VMResponse::Value(value) => value.as_bool(),
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -623,8 +617,8 @@ pub(crate) async fn check_equality(
|
|||
|
||||
/// Emit a fully constructed runtime warning.
|
||||
pub(crate) async fn emit_warning(co: &GenCo, warning: EvalWarning) {
|
||||
match co.yield_(GeneratorRequest::EmitWarning(warning)).await {
|
||||
GeneratorResponse::Empty => {}
|
||||
match co.yield_(VMRequest::EmitWarning(warning)).await {
|
||||
VMResponse::Empty => {}
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -634,8 +628,8 @@ pub(crate) async fn emit_warning(co: &GenCo, warning: EvalWarning) {
|
|||
|
||||
/// Emit a runtime warning with the span of the current generator.
|
||||
pub(crate) async fn emit_warning_kind(co: &GenCo, kind: WarningKind) {
|
||||
match co.yield_(GeneratorRequest::EmitWarningKind(kind)).await {
|
||||
GeneratorResponse::Empty => {}
|
||||
match co.yield_(VMRequest::EmitWarningKind(kind)).await {
|
||||
VMResponse::Empty => {}
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -650,14 +644,14 @@ pub(crate) async fn request_enter_lambda(
|
|||
upvalues: Rc<Upvalues>,
|
||||
light_span: LightSpan,
|
||||
) -> Value {
|
||||
let msg = GeneratorRequest::EnterLambda {
|
||||
let msg = VMRequest::EnterLambda {
|
||||
lambda,
|
||||
upvalues,
|
||||
light_span,
|
||||
};
|
||||
|
||||
match co.yield_(msg).await {
|
||||
GeneratorResponse::Value(value) => value,
|
||||
VMResponse::Value(value) => value,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -667,9 +661,9 @@ pub(crate) async fn request_enter_lambda(
|
|||
|
||||
/// Request a lookup in the VM's import cache.
|
||||
pub(crate) async fn request_import_cache_lookup(co: &GenCo, path: PathBuf) -> Option<Value> {
|
||||
match co.yield_(GeneratorRequest::ImportCacheLookup(path)).await {
|
||||
GeneratorResponse::Value(value) => Some(value),
|
||||
GeneratorResponse::Empty => None,
|
||||
match co.yield_(VMRequest::ImportCacheLookup(path)).await {
|
||||
VMResponse::Value(value) => Some(value),
|
||||
VMResponse::Empty => None,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -679,11 +673,8 @@ pub(crate) async fn request_import_cache_lookup(co: &GenCo, path: PathBuf) -> Op
|
|||
|
||||
/// Request that the VM populate its input cache for the given path.
|
||||
pub(crate) async fn request_import_cache_put(co: &GenCo, path: PathBuf, value: Value) {
|
||||
match co
|
||||
.yield_(GeneratorRequest::ImportCachePut(path, value))
|
||||
.await
|
||||
{
|
||||
GeneratorResponse::Empty => {}
|
||||
match co.yield_(VMRequest::ImportCachePut(path, value)).await {
|
||||
VMResponse::Empty => {}
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -693,8 +684,8 @@ pub(crate) async fn request_import_cache_put(co: &GenCo, path: PathBuf, value: V
|
|||
|
||||
/// Request that the VM import the given path.
|
||||
pub(crate) async fn request_path_import(co: &GenCo, path: PathBuf) -> PathBuf {
|
||||
match co.yield_(GeneratorRequest::PathImport(path)).await {
|
||||
GeneratorResponse::Path(path) => path,
|
||||
match co.yield_(VMRequest::PathImport(path)).await {
|
||||
VMResponse::Path(path) => path,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -703,8 +694,8 @@ pub(crate) async fn request_path_import(co: &GenCo, path: PathBuf) -> PathBuf {
|
|||
}
|
||||
|
||||
pub(crate) async fn request_read_to_string(co: &GenCo, path: PathBuf) -> Value {
|
||||
match co.yield_(GeneratorRequest::ReadToString(path)).await {
|
||||
GeneratorResponse::Value(value) => value,
|
||||
match co.yield_(VMRequest::ReadToString(path)).await {
|
||||
VMResponse::Value(value) => value,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -713,8 +704,8 @@ pub(crate) async fn request_read_to_string(co: &GenCo, path: PathBuf) -> Value {
|
|||
}
|
||||
|
||||
pub(crate) async fn request_path_exists(co: &GenCo, path: PathBuf) -> Value {
|
||||
match co.yield_(GeneratorRequest::PathExists(path)).await {
|
||||
GeneratorResponse::Value(value) => value,
|
||||
match co.yield_(VMRequest::PathExists(path)).await {
|
||||
VMResponse::Value(value) => value,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -723,8 +714,8 @@ pub(crate) async fn request_path_exists(co: &GenCo, path: PathBuf) -> Value {
|
|||
}
|
||||
|
||||
pub(crate) async fn request_read_dir(co: &GenCo, path: PathBuf) -> Vec<(SmolStr, FileType)> {
|
||||
match co.yield_(GeneratorRequest::ReadDir(path)).await {
|
||||
GeneratorResponse::Directory(dir) => dir,
|
||||
match co.yield_(VMRequest::ReadDir(path)).await {
|
||||
VMResponse::Directory(dir) => dir,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -733,8 +724,8 @@ pub(crate) async fn request_read_dir(co: &GenCo, path: PathBuf) -> Vec<(SmolStr,
|
|||
}
|
||||
|
||||
pub(crate) async fn request_span(co: &GenCo) -> LightSpan {
|
||||
match co.yield_(GeneratorRequest::Span).await {
|
||||
GeneratorResponse::Span(span) => span,
|
||||
match co.yield_(VMRequest::Span).await {
|
||||
VMResponse::Span(span) => span,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -743,8 +734,8 @@ pub(crate) async fn request_span(co: &GenCo) -> LightSpan {
|
|||
}
|
||||
|
||||
pub(crate) async fn request_to_json(co: &GenCo, value: Value) -> serde_json::Value {
|
||||
match co.yield_(GeneratorRequest::ToJson(value)).await {
|
||||
GeneratorResponse::Value(Value::Json(json)) => json,
|
||||
match co.yield_(VMRequest::ToJson(value)).await {
|
||||
VMResponse::Value(Value::Json(json)) => json,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
|
|
@ -37,7 +37,7 @@ use crate::{
|
|||
|
||||
use generators::{call_functor, Generator, GeneratorState};
|
||||
|
||||
use self::generators::{GeneratorRequest, GeneratorResponse};
|
||||
use self::generators::{VMRequest, VMResponse};
|
||||
|
||||
/// Internal helper trait for ergonomically converting from a `Result<T,
|
||||
/// ErrorKind>` to a `Result<T, Error>` using the current span of a call frame.
|
||||
|
@ -300,7 +300,7 @@ impl<'o> VM<'o> {
|
|||
|
||||
let initial_msg = if catchable_error_occurred {
|
||||
catchable_error_occurred = false;
|
||||
Some(GeneratorResponse::ForceError)
|
||||
Some(VMResponse::ForceError)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
@ -1009,8 +1009,8 @@ async fn resolve_with(
|
|||
) -> Result<Value, ErrorKind> {
|
||||
/// Fetch and force a value on the with-stack from the VM.
|
||||
async fn fetch_forced_with(co: &GenCo, idx: usize) -> Value {
|
||||
match co.yield_(GeneratorRequest::WithValue(idx)).await {
|
||||
GeneratorResponse::Value(value) => value,
|
||||
match co.yield_(VMRequest::WithValue(idx)).await {
|
||||
VMResponse::Value(value) => value,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
@ -1020,8 +1020,8 @@ async fn resolve_with(
|
|||
|
||||
/// Fetch and force a value on the *captured* with-stack from the VM.
|
||||
async fn fetch_captured_with(co: &GenCo, idx: usize) -> Value {
|
||||
match co.yield_(GeneratorRequest::CapturedWithValue(idx)).await {
|
||||
GeneratorResponse::Value(value) => value,
|
||||
match co.yield_(VMRequest::CapturedWithValue(idx)).await {
|
||||
VMResponse::Value(value) => value,
|
||||
msg => panic!(
|
||||
"Tvix bug: VM responded with incorrect generator message: {}",
|
||||
msg
|
||||
|
|
Loading…
Reference in a new issue