Rollup merge of #121835 - nnethercote:mv-HandleStore, r=bjorn3
Move `HandleStore` into `server.rs`. This just moves the server-relevant parts of handles into `server.rs`. It introduces a new higher-order macro `with_api_handle_types` to avoid some duplication. This fixes two `FIXME` comments, and makes things clearer, by not having server code in `client.rs`. r? ```@bjorn3```
This commit is contained in:
commit
4f3d7e2d11
@ -5,16 +5,16 @@
|
|||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::sync::atomic::AtomicU32;
|
use std::sync::atomic::AtomicU32;
|
||||||
|
|
||||||
macro_rules! define_handles {
|
macro_rules! define_client_handles {
|
||||||
(
|
(
|
||||||
'owned: $($oty:ident,)*
|
'owned: $($oty:ident,)*
|
||||||
'interned: $($ity:ident,)*
|
'interned: $($ity:ident,)*
|
||||||
) => {
|
) => {
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
pub struct HandleCounters {
|
pub(super) struct HandleCounters {
|
||||||
$($oty: AtomicU32,)*
|
$(pub(super) $oty: AtomicU32,)*
|
||||||
$($ity: AtomicU32,)*
|
$(pub(super) $ity: AtomicU32,)*
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HandleCounters {
|
impl HandleCounters {
|
||||||
@ -29,22 +29,6 @@ extern "C" fn get() -> &'static Self {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME(eddyb) generate the definition of `HandleStore` in `server.rs`.
|
|
||||||
#[allow(non_snake_case)]
|
|
||||||
pub(super) struct HandleStore<S: server::Types> {
|
|
||||||
$($oty: handle::OwnedStore<S::$oty>,)*
|
|
||||||
$($ity: handle::InternedStore<S::$ity>,)*
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<S: server::Types> HandleStore<S> {
|
|
||||||
pub(super) fn new(handle_counters: &'static HandleCounters) -> Self {
|
|
||||||
HandleStore {
|
|
||||||
$($oty: handle::OwnedStore::new(&handle_counters.$oty),)*
|
|
||||||
$($ity: handle::InternedStore::new(&handle_counters.$ity),)*
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$(
|
$(
|
||||||
pub(crate) struct $oty {
|
pub(crate) struct $oty {
|
||||||
handle: handle::Handle,
|
handle: handle::Handle,
|
||||||
@ -72,53 +56,18 @@ fn encode(self, w: &mut Writer, s: &mut S) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S: server::Types> DecodeMut<'_, '_, HandleStore<server::MarkedTypes<S>>>
|
|
||||||
for Marked<S::$oty, $oty>
|
|
||||||
{
|
|
||||||
fn decode(r: &mut Reader<'_>, s: &mut HandleStore<server::MarkedTypes<S>>) -> Self {
|
|
||||||
s.$oty.take(handle::Handle::decode(r, &mut ()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<S> Encode<S> for &$oty {
|
impl<S> Encode<S> for &$oty {
|
||||||
fn encode(self, w: &mut Writer, s: &mut S) {
|
fn encode(self, w: &mut Writer, s: &mut S) {
|
||||||
self.handle.encode(w, s);
|
self.handle.encode(w, s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'s, S: server::Types> Decode<'_, 's, HandleStore<server::MarkedTypes<S>>>
|
|
||||||
for &'s Marked<S::$oty, $oty>
|
|
||||||
{
|
|
||||||
fn decode(r: &mut Reader<'_>, s: &'s HandleStore<server::MarkedTypes<S>>) -> Self {
|
|
||||||
&s.$oty[handle::Handle::decode(r, &mut ())]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<S> Encode<S> for &mut $oty {
|
impl<S> Encode<S> for &mut $oty {
|
||||||
fn encode(self, w: &mut Writer, s: &mut S) {
|
fn encode(self, w: &mut Writer, s: &mut S) {
|
||||||
self.handle.encode(w, s);
|
self.handle.encode(w, s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'s, S: server::Types> DecodeMut<'_, 's, HandleStore<server::MarkedTypes<S>>>
|
|
||||||
for &'s mut Marked<S::$oty, $oty>
|
|
||||||
{
|
|
||||||
fn decode(
|
|
||||||
r: &mut Reader<'_>,
|
|
||||||
s: &'s mut HandleStore<server::MarkedTypes<S>>
|
|
||||||
) -> Self {
|
|
||||||
&mut s.$oty[handle::Handle::decode(r, &mut ())]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<S: server::Types> Encode<HandleStore<server::MarkedTypes<S>>>
|
|
||||||
for Marked<S::$oty, $oty>
|
|
||||||
{
|
|
||||||
fn encode(self, w: &mut Writer, s: &mut HandleStore<server::MarkedTypes<S>>) {
|
|
||||||
s.$oty.alloc(self).encode(w, s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<S> DecodeMut<'_, '_, S> for $oty {
|
impl<S> DecodeMut<'_, '_, S> for $oty {
|
||||||
fn decode(r: &mut Reader<'_>, s: &mut S) -> Self {
|
fn decode(r: &mut Reader<'_>, s: &mut S) -> Self {
|
||||||
$oty {
|
$oty {
|
||||||
@ -145,22 +94,6 @@ fn encode(self, w: &mut Writer, s: &mut S) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S: server::Types> DecodeMut<'_, '_, HandleStore<server::MarkedTypes<S>>>
|
|
||||||
for Marked<S::$ity, $ity>
|
|
||||||
{
|
|
||||||
fn decode(r: &mut Reader<'_>, s: &mut HandleStore<server::MarkedTypes<S>>) -> Self {
|
|
||||||
s.$ity.copy(handle::Handle::decode(r, &mut ()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<S: server::Types> Encode<HandleStore<server::MarkedTypes<S>>>
|
|
||||||
for Marked<S::$ity, $ity>
|
|
||||||
{
|
|
||||||
fn encode(self, w: &mut Writer, s: &mut HandleStore<server::MarkedTypes<S>>) {
|
|
||||||
s.$ity.alloc(self).encode(w, s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<S> DecodeMut<'_, '_, S> for $ity {
|
impl<S> DecodeMut<'_, '_, S> for $ity {
|
||||||
fn decode(r: &mut Reader<'_>, s: &mut S) -> Self {
|
fn decode(r: &mut Reader<'_>, s: &mut S) -> Self {
|
||||||
$ity {
|
$ity {
|
||||||
@ -172,15 +105,7 @@ fn decode(r: &mut Reader<'_>, s: &mut S) -> Self {
|
|||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
define_handles! {
|
with_api_handle_types!(define_client_handles);
|
||||||
'owned:
|
|
||||||
FreeFunctions,
|
|
||||||
TokenStream,
|
|
||||||
SourceFile,
|
|
||||||
|
|
||||||
'interned:
|
|
||||||
Span,
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME(eddyb) generate these impls by pattern-matching on the
|
// FIXME(eddyb) generate these impls by pattern-matching on the
|
||||||
// names of methods - also could use the presence of `fn drop`
|
// names of methods - also could use the presence of `fn drop`
|
||||||
|
@ -113,6 +113,23 @@ fn into_trees(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Similar to `with_api`, but only lists the types requiring handles, and they
|
||||||
|
// are divided into the two storage categories.
|
||||||
|
macro_rules! with_api_handle_types {
|
||||||
|
($m:ident) => {
|
||||||
|
$m! {
|
||||||
|
'owned:
|
||||||
|
FreeFunctions,
|
||||||
|
TokenStream,
|
||||||
|
SourceFile,
|
||||||
|
|
||||||
|
'interned:
|
||||||
|
Span,
|
||||||
|
// Symbol is handled manually
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME(eddyb) this calls `encode` for each argument, but in reverse,
|
// FIXME(eddyb) this calls `encode` for each argument, but in reverse,
|
||||||
// to match the ordering in `reverse_decode`.
|
// to match the ordering in `reverse_decode`.
|
||||||
macro_rules! reverse_encode {
|
macro_rules! reverse_encode {
|
||||||
|
@ -5,8 +5,79 @@
|
|||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
// FIXME(eddyb) generate the definition of `HandleStore` in `server.rs`.
|
macro_rules! define_server_handles {
|
||||||
use super::client::HandleStore;
|
(
|
||||||
|
'owned: $($oty:ident,)*
|
||||||
|
'interned: $($ity:ident,)*
|
||||||
|
) => {
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
pub(super) struct HandleStore<S: Types> {
|
||||||
|
$($oty: handle::OwnedStore<S::$oty>,)*
|
||||||
|
$($ity: handle::InternedStore<S::$ity>,)*
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<S: Types> HandleStore<S> {
|
||||||
|
fn new(handle_counters: &'static client::HandleCounters) -> Self {
|
||||||
|
HandleStore {
|
||||||
|
$($oty: handle::OwnedStore::new(&handle_counters.$oty),)*
|
||||||
|
$($ity: handle::InternedStore::new(&handle_counters.$ity),)*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(
|
||||||
|
impl<S: Types> Encode<HandleStore<MarkedTypes<S>>> for Marked<S::$oty, client::$oty> {
|
||||||
|
fn encode(self, w: &mut Writer, s: &mut HandleStore<MarkedTypes<S>>) {
|
||||||
|
s.$oty.alloc(self).encode(w, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<S: Types> DecodeMut<'_, '_, HandleStore<MarkedTypes<S>>>
|
||||||
|
for Marked<S::$oty, client::$oty>
|
||||||
|
{
|
||||||
|
fn decode(r: &mut Reader<'_>, s: &mut HandleStore<MarkedTypes<S>>) -> Self {
|
||||||
|
s.$oty.take(handle::Handle::decode(r, &mut ()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'s, S: Types> Decode<'_, 's, HandleStore<MarkedTypes<S>>>
|
||||||
|
for &'s Marked<S::$oty, client::$oty>
|
||||||
|
{
|
||||||
|
fn decode(r: &mut Reader<'_>, s: &'s HandleStore<MarkedTypes<S>>) -> Self {
|
||||||
|
&s.$oty[handle::Handle::decode(r, &mut ())]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'s, S: Types> DecodeMut<'_, 's, HandleStore<MarkedTypes<S>>>
|
||||||
|
for &'s mut Marked<S::$oty, client::$oty>
|
||||||
|
{
|
||||||
|
fn decode(
|
||||||
|
r: &mut Reader<'_>,
|
||||||
|
s: &'s mut HandleStore<MarkedTypes<S>>
|
||||||
|
) -> Self {
|
||||||
|
&mut s.$oty[handle::Handle::decode(r, &mut ())]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
|
||||||
|
$(
|
||||||
|
impl<S: Types> Encode<HandleStore<MarkedTypes<S>>> for Marked<S::$ity, client::$ity> {
|
||||||
|
fn encode(self, w: &mut Writer, s: &mut HandleStore<MarkedTypes<S>>) {
|
||||||
|
s.$ity.alloc(self).encode(w, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<S: Types> DecodeMut<'_, '_, HandleStore<MarkedTypes<S>>>
|
||||||
|
for Marked<S::$ity, client::$ity>
|
||||||
|
{
|
||||||
|
fn decode(r: &mut Reader<'_>, s: &mut HandleStore<MarkedTypes<S>>) -> Self {
|
||||||
|
s.$ity.copy(handle::Handle::decode(r, &mut ()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
with_api_handle_types!(define_server_handles);
|
||||||
|
|
||||||
pub trait Types {
|
pub trait Types {
|
||||||
type FreeFunctions: 'static;
|
type FreeFunctions: 'static;
|
||||||
|
@ -109,18 +109,18 @@ fn encode(self, w: &mut Writer, s: &mut S) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S: server::Server> DecodeMut<'_, '_, client::HandleStore<server::MarkedTypes<S>>>
|
impl<S: server::Server> DecodeMut<'_, '_, server::HandleStore<server::MarkedTypes<S>>>
|
||||||
for Marked<S::Symbol, Symbol>
|
for Marked<S::Symbol, Symbol>
|
||||||
{
|
{
|
||||||
fn decode(r: &mut Reader<'_>, s: &mut client::HandleStore<server::MarkedTypes<S>>) -> Self {
|
fn decode(r: &mut Reader<'_>, s: &mut server::HandleStore<server::MarkedTypes<S>>) -> Self {
|
||||||
Mark::mark(S::intern_symbol(<&str>::decode(r, s)))
|
Mark::mark(S::intern_symbol(<&str>::decode(r, s)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S: server::Server> Encode<client::HandleStore<server::MarkedTypes<S>>>
|
impl<S: server::Server> Encode<server::HandleStore<server::MarkedTypes<S>>>
|
||||||
for Marked<S::Symbol, Symbol>
|
for Marked<S::Symbol, Symbol>
|
||||||
{
|
{
|
||||||
fn encode(self, w: &mut Writer, s: &mut client::HandleStore<server::MarkedTypes<S>>) {
|
fn encode(self, w: &mut Writer, s: &mut server::HandleStore<server::MarkedTypes<S>>) {
|
||||||
S::with_symbol_string(&self.unmark(), |sym| sym.encode(w, s))
|
S::with_symbol_string(&self.unmark(), |sym| sym.encode(w, s))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user