summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/Cargo.toml2
-rw-r--r--core/bindings.rs20
-rw-r--r--core/isolate.rs24
-rw-r--r--core/shared_queue.rs14
4 files changed, 25 insertions, 35 deletions
diff --git a/core/Cargo.toml b/core/Cargo.toml
index e1a8be813..3c85db4a5 100644
--- a/core/Cargo.toml
+++ b/core/Cargo.toml
@@ -21,7 +21,7 @@ libc = "0.2.66"
log = "0.4.8"
serde_json = "1.0.44"
url = "2.1.0"
-rusty_v8 = "0.1.1"
+rusty_v8 = "0.2.0"
[[example]]
name = "deno_core_http_bench"
diff --git a/core/bindings.rs b/core/bindings.rs
index 6fe21b53b..c6882ed5a 100644
--- a/core/bindings.rs
+++ b/core/bindings.rs
@@ -9,8 +9,6 @@ use v8::MapFnTo;
use std::convert::TryFrom;
use std::option::Option;
-use std::ptr;
-use std::slice;
lazy_static! {
pub static ref EXTERNAL_REFERENCES: v8::ExternalReferences =
@@ -186,9 +184,10 @@ pub fn boxed_slice_to_uint8array<'sc>(
) -> v8::Local<'sc, v8::Uint8Array> {
assert!(!buf.is_empty());
let buf_len = buf.len();
- let backing_store =
- unsafe { &mut v8::ArrayBuffer::new_backing_store_from_boxed_slice(buf) };
- let ab = v8::ArrayBuffer::new_with_backing_store(scope, backing_store);
+ let backing_store = v8::ArrayBuffer::new_backing_store_from_boxed_slice(buf);
+ let mut backing_store_shared = backing_store.make_shared();
+ let ab =
+ v8::ArrayBuffer::with_backing_store(scope, &mut backing_store_shared);
v8::Uint8Array::new(ab, 0, buf_len).expect("Failed to create UintArray8")
}
@@ -397,13 +396,10 @@ fn send(
let control = match v8::Local::<v8::ArrayBufferView>::try_from(args.get(1)) {
Ok(view) => {
- let mut backing_store = view.buffer().unwrap().get_backing_store();
- let backing_store_ptr = backing_store.data() as *mut _ as *mut u8;
- let view_ptr = unsafe { backing_store_ptr.add(view.byte_offset()) };
- let view_len = view.byte_length();
- unsafe { slice::from_raw_parts(view_ptr, view_len) }
+ let backing_store = view.buffer().unwrap().get_backing_store();
+ unsafe { &**backing_store.get() }
}
- Err(..) => unsafe { slice::from_raw_parts(ptr::null(), 0) },
+ Err(..) => &[],
};
let zero_copy: Option<PinnedBuf> =
@@ -599,7 +595,7 @@ fn shared_getter(
// Lazily initialize the persistent external ArrayBuffer.
if deno_isolate.shared_ab.is_empty() {
- let ab = v8::SharedArrayBuffer::new_with_backing_store(
+ let ab = v8::SharedArrayBuffer::with_backing_store(
scope,
deno_isolate.shared.get_backing_store(),
);
diff --git a/core/isolate.rs b/core/isolate.rs
index 07bd8ad1d..e76aaf5cb 100644
--- a/core/isolate.rs
+++ b/core/isolate.rs
@@ -27,8 +27,6 @@ use std::future::Future;
use std::ops::{Deref, DerefMut};
use std::option::Option;
use std::pin::Pin;
-use std::ptr::NonNull;
-use std::slice;
use std::sync::{Arc, Mutex, Once};
use std::task::Context;
use std::task::Poll;
@@ -38,24 +36,22 @@ use std::task::Poll;
/// behaves much like an Arc<[u8]>, although a PinnedBuf currently can't be
/// cloned.
pub struct PinnedBuf {
- data_ptr: NonNull<u8>,
- data_len: usize,
- #[allow(unused)]
backing_store: v8::SharedRef<v8::BackingStore>,
+ byte_offset: usize,
+ byte_length: usize,
}
unsafe impl Send for PinnedBuf {}
impl PinnedBuf {
pub fn new(view: v8::Local<v8::ArrayBufferView>) -> Self {
- let mut backing_store = view.buffer().unwrap().get_backing_store();
- let backing_store_ptr = backing_store.data() as *mut _ as *mut u8;
- let view_ptr = unsafe { backing_store_ptr.add(view.byte_offset()) };
- let view_len = view.byte_length();
+ let backing_store = view.buffer().unwrap().get_backing_store();
+ let byte_offset = view.byte_offset();
+ let byte_length = view.byte_length();
Self {
- data_ptr: NonNull::new(view_ptr).unwrap(),
- data_len: view_len,
backing_store,
+ byte_offset,
+ byte_length,
}
}
}
@@ -63,13 +59,15 @@ impl PinnedBuf {
impl Deref for PinnedBuf {
type Target = [u8];
fn deref(&self) -> &[u8] {
- unsafe { slice::from_raw_parts(self.data_ptr.as_ptr(), self.data_len) }
+ let buf = unsafe { &**self.backing_store.get() };
+ &buf[self.byte_offset..self.byte_offset + self.byte_length]
}
}
impl DerefMut for PinnedBuf {
fn deref_mut(&mut self) -> &mut [u8] {
- unsafe { slice::from_raw_parts_mut(self.data_ptr.as_ptr(), self.data_len) }
+ let buf = unsafe { &mut **self.backing_store.get() };
+ &mut buf[self.byte_offset..self.byte_offset + self.byte_length]
}
}
diff --git a/core/shared_queue.rs b/core/shared_queue.rs
index cd1856813..0d2fc15c3 100644
--- a/core/shared_queue.rs
+++ b/core/shared_queue.rs
@@ -45,7 +45,9 @@ impl SharedQueue {
let buf = buf.into_boxed_slice();
let buf =
unsafe { v8::SharedArrayBuffer::new_backing_store_from_boxed_slice(buf) };
- let mut q = Self { buf };
+ let mut q = Self {
+ buf: buf.make_shared(),
+ };
q.reset();
q
}
@@ -55,17 +57,11 @@ impl SharedQueue {
}
pub fn bytes(&self) -> &[u8] {
- unsafe {
- // This is quite bad. The rusty_v8 issue that makes it necessitates it
- // just barely missed the rusty_v8 v0.1.1 release cutoff.
- #[allow(clippy::cast_ref_to_mut)]
- let self_mut = &mut *(self as *const _ as *mut Self);
- self_mut.bytes_mut()
- }
+ unsafe { &*self.buf.get() }
}
pub fn bytes_mut(&mut self) -> &mut [u8] {
- self.buf.data_bytes()
+ unsafe { &mut *self.buf.get() }
}
fn reset(&mut self) {