summaryrefslogtreecommitdiff
path: root/core/shared.rs
blob: 40d83db732b173bfa590179069da5f4c4a23801a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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) }
  }
}