Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove RefCell from builder arena #365

Merged
merged 7 commits into from
Jan 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
332 changes: 184 additions & 148 deletions capnp-rpc/src/rpc_capnp.rs

Large diffs are not rendered by default.

50 changes: 25 additions & 25 deletions capnp-rpc/src/rpc_twoparty_capnp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,22 +107,22 @@ pub mod vat_id {
}

impl <'a,> ::capnp::traits::SetPointerBuilder for Reader<'a,> {
fn set_pointer_builder(pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
fn set_pointer_builder(mut pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
}

impl <'a,> Builder<'a,> {
pub fn into_reader(self) -> Reader<'a,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
}
pub fn reborrow(&mut self) -> Builder<'_,> {
Builder { .. *self }
Builder { builder: self.builder.reborrow(), ..*self }
}
pub fn reborrow_as_reader(&self) -> Reader<'_,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
::capnp::traits::FromStructReader::new(self.builder.as_reader())
}

pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
self.builder.into_reader().total_size()
self.builder.as_reader().total_size()
}
#[inline]
pub fn get_side(self) -> ::core::result::Result<crate::rpc_twoparty_capnp::Side,::capnp::NotInSchema> {
Expand Down Expand Up @@ -227,22 +227,22 @@ pub mod provision_id {
}

impl <'a,> ::capnp::traits::SetPointerBuilder for Reader<'a,> {
fn set_pointer_builder(pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
fn set_pointer_builder(mut pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
}

impl <'a,> Builder<'a,> {
pub fn into_reader(self) -> Reader<'a,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
}
pub fn reborrow(&mut self) -> Builder<'_,> {
Builder { .. *self }
Builder { builder: self.builder.reborrow(), ..*self }
}
pub fn reborrow_as_reader(&self) -> Reader<'_,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
::capnp::traits::FromStructReader::new(self.builder.as_reader())
}

pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
self.builder.into_reader().total_size()
self.builder.as_reader().total_size()
}
#[inline]
pub fn get_join_id(self) -> u32 {
Expand Down Expand Up @@ -343,22 +343,22 @@ pub mod recipient_id {
}

impl <'a,> ::capnp::traits::SetPointerBuilder for Reader<'a,> {
fn set_pointer_builder(pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
fn set_pointer_builder(mut pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
}

impl <'a,> Builder<'a,> {
pub fn into_reader(self) -> Reader<'a,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
}
pub fn reborrow(&mut self) -> Builder<'_,> {
Builder { .. *self }
Builder { builder: self.builder.reborrow(), ..*self }
}
pub fn reborrow_as_reader(&self) -> Reader<'_,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
::capnp::traits::FromStructReader::new(self.builder.as_reader())
}

pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
self.builder.into_reader().total_size()
self.builder.as_reader().total_size()
}
}

Expand Down Expand Up @@ -451,22 +451,22 @@ pub mod third_party_cap_id {
}

impl <'a,> ::capnp::traits::SetPointerBuilder for Reader<'a,> {
fn set_pointer_builder(pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
fn set_pointer_builder(mut pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
}

impl <'a,> Builder<'a,> {
pub fn into_reader(self) -> Reader<'a,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
}
pub fn reborrow(&mut self) -> Builder<'_,> {
Builder { .. *self }
Builder { builder: self.builder.reborrow(), ..*self }
}
pub fn reborrow_as_reader(&self) -> Reader<'_,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
::capnp::traits::FromStructReader::new(self.builder.as_reader())
}

pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
self.builder.into_reader().total_size()
self.builder.as_reader().total_size()
}
}

Expand Down Expand Up @@ -571,22 +571,22 @@ pub mod join_key_part {
}

impl <'a,> ::capnp::traits::SetPointerBuilder for Reader<'a,> {
fn set_pointer_builder(pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
fn set_pointer_builder(mut pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
}

impl <'a,> Builder<'a,> {
pub fn into_reader(self) -> Reader<'a,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
}
pub fn reborrow(&mut self) -> Builder<'_,> {
Builder { .. *self }
Builder { builder: self.builder.reborrow(), ..*self }
}
pub fn reborrow_as_reader(&self) -> Reader<'_,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
::capnp::traits::FromStructReader::new(self.builder.as_reader())
}

pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
self.builder.into_reader().total_size()
self.builder.as_reader().total_size()
}
#[inline]
pub fn get_join_id(self) -> u32 {
Expand Down Expand Up @@ -719,22 +719,22 @@ pub mod join_result {
}

impl <'a,> ::capnp::traits::SetPointerBuilder for Reader<'a,> {
fn set_pointer_builder(pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
fn set_pointer_builder(mut pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
}

impl <'a,> Builder<'a,> {
pub fn into_reader(self) -> Reader<'a,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
}
pub fn reborrow(&mut self) -> Builder<'_,> {
Builder { .. *self }
Builder { builder: self.builder.reborrow(), ..*self }
}
pub fn reborrow_as_reader(&self) -> Reader<'_,> {
::capnp::traits::FromStructReader::new(self.builder.into_reader())
::capnp::traits::FromStructReader::new(self.builder.as_reader())
}

pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
self.builder.into_reader().total_size()
self.builder.as_reader().total_size()
}
#[inline]
pub fn get_join_id(self) -> u32 {
Expand Down Expand Up @@ -764,7 +764,7 @@ pub mod join_result {
}
#[inline]
pub fn has_cap(&self) -> bool {
!self.builder.get_pointer_field(0).is_null()
!self.builder.is_pointer_field_null(0)
}
}

Expand Down
2 changes: 1 addition & 1 deletion capnp/fuzz/fuzzers/test_all_types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ fn try_go(mut data: &[u8]) -> ::capnp::Result<()> {

root_builder.set_struct_field(root)?;
{
let list = root_builder.reborrow().init_struct_list(2);
let mut list = root_builder.reborrow().init_struct_list(2);
list.set_with_caveats(0, root)?;
list.set_with_caveats(1, root)?;
}
Expand Down
6 changes: 3 additions & 3 deletions capnp/src/any_pointer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ impl<'a> Builder<'a> {

/// Gets the total size of the target and all of its children. Does not count far pointer overhead.
pub fn target_size(&self) -> Result<crate::MessageSize> {
self.builder.into_reader().total_size()
self.builder.as_reader().total_size()
}

pub fn get_as<T: FromPointerBuilder<'a>>(self) -> Result<T> {
Expand All @@ -154,8 +154,8 @@ impl<'a> Builder<'a> {
FromPointerBuilder::init_pointer(self.builder, size)
}

pub fn set_as<From: SetPointerBuilder>(self, value: From) -> Result<()> {
SetPointerBuilder::set_pointer_builder(self.builder, value, false)
pub fn set_as<From: SetPointerBuilder>(&mut self, value: From) -> Result<()> {
SetPointerBuilder::set_pointer_builder(self.builder.reborrow(), value, false)
}

// XXX value should be a user client.
Expand Down
2 changes: 1 addition & 1 deletion capnp/src/any_pointer_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ impl<'a> FromPointerBuilder<'a> for Builder<'a> {

impl<'a> crate::traits::SetPointerBuilder for Reader<'a> {
fn set_pointer_builder<'b>(
pointer: PointerBuilder<'b>,
mut pointer: PointerBuilder<'b>,
value: Reader<'a>,
canonicalize: bool,
) -> Result<()> {
Expand Down
4 changes: 2 additions & 2 deletions capnp/src/capability_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ where
{
pub fn reborrow(&mut self) -> Builder<'_, T> {
Builder {
builder: self.builder,
builder: self.builder.reborrow(),
marker: PhantomData,
}
}
Expand Down Expand Up @@ -251,7 +251,7 @@ where
T: FromClientHook,
{
fn set_pointer_builder<'b>(
pointer: crate::private::layout::PointerBuilder<'b>,
mut pointer: crate::private::layout::PointerBuilder<'b>,
value: Reader<'a, T>,
canonicalize: bool,
) -> Result<()> {
Expand Down
2 changes: 1 addition & 1 deletion capnp/src/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ impl<'a> crate::traits::FromPointerBuilder<'a> for Builder<'a> {

impl<'a> crate::traits::SetPointerBuilder for Reader<'a> {
fn set_pointer_builder<'b>(
pointer: PointerBuilder<'b>,
mut pointer: PointerBuilder<'b>,
value: Reader<'a>,
_canonicalize: bool,
) -> Result<()> {
Expand Down
2 changes: 1 addition & 1 deletion capnp/src/data_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ impl<'a> Builder<'a> {

impl<'a> crate::traits::SetPointerBuilder for Reader<'a> {
fn set_pointer_builder<'b>(
pointer: crate::private::layout::PointerBuilder<'b>,
mut pointer: crate::private::layout::PointerBuilder<'b>,
value: Reader<'a>,
canonicalize: bool,
) -> Result<()> {
Expand Down
9 changes: 6 additions & 3 deletions capnp/src/enum_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -176,14 +176,17 @@ impl<'a, T: ToU16 + FromU16> Builder<'a, T> {
}
}

pub fn reborrow(&self) -> Builder<'_, T> {
Builder { ..*self }
pub fn reborrow(&mut self) -> Builder<'_, T> {
Builder {
builder: self.builder.reborrow(),
marker: PhantomData,
}
}
}

impl<'a, T> crate::traits::SetPointerBuilder for Reader<'a, T> {
fn set_pointer_builder<'b>(
pointer: crate::private::layout::PointerBuilder<'b>,
mut pointer: crate::private::layout::PointerBuilder<'b>,
value: Reader<'a, T>,
canonicalize: bool,
) -> Result<()> {
Expand Down
5 changes: 3 additions & 2 deletions capnp/src/list_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -232,13 +232,14 @@ where
}
}

pub fn set<'b>(&self, index: u32, value: T::Reader<'a>) -> Result<()>
pub fn set<'b>(&mut self, index: u32, value: T::Reader<'a>) -> Result<()>
where
T::Reader<'a>: crate::traits::IntoInternalListReader<'b>,
{
use crate::traits::IntoInternalListReader;
assert!(index < self.len());
self.builder
.reborrow()
.get_pointer_element(index)
.set_list(&value.into_internal_list_reader(), false)
}
Expand All @@ -249,7 +250,7 @@ where
T: crate::traits::Owned,
{
fn set_pointer_builder<'b>(
pointer: crate::private::layout::PointerBuilder<'b>,
mut pointer: crate::private::layout::PointerBuilder<'b>,
value: Reader<'a, T>,
canonicalize: bool,
) -> Result<()> {
Expand Down
4 changes: 2 additions & 2 deletions capnp/src/message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,7 @@ where

/// Sets the root to a deep copy of the given value.
pub fn set_root<From: SetPointerBuilder>(&mut self, value: From) -> Result<()> {
let root = self.get_root_internal();
let mut root = self.get_root_internal();
root.set_as(value)
}

Expand All @@ -482,7 +482,7 @@ where
self.arena.allocate(0, 1).expect("allocate root pointer");
}
let (seg_start, _seg_len) = self.arena.get_segment_mut(0);
let pointer = layout::PointerBuilder::get_root(&self.arena, 0, seg_start);
let pointer = layout::PointerBuilder::get_root(&mut self.arena, 0, seg_start);
SetPointerBuilder::set_pointer_builder(pointer, value, true)?;
assert_eq!(self.get_segments_for_output().len(), 1);
Ok(())
Expand Down
16 changes: 9 additions & 7 deletions capnp/src/primitive_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -161,13 +161,12 @@ where
}

#[cfg(all(target_endian = "little"))]
pub fn as_slice(&self) -> Option<&mut [T]> {
pub fn as_slice(&mut self) -> Option<&mut [T]> {
if self.builder.get_element_size() == T::element_size() {
let bytes = self.builder.into_raw_bytes();
Some(unsafe {
use core::slice;
slice::from_raw_parts_mut(
bytes.as_ptr() as *mut T,
core::slice::from_raw_parts_mut(
bytes.as_mut_ptr() as *mut T,
8 * bytes.len() / (data_bits_per_element(T::element_size())) as usize,
)
})
Expand Down Expand Up @@ -213,8 +212,11 @@ impl<'a, T: PrimitiveElement> Builder<'a, T> {
}
}

pub fn reborrow(&self) -> Builder<'_, T> {
Builder { ..*self }
pub fn reborrow(&mut self) -> Builder<'_, T> {
Builder {
marker: marker::PhantomData,
builder: self.builder.reborrow(),
}
}
}

Expand All @@ -223,7 +225,7 @@ where
T: PrimitiveElement,
{
fn set_pointer_builder<'b>(
pointer: PointerBuilder<'b>,
mut pointer: PointerBuilder<'b>,
value: Reader<'a, T>,
canonicalize: bool,
) -> Result<()> {
Expand Down
Loading