summaryrefslogtreecommitdiff
path: root/core/shared.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/shared.rs')
-rw-r--r--core/shared.rs49
1 files changed, 49 insertions, 0 deletions
diff --git a/core/shared.rs b/core/shared.rs
new file mode 100644
index 000000000..40d83db73
--- /dev/null
+++ b/core/shared.rs
@@ -0,0 +1,49 @@
+use crate::libdeno::deno_buf;
+use std::mem;
+
+// TODO this is where we abstract flatbuffers at.
+// TODO make these constants private to this file.
+const INDEX_NUM_RECORDS: usize = 0;
+const INDEX_RECORDS: usize = 1;
+pub const RECORD_OFFSET_PROMISE_ID: usize = 0;
+pub const RECORD_OFFSET_OP: usize = 1;
+pub const RECORD_OFFSET_ARG: usize = 2;
+pub const RECORD_OFFSET_RESULT: usize = 3;
+const RECORD_SIZE: usize = 4;
+const NUM_RECORDS: usize = 100;
+
+/// Represents the shared buffer between JS and Rust.
+/// Used for FFI.
+pub struct Shared(Vec<i32>);
+
+impl Shared {
+ pub fn new() -> Shared {
+ let mut vec = Vec::<i32>::new();
+ vec.resize(INDEX_RECORDS + RECORD_SIZE * NUM_RECORDS, 0);
+ Shared(vec)
+ }
+
+ pub fn set_record(&mut self, i: usize, off: usize, value: i32) {
+ assert!(i < NUM_RECORDS);
+ self.0[INDEX_RECORDS + RECORD_SIZE * i + off] = value;
+ }
+
+ pub fn get_record(&self, i: usize, off: usize) -> i32 {
+ assert!(i < NUM_RECORDS);
+ return self.0[INDEX_RECORDS + RECORD_SIZE * i + off];
+ }
+
+ pub fn set_num_records(&mut self, num_records: i32) {
+ self.0[INDEX_NUM_RECORDS] = num_records;
+ }
+
+ pub fn get_num_records(&self) -> i32 {
+ return self.0[INDEX_NUM_RECORDS];
+ }
+
+ pub fn as_deno_buf(&mut self) -> deno_buf {
+ let ptr = self.0.as_mut_ptr() as *mut u8;
+ let len = mem::size_of::<i32>() * self.0.len();
+ unsafe { deno_buf::from_raw_parts(ptr, len) }
+ }
+}