diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/dispatch_minimal.rs | 39 | ||||
-rw-r--r-- | cli/ops.rs | 17 | ||||
-rw-r--r-- | cli/state.rs | 4 | ||||
-rw-r--r-- | cli/worker.rs | 4 |
4 files changed, 25 insertions, 39 deletions
diff --git a/cli/dispatch_minimal.rs b/cli/dispatch_minimal.rs index dd6a962e2..322094be2 100644 --- a/cli/dispatch_minimal.rs +++ b/cli/dispatch_minimal.rs @@ -8,33 +8,26 @@ use crate::state::ThreadSafeState; use deno::Buf; use deno::CoreOp; use deno::Op; +use deno::OpId; use deno::PinnedBuf; use futures::Future; -const DISPATCH_MINIMAL_TOKEN: i32 = 0xCAFE; -const OP_READ: i32 = 1; -const OP_WRITE: i32 = 2; +const OP_READ: OpId = 1; +const OP_WRITE: OpId = 2; #[derive(Copy, Clone, Debug, PartialEq)] // This corresponds to RecordMinimal on the TS side. pub struct Record { pub promise_id: i32, - pub op_id: i32, pub arg: i32, pub result: i32, } impl Into<Buf> for Record { fn into(self) -> Buf { - let vec = vec![ - DISPATCH_MINIMAL_TOKEN, - self.promise_id, - self.op_id, - self.arg, - self.result, - ]; + let vec = vec![self.promise_id, self.arg, self.result]; let buf32 = vec.into_boxed_slice(); - let ptr = Box::into_raw(buf32) as *mut [u8; 5 * 4]; + let ptr = Box::into_raw(buf32) as *mut [u8; 3 * 4]; unsafe { Box::from_raw(ptr) } } } @@ -48,32 +41,25 @@ pub fn parse_min_record(bytes: &[u8]) -> Option<Record> { let p32 = p as *const i32; let s = unsafe { std::slice::from_raw_parts(p32, bytes.len() / 4) }; - if s.len() < 5 { + if s.len() != 3 { return None; } let ptr = s.as_ptr(); - let ints = unsafe { std::slice::from_raw_parts(ptr, 5) }; - if ints[0] != DISPATCH_MINIMAL_TOKEN { - return None; - } + let ints = unsafe { std::slice::from_raw_parts(ptr, 3) }; Some(Record { - promise_id: ints[1], - op_id: ints[2], - arg: ints[3], - result: ints[4], + promise_id: ints[0], + arg: ints[1], + result: ints[2], }) } #[test] fn test_parse_min_record() { - let buf = vec![ - 0xFE, 0xCA, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, - ]; + let buf = vec![1, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0]; assert_eq!( parse_min_record(&buf), Some(Record { promise_id: 1, - op_id: 2, arg: 3, result: 4, }) @@ -88,11 +74,12 @@ fn test_parse_min_record() { pub fn dispatch_minimal( state: &ThreadSafeState, + op_id: OpId, mut record: Record, zero_copy: Option<PinnedBuf>, ) -> CoreOp { let is_sync = record.promise_id == 0; - let min_op = match record.op_id { + let min_op = match op_id { OP_READ => ops::read(record.arg, zero_copy), OP_WRITE => ops::write(record.arg, zero_copy), _ => unimplemented!(), diff --git a/cli/ops.rs b/cli/ops.rs index 98528f979..d75e7bd20 100644 --- a/cli/ops.rs +++ b/cli/ops.rs @@ -27,14 +27,7 @@ use crate::tokio_write; use crate::version; use crate::worker::Worker; use atty; -use deno::Buf; -use deno::CoreOp; -use deno::ErrBox; -use deno::Loader; -use deno::ModuleSpecifier; -use deno::Op; -use deno::OpResult; -use deno::PinnedBuf; +use deno::*; use flatbuffers::FlatBufferBuilder; use futures; use futures::Async; @@ -82,16 +75,20 @@ fn empty_buf() -> Buf { Box::new([]) } +const FLATBUFFER_OP_ID: OpId = 44; + pub fn dispatch_all( state: &ThreadSafeState, + op_id: OpId, control: &[u8], zero_copy: Option<PinnedBuf>, op_selector: OpSelector, ) -> CoreOp { let bytes_sent_control = control.len(); let bytes_sent_zero_copy = zero_copy.as_ref().map(|b| b.len()).unwrap_or(0); - let op = if let Some(min_record) = parse_min_record(control) { - dispatch_minimal(state, min_record, zero_copy) + let op = if op_id != FLATBUFFER_OP_ID { + let min_record = parse_min_record(control).unwrap(); + dispatch_minimal(state, op_id, min_record, zero_copy) } else { dispatch_all_legacy(state, control, zero_copy, op_selector) }; diff --git a/cli/state.rs b/cli/state.rs index f4e3d9c84..e1480c027 100644 --- a/cli/state.rs +++ b/cli/state.rs @@ -20,6 +20,7 @@ use deno::CoreOp; use deno::ErrBox; use deno::Loader; use deno::ModuleSpecifier; +use deno::OpId; use deno::PinnedBuf; use futures::future::Shared; use futures::Future; @@ -104,10 +105,11 @@ impl Deref for ThreadSafeState { impl ThreadSafeState { pub fn dispatch( &self, + op_id: OpId, control: &[u8], zero_copy: Option<PinnedBuf>, ) -> CoreOp { - ops::dispatch_all(self, control, zero_copy, self.dispatch_selector) + ops::dispatch_all(self, op_id, control, zero_copy, self.dispatch_selector) } } diff --git a/cli/worker.rs b/cli/worker.rs index f18062836..f707f4a58 100644 --- a/cli/worker.rs +++ b/cli/worker.rs @@ -29,8 +29,8 @@ impl Worker { { let mut i = isolate.lock().unwrap(); let state_ = state.clone(); - i.set_dispatch(move |control_buf, zero_copy_buf| { - state_.dispatch(control_buf, zero_copy_buf) + i.set_dispatch(move |op_id, control_buf, zero_copy_buf| { + state_.dispatch(op_id, control_buf, zero_copy_buf) }); let state_ = state.clone(); i.set_js_error_create(move |v8_exception| { |