Skip to content

Commit 6dc5b12

Browse files
committed
compiler: make the builtin type caches global statics
The BUILTIN, BUILTIN_STRUCTS, RESERVED_PROPERTIES and BuiltinFunction type caches were thread_local only because they held Rc, which is not Sync. Now that they hold Arc, make them global LazyLock statics so the builtin structs and enums have a single process-wide identity. This matches the threaded compilation model: a type built on the compile worker thread and one built on the main thread now share the same allocation, so Arc::ptr_eq stays consistent across threads.
1 parent 61fad7f commit 6dc5b12

15 files changed

Lines changed: 86 additions & 88 deletions

internal/compiler/expression_tree.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ declare_builtin_function_types!(
284284
Hsv: (Type::Float32, Type::Float32, Type::Float32, Type::Float32) -> Type::Color,
285285
Oklch: (Type::Float32, Type::Float32, Type::Float32, Type::Float32) -> Type::Color,
286286
ColorScheme: () -> Type::Enumeration(
287-
typeregister::BUILTIN.with(|e| e.enums.ColorScheme.clone()),
287+
typeregister::BUILTIN.enums.ColorScheme.clone(),
288288
),
289289
AccentColor: () -> Type::Color,
290290
SupportsNativeMenuBar: () -> Type::Bool,
@@ -309,7 +309,7 @@ declare_builtin_function_types!(
309309
Use24HourFormat: () -> Type::Bool,
310310
UpdateTimers: () -> Type::Void,
311311
DetectOperatingSystem: () -> Type::Enumeration(
312-
typeregister::BUILTIN.with(|e| e.enums.OperatingSystemType.clone()),
312+
typeregister::BUILTIN.enums.OperatingSystemType.clone(),
313313
),
314314
StartTimer: (Type::ElementReference) -> Type::Void,
315315
StopTimer: (Type::ElementReference) -> Type::Void,
@@ -329,10 +329,9 @@ impl Default for BuiltinFunctionTypes {
329329

330330
impl BuiltinFunction {
331331
pub fn ty(&self) -> Arc<Function> {
332-
thread_local! {
333-
static TYPES: BuiltinFunctionTypes = BuiltinFunctionTypes::new();
334-
}
335-
TYPES.with(|types| types.ty(self))
332+
static TYPES: std::sync::LazyLock<BuiltinFunctionTypes> =
333+
std::sync::LazyLock::new(BuiltinFunctionTypes::new);
334+
TYPES.ty(self)
336335
}
337336

338337
/// It is const if the return value only depends on its argument and has no side effect
@@ -1764,7 +1763,7 @@ impl Expression {
17641763
},
17651764
Type::Easing => Expression::EasingCurve(EasingCurve::default()),
17661765
Type::MouseCursor => {
1767-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.BuiltInMouseCursor.clone());
1766+
let e = crate::typeregister::BUILTIN.enums.BuiltInMouseCursor.clone();
17681767
Expression::MouseCursor(MouseCursorInner::BuiltIn(Box::new(
17691768
Expression::EnumerationValue(e.default_value()),
17701769
)))

internal/compiler/llr/expression.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ impl Expression {
381381
},
382382
Type::Easing => Expression::EasingCurve(crate::expression_tree::EasingCurve::default()),
383383
Type::MouseCursor => {
384-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.BuiltInMouseCursor.clone());
384+
let e = crate::typeregister::BUILTIN.enums.BuiltInMouseCursor.clone();
385385
Expression::MouseCursor(MouseCursorInner::BuiltIn(Box::new(
386386
Expression::EnumerationValue(e.default_value()),
387387
)))

internal/compiler/llr/lower_expression.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ pub fn lower_animation(a: &PropertyAnimation, ctx: &mut ExpressionLoweringCtx<'_
750750
(SmolStr::new_static("iteration-count"), Type::Float32),
751751
(
752752
SmolStr::new_static("direction"),
753-
Type::Enumeration(BUILTIN.with(|e| e.enums.AnimationDirection.clone())),
753+
Type::Enumeration(BUILTIN.enums.AnimationDirection.clone()),
754754
),
755755
(SmolStr::new_static("easing"), Type::Easing),
756756
(SmolStr::new_static("delay"), Type::Int32),

internal/compiler/llr/lower_layout_expression.rs

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub(super) fn compute_grid_layout_info(
3939
let constraints_result = grid_layout_cell_constraints(layout, o, ctx, cross_axis_size_override);
4040
let orientation_literal = llr_Expression::EnumerationValue(EnumerationValue {
4141
value: o as _,
42-
enumeration: crate::typeregister::BUILTIN.with(|b| b.enums.Orientation.clone()),
42+
enumeration: crate::typeregister::BUILTIN.enums.Orientation.clone(),
4343
});
4444

4545
let sub_expression = llr_Expression::ExtraBuiltinFunctionCall {
@@ -125,7 +125,7 @@ pub(super) fn organize_grid_layout(
125125
let input_data = grid_layout_input_data(layout, ctx);
126126

127127
if let Some(button_roles) = &layout.dialog_button_roles {
128-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.DialogButtonRole.clone());
128+
let e = crate::typeregister::BUILTIN.enums.DialogButtonRole.clone();
129129
let roles = button_roles
130130
.iter()
131131
.map(|r| {
@@ -194,7 +194,7 @@ pub(super) fn solve_grid_layout(
194194
let size = layout_geometry_size(&layout.geometry.rect, o, ctx);
195195
let orientation_expr = llr_Expression::EnumerationValue(EnumerationValue {
196196
value: o as _,
197-
enumeration: crate::typeregister::BUILTIN.with(|b| b.enums.Orientation.clone()),
197+
enumeration: crate::typeregister::BUILTIN.enums.Orientation.clone(),
198198
});
199199
let data = make_struct(
200200
BuiltinStruct::GridLayoutData,
@@ -278,21 +278,20 @@ pub(super) fn solve_box_layout(
278278
("padding", padding.ty(ctx), padding),
279279
(
280280
"alignment",
281-
crate::typeregister::BUILTIN
282-
.with(|e| Type::Enumeration(e.enums.LayoutAlignment.clone())),
281+
Type::Enumeration(crate::typeregister::BUILTIN.enums.LayoutAlignment.clone()),
283282
bld.alignment,
284283
),
285284
("cells", bld.cells.ty(ctx), bld.cells),
286285
],
287286
);
288287
(data, "solve_box_layout")
289288
} else {
290-
let cross_axis_alignment_ty = crate::typeregister::BUILTIN
291-
.with(|e| Type::Enumeration(e.enums.CrossAxisAlignment.clone()));
289+
let cross_axis_alignment_ty =
290+
Type::Enumeration(crate::typeregister::BUILTIN.enums.CrossAxisAlignment.clone());
292291
let cross_axis_alignment = if let Some(nr) = &layout.cross_alignment {
293292
llr_Expression::PropertyReference(ctx.map_property_reference(nr))
294293
} else {
295-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.CrossAxisAlignment.clone());
294+
let e = crate::typeregister::BUILTIN.enums.CrossAxisAlignment.clone();
296295
llr_Expression::EnumerationValue(EnumerationValue {
297296
value: e.default_value,
298297
enumeration: e,
@@ -376,32 +375,31 @@ pub(super) fn solve_flexbox_layout(
376375
("padding_v", padding_v.ty(ctx), padding_v),
377376
(
378377
"alignment",
379-
crate::typeregister::BUILTIN
380-
.with(|e| Type::Enumeration(e.enums.LayoutAlignment.clone())),
378+
Type::Enumeration(crate::typeregister::BUILTIN.enums.LayoutAlignment.clone()),
381379
fld.alignment,
382380
),
383381
(
384382
"direction",
385-
crate::typeregister::BUILTIN
386-
.with(|e| Type::Enumeration(e.enums.FlexboxLayoutDirection.clone())),
383+
Type::Enumeration(
384+
crate::typeregister::BUILTIN.enums.FlexboxLayoutDirection.clone(),
385+
),
387386
fld.direction,
388387
),
389388
(
390389
"align_content",
391-
crate::typeregister::BUILTIN
392-
.with(|e| Type::Enumeration(e.enums.FlexboxLayoutAlignContent.clone())),
390+
Type::Enumeration(
391+
crate::typeregister::BUILTIN.enums.FlexboxLayoutAlignContent.clone(),
392+
),
393393
fld.align_content,
394394
),
395395
(
396396
"cross_axis_alignment",
397-
crate::typeregister::BUILTIN
398-
.with(|e| Type::Enumeration(e.enums.CrossAxisAlignment.clone())),
397+
Type::Enumeration(crate::typeregister::BUILTIN.enums.CrossAxisAlignment.clone()),
399398
fld.cross_axis_alignment,
400399
),
401400
(
402401
"flex_wrap",
403-
crate::typeregister::BUILTIN
404-
.with(|e| Type::Enumeration(e.enums.FlexboxLayoutWrap.clone())),
402+
Type::Enumeration(crate::typeregister::BUILTIN.enums.FlexboxLayoutWrap.clone()),
405403
fld.flex_wrap,
406404
),
407405
("cells_h", fld.cells_h.ty(ctx), fld.cells_h),
@@ -625,8 +623,7 @@ pub(super) fn compute_flexbox_layout_info(
625623
);
626624

627625
// Condition: direction == Row || direction == RowReverse
628-
let direction_enum =
629-
crate::typeregister::BUILTIN.with(|e| e.enums.FlexboxLayoutDirection.clone());
626+
let direction_enum = crate::typeregister::BUILTIN.enums.FlexboxLayoutDirection.clone();
630627
let direction_ref = llr_Expression::PropertyReference(
631628
ctx.map_property_reference(layout.direction.as_ref().unwrap()),
632629
);
@@ -798,7 +795,7 @@ fn flexbox_layout_data(
798795
let alignment = if let Some(expr) = &layout.geometry.alignment {
799796
llr_Expression::PropertyReference(ctx.map_property_reference(expr))
800797
} else {
801-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.LayoutAlignment.clone());
798+
let e = crate::typeregister::BUILTIN.enums.LayoutAlignment.clone();
802799
llr_Expression::EnumerationValue(EnumerationValue {
803800
value: e.default_value,
804801
enumeration: e,
@@ -808,7 +805,7 @@ fn flexbox_layout_data(
808805
let direction = if let Some(expr) = &layout.direction {
809806
llr_Expression::PropertyReference(ctx.map_property_reference(expr))
810807
} else {
811-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.FlexboxLayoutDirection.clone());
808+
let e = crate::typeregister::BUILTIN.enums.FlexboxLayoutDirection.clone();
812809
llr_Expression::EnumerationValue(EnumerationValue {
813810
value: e.default_value,
814811
enumeration: e,
@@ -818,7 +815,7 @@ fn flexbox_layout_data(
818815
let align_content = if let Some(expr) = &layout.align_content {
819816
llr_Expression::PropertyReference(ctx.map_property_reference(expr))
820817
} else {
821-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.FlexboxLayoutAlignContent.clone());
818+
let e = crate::typeregister::BUILTIN.enums.FlexboxLayoutAlignContent.clone();
822819
llr_Expression::EnumerationValue(EnumerationValue {
823820
value: e.default_value,
824821
enumeration: e,
@@ -828,7 +825,7 @@ fn flexbox_layout_data(
828825
let cross_axis_alignment = if let Some(expr) = &layout.cross_axis_alignment {
829826
llr_Expression::PropertyReference(ctx.map_property_reference(expr))
830827
} else {
831-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.CrossAxisAlignment.clone());
828+
let e = crate::typeregister::BUILTIN.enums.CrossAxisAlignment.clone();
832829
llr_Expression::EnumerationValue(EnumerationValue {
833830
value: e.default_value,
834831
enumeration: e,
@@ -838,7 +835,7 @@ fn flexbox_layout_data(
838835
let flex_wrap = if let Some(expr) = &layout.flex_wrap {
839836
llr_Expression::PropertyReference(ctx.map_property_reference(expr))
840837
} else {
841-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.FlexboxLayoutWrap.clone());
838+
let e = crate::typeregister::BUILTIN.enums.FlexboxLayoutWrap.clone();
842839
llr_Expression::EnumerationValue(EnumerationValue {
843840
value: e.default_value,
844841
enumeration: e,
@@ -1039,7 +1036,7 @@ struct BoxLayoutDataResult {
10391036
}
10401037

10411038
fn default_align_self() -> (Type, llr_Expression) {
1042-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.FlexboxLayoutAlignSelf.clone());
1039+
let e = crate::typeregister::BUILTIN.enums.FlexboxLayoutAlignSelf.clone();
10431040
(
10441041
Type::Enumeration(e.clone()),
10451042
llr_Expression::EnumerationValue(EnumerationValue {
@@ -1090,7 +1087,7 @@ fn box_layout_data(
10901087
let alignment = if let Some(expr) = &layout.geometry.alignment {
10911088
llr_Expression::PropertyReference(ctx.map_property_reference(expr))
10921089
} else {
1093-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.LayoutAlignment.clone());
1090+
let e = crate::typeregister::BUILTIN.enums.LayoutAlignment.clone();
10941091
llr_Expression::EnumerationValue(EnumerationValue {
10951092
value: e.default_value,
10961093
enumeration: e,
@@ -1304,8 +1301,7 @@ fn clamp_wrapping_flex_cross_preferred(
13041301
// wrapping flex is clamped. Decide at runtime when flex-wrap is dynamic.
13051302
let new_preferred = match &flex.flex_wrap {
13061303
Some(nr) => {
1307-
let wrap_enum =
1308-
crate::typeregister::BUILTIN.with(|e| e.enums.FlexboxLayoutWrap.clone());
1304+
let wrap_enum = crate::typeregister::BUILTIN.enums.FlexboxLayoutWrap.clone();
13091305
let is_no_wrap = llr_Expression::BinaryExpression {
13101306
lhs: Box::new(llr_Expression::PropertyReference(ctx.map_property_reference(nr))),
13111307
rhs: Box::new(llr_Expression::EnumerationValue(EnumerationValue {
@@ -1337,8 +1333,7 @@ fn clamp_wrapping_flex_cross_preferred(
13371333
FlexboxAxisRelation::MainAxis => clamped_struct,
13381334
FlexboxAxisRelation::CrossAxis => unreachable!("returned early above"),
13391335
FlexboxAxisRelation::Unknown => {
1340-
let direction_enum =
1341-
crate::typeregister::BUILTIN.with(|e| e.enums.FlexboxLayoutDirection.clone());
1336+
let direction_enum = crate::typeregister::BUILTIN.enums.FlexboxLayoutDirection.clone();
13421337
let direction_ref = llr_Expression::PropertyReference(
13431338
ctx.map_property_reference(flex.direction.as_ref().unwrap()),
13441339
);

internal/compiler/lookup.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ impl LookupObject for MouseCursorSpecific {
863863
_ctx: &LookupCtx,
864864
f: &mut impl FnMut(&SmolStr, LookupResult) -> Option<R>,
865865
) -> Option<R> {
866-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.BuiltInMouseCursor.clone());
866+
let e = crate::typeregister::BUILTIN.enums.BuiltInMouseCursor.clone();
867867
let mut cursor = |n, e| f(n, Expression::MouseCursor(MouseCursorInner::BuiltIn(e)).into());
868868
let mut r = None;
869869
for value in &e.values {
@@ -892,10 +892,10 @@ impl LookupObject for SlintInternal {
892892
f(
893893
"color-scheme",
894894
if style.is_some_and(|s| s.ends_with("-light")) {
895-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.ColorScheme.clone());
895+
let e = crate::typeregister::BUILTIN.enums.ColorScheme.clone();
896896
Expression::EnumerationValue(e.try_value_from_string("light").unwrap())
897897
} else if style.is_some_and(|s| s.ends_with("-dark")) {
898-
let e = crate::typeregister::BUILTIN.with(|e| e.enums.ColorScheme.clone());
898+
let e = crate::typeregister::BUILTIN.enums.ColorScheme.clone();
899899
Expression::EnumerationValue(e.try_value_from_string("dark").unwrap())
900900
} else {
901901
Expression::FunctionCall {

internal/compiler/passes/compile_paths.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ fn compile_path_from_string_literal(
147147
)?;
148148
let path = builder.build();
149149

150-
let event_enum = crate::typeregister::BUILTIN.with(|e| e.enums.PathEvent.clone());
150+
let event_enum = crate::typeregister::BUILTIN.enums.PathEvent.clone();
151151
let point_type = Arc::new(Struct::new(
152152
IntoIterator::into_iter([
153153
(SmolStr::new_static("x"), Type::Float32),

internal/compiler/passes/lower_accessibility.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ fn apply_builtin(e: &ElementRc) {
6666
let bty = if let Some(bty) = e.borrow().builtin_type() { bty } else { return };
6767
if bty.name == "Text" {
6868
e.borrow_mut().set_binding_if_not_set("accessible-role".into(), || {
69-
let enum_ty = crate::typeregister::BUILTIN.with(|e| e.enums.AccessibleRole.clone());
69+
let enum_ty = crate::typeregister::BUILTIN.enums.AccessibleRole.clone();
7070
Expression::EnumerationValue(EnumerationValue {
7171
value: enum_ty.values.iter().position(|v| v == "text").unwrap(),
7272
enumeration: enum_ty,
@@ -78,7 +78,7 @@ fn apply_builtin(e: &ElementRc) {
7878
});
7979
} else if bty.name == "TextInput" {
8080
e.borrow_mut().set_binding_if_not_set("accessible-role".into(), || {
81-
let enum_ty = crate::typeregister::BUILTIN.with(|e| e.enums.AccessibleRole.clone());
81+
let enum_ty = crate::typeregister::BUILTIN.enums.AccessibleRole.clone();
8282
Expression::EnumerationValue(EnumerationValue {
8383
value: enum_ty.values.iter().position(|v| v == "text-input").unwrap(),
8484
enumeration: enum_ty,
@@ -121,7 +121,7 @@ fn apply_builtin(e: &ElementRc) {
121121
}
122122
} else if bty.name == "Image" {
123123
e.borrow_mut().set_binding_if_not_set("accessible-role".into(), || {
124-
let enum_ty = crate::typeregister::BUILTIN.with(|e| e.enums.AccessibleRole.clone());
124+
let enum_ty = crate::typeregister::BUILTIN.enums.AccessibleRole.clone();
125125
Expression::EnumerationValue(EnumerationValue {
126126
value: enum_ty.values.iter().position(|v| v == "image").unwrap(),
127127
enumeration: enum_ty,

internal/compiler/passes/lower_popups.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ fn lower_popup_window(
118118
assert!(diag.has_errors());
119119
return None;
120120
};
121-
let enum_ty = crate::typeregister::BUILTIN.with(|e| e.enums.PopupClosePolicy.clone());
121+
let enum_ty = crate::typeregister::BUILTIN.enums.PopupClosePolicy.clone();
122122
let s = if *v { "close-on-click" } else { "no-auto-close" };
123123
Some(EnumerationValue {
124124
value: enum_ty.values.iter().position(|v| v == s).unwrap(),
@@ -177,7 +177,7 @@ fn lower_popup_window(
177177
})
178178
.unwrap_or_else(|| EnumerationValue {
179179
value: 0,
180-
enumeration: crate::typeregister::BUILTIN.with(|e| e.enums.PopupClosePolicy.clone()),
180+
enumeration: crate::typeregister::BUILTIN.enums.PopupClosePolicy.clone(),
181181
});
182182

183183
let popup_comp = Rc::new(Component {

internal/compiler/passes/lower_radiogroup.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,9 @@ fn wire_radio_button(
164164
// row / col for the parent GridLayout — stack vertically (column 0,
165165
// increasing rows) for vertical orientation, otherwise stack horizontally.
166166
let orientation_vertical = crate::typeregister::BUILTIN
167-
.with(|e| e.enums.Orientation.clone())
167+
.enums
168+
.Orientation
169+
.clone()
168170
.try_value_from_string("vertical")
169171
.unwrap();
170172
let is_vertical = Expression::BinaryExpression {

internal/compiler/passes/lower_states.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::collections::{HashMap, HashSet};
1616
use std::rc::{Rc, Weak};
1717

1818
pub fn lower_states(component: &Rc<Component>, diag: &mut BuildDiagnostics) {
19-
let state_info_type = crate::typeregister::BUILTIN.with(|b| b.state_info_type.clone().into());
19+
let state_info_type = crate::typeregister::BUILTIN.state_info_type.clone().into();
2020
recurse_elem(&component.root_element, &(), &mut |elem, _| {
2121
lower_state_in_element(elem, &state_info_type, diag)
2222
});

0 commit comments

Comments
 (0)