Skip to content

Commit 19bd7a2

Browse files
committed
feat(ast_tools): support Atomic* types in structs
1 parent 70f88fc commit 19bd7a2

File tree

4 files changed

+39
-2
lines changed

4 files changed

+39
-2
lines changed

tasks/ast_tools/src/generators/assert_layouts.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::{
88
borrow::Cow,
99
cmp::{Ordering, max, min},
1010
num,
11+
sync::atomic,
1112
};
1213

1314
use phf_codegen::Map as PhfMapGen;
@@ -472,6 +473,20 @@ fn calculate_layout_for_primitive(primitive_def: &PrimitiveDef) -> Layout {
472473
)
473474
}
474475
"NonZeroIsize" => non_zero_usize_layout,
476+
// Unlike `bool`, `AtomicBool` does not have any niches
477+
"AtomicBool" => Layout::from_type::<atomic::AtomicBool>(),
478+
"AtomicU8" => Layout::from_type::<atomic::AtomicU8>(),
479+
"AtomicU16" => Layout::from_type::<atomic::AtomicU16>(),
480+
"AtomicU32" => Layout::from_type::<atomic::AtomicU32>(),
481+
"AtomicU64" => Layout::from_type::<atomic::AtomicU64>(),
482+
"AtomicUsize" => usize_layout,
483+
"AtomicI8" => Layout::from_type::<atomic::AtomicI8>(),
484+
"AtomicI16" => Layout::from_type::<atomic::AtomicI16>(),
485+
"AtomicI32" => Layout::from_type::<atomic::AtomicI32>(),
486+
"AtomicI64" => Layout::from_type::<atomic::AtomicI64>(),
487+
"AtomicIsize" => usize_layout,
488+
// `AtomicPtr` has no niche - like `*mut T`, not `NonNull<T>`
489+
"AtomicPtr" => usize_layout,
475490
"PointerAlign" => Layout {
476491
layout_64: PlatformLayout::from_size_align(0, 8),
477492
layout_32: PlatformLayout::from_size_align(0, 4),

tasks/ast_tools/src/generators/raw_transfer.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,8 +514,9 @@ fn generate_primitive(primitive_def: &PrimitiveDef, code: &mut String, schema: &
514514
",
515515
"f64" => "return float64[pos >> 3];",
516516
"&str" => STR_DESERIALIZER_BODY,
517-
// Reuse deserializers for zeroed types
517+
// Reuse deserializers for zeroed and atomic types
518518
type_name if type_name.starts_with("NonZero") => return,
519+
type_name if type_name.starts_with("Atomic") => return,
519520
type_name => panic!("Cannot generate deserializer for primitive `{type_name}`"),
520521
};
521522

@@ -960,6 +961,9 @@ impl DeserializeFunctionName for PrimitiveDef {
960961
} else if let Some(type_name) = type_name.strip_prefix("NonZero") {
961962
// Use zeroed type's deserializer for `NonZero*` types
962963
Cow::Borrowed(type_name)
964+
} else if let Some(type_name) = type_name.strip_prefix("Atomic") {
965+
// Use standard type's deserializer for `Atomic*` types
966+
Cow::Borrowed(type_name)
963967
} else {
964968
upper_case_first(type_name)
965969
}

tasks/ast_tools/src/generators/raw_transfer_lazy.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -925,8 +925,9 @@ fn generate_primitive(primitive_def: &PrimitiveDef, state: &mut State, schema: &
925925
",
926926
"f64" => "return ast.buffer.float64[pos >> 3];",
927927
"&str" => STR_DESERIALIZER_BODY,
928-
// Reuse constructors for zeroed types
928+
// Reuse constructors for zeroed and atomic types
929929
type_name if type_name.starts_with("NonZero") => return,
930+
type_name if type_name.starts_with("Atomic") => return,
930931
type_name => panic!("Cannot generate constructor for primitive `{type_name}`"),
931932
};
932933

@@ -1248,6 +1249,9 @@ impl FunctionNames for PrimitiveDef {
12481249
} else if let Some(type_name) = type_name.strip_prefix("NonZero") {
12491250
// Use zeroed type's constructor for `NonZero*` types
12501251
Cow::Borrowed(type_name)
1252+
} else if let Some(type_name) = type_name.strip_prefix("Atomic") {
1253+
// Use standard type's constructor for `Atomic*` types
1254+
Cow::Borrowed(type_name)
12511255
} else {
12521256
upper_case_first(type_name)
12531257
}

tasks/ast_tools/src/parse/parse.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,20 @@ impl<'c> Parser<'c> {
221221
"NonZeroI64" => primitive("NonZeroI64"),
222222
"NonZeroI128" => primitive("NonZeroI128"),
223223
"NonZeroIsize" => primitive("NonZeroIsize"),
224+
"AtomicBool" => primitive("AtomicBool"),
225+
"AtomicU8" => primitive("AtomicU8"),
226+
"AtomicU16" => primitive("AtomicU16"),
227+
"AtomicU32" => primitive("AtomicU32"),
228+
"AtomicU64" => primitive("AtomicU64"),
229+
"AtomicU128" => primitive("AtomicU128"),
230+
"AtomicUsize" => primitive("AtomicUsize"),
231+
"AtomicI8" => primitive("AtomicI8"),
232+
"AtomicI16" => primitive("AtomicI16"),
233+
"AtomicI32" => primitive("AtomicI32"),
234+
"AtomicI64" => primitive("AtomicI64"),
235+
"AtomicI128" => primitive("AtomicI128"),
236+
"AtomicIsize" => primitive("AtomicIsize"),
237+
"AtomicPtr" => primitive("AtomicPtr"),
224238
"&str" => primitive("&str"),
225239
"Atom" => primitive("Atom"),
226240
// TODO: Remove the need for this by adding

0 commit comments

Comments
 (0)