Skip to content

Commit 55026f3

Browse files
committed
more functions
1 parent 0af733b commit 55026f3

File tree

5 files changed

+184
-244
lines changed

5 files changed

+184
-244
lines changed

naga/src/proc/builtins/anyoverloadset.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Dynamically dispatched [`OverloadSet`]s.
22
3-
use super::{frexp_modf, list, regular, OverloadSet, Rule};
3+
use super::{list, regular, OverloadSet, Rule};
44
use crate::common::DiagnosticDebug;
55
use crate::ir;
66
use crate::proc::{GlobalCtx, TypeResolution};
@@ -117,5 +117,4 @@ macro_rules! define_any_overload_set {
117117
define_any_overload_set! {
118118
list::List,
119119
regular::Regular,
120-
frexp_modf::FrexpModf,
121120
}

naga/src/proc/builtins/list.rs

Lines changed: 19 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
//! An overload set represented as a static list.
1+
//! An [`OverloadSet`] represented as a vector of rules.
22
33
use super::one_bits_iter::OneBitsIter;
4-
use super::{Conclusion, Rule};
4+
use super::Rule;
55

66
use crate::common::DiagnosticDebug;
77
use crate::proc::{GlobalCtx, TypeResolution};
88

9+
use alloc::sync::Arc;
910
use alloc::vec::Vec;
1011
use core::fmt;
1112

@@ -26,25 +27,19 @@ pub struct List {
2627
/// is always more preferred than all subsequent rules in the
2728
/// list. If there is no such arrangement of rules, then you
2829
/// cannot use `List` to represent the overload set.
29-
rules: &'static [StaticRule],
30-
}
31-
32-
#[derive(Clone)]
33-
pub struct StaticRule {
34-
pub subexpressions: &'static [crate::TypeInner],
35-
pub conclusion: crate::TypeInner,
30+
rules: Arc<Vec<Rule>>,
3631
}
3732

3833
impl List {
3934
#[allow(dead_code)]
40-
pub(super) const fn from_rules(rules: &'static [StaticRule]) -> List {
35+
pub(super) fn from_rules(rules: Vec<Rule>) -> List {
4136
List {
4237
members: len_to_full_mask(rules.len()),
43-
rules,
38+
rules: Arc::new(rules),
4439
}
4540
}
4641

47-
fn members(&self) -> impl Iterator<Item = (u64, &StaticRule)> {
42+
fn members(&self) -> impl Iterator<Item = (u64, &Rule)> {
4843
OneBitsIter::new(self.members).map(|mask| {
4944
let index = mask.trailing_zeros() as usize;
5045
(mask, &self.rules[index])
@@ -53,7 +48,7 @@ impl List {
5348

5449
fn filter<F>(&self, mut pred: F) -> List
5550
where
56-
F: FnMut(&StaticRule) -> bool,
51+
F: FnMut(&Rule) -> bool,
5752
{
5853
let mut filtered_members = 0;
5954
for (mask, rule) in self.members() {
@@ -64,20 +59,7 @@ impl List {
6459

6560
List {
6661
members: filtered_members,
67-
rules: self.rules,
68-
}
69-
}
70-
}
71-
72-
impl StaticRule {
73-
fn to_rule(&self) -> Rule {
74-
Rule {
75-
subexpressions: self
76-
.subexpressions
77-
.iter()
78-
.map(|inner| TypeResolution::Value(inner.clone()))
79-
.collect(),
80-
conclusion: Conclusion::Value(self.conclusion.clone()),
62+
rules: self.rules.clone(),
8163
}
8264
}
8365
}
@@ -121,6 +103,7 @@ impl super::OverloadSet for List {
121103
log::debug!(" considering rule {:?}", DiagnosticDebug((rule, types)));
122104
match rule.subexpressions.get(i) {
123105
Some(rule_ty) => {
106+
let rule_ty = rule_ty.inner_with(types);
124107
if arg_ty.equivalent(rule_ty, types) {
125108
log::debug!(" types are equivalent");
126109
} else {
@@ -142,6 +125,7 @@ impl super::OverloadSet for List {
142125
}
143126
}
144127
rule.subexpressions.get(i).is_some_and(|rule_ty| {
128+
let rule_ty = rule_ty.inner_with(types);
145129
arg_ty.equivalent(rule_ty, types)
146130
|| arg_ty.automatically_converts_to(rule_ty, types).is_some()
147131
})
@@ -152,27 +136,25 @@ impl super::OverloadSet for List {
152136
self.filter(|rule| {
153137
rule.subexpressions
154138
.iter()
155-
.all(|arg_ty| !arg_ty.is_abstract(types))
139+
.all(|arg_ty| !arg_ty.inner_with(types).is_abstract(types))
156140
})
157141
}
158142

159143
fn most_preferred(&self) -> Option<Rule> {
160144
// As documented for `Self::rules`, whatever rule is first is
161145
// the most preferred. `OverloadSet` documents this method to
162146
// panic if the set is empty.
163-
let (_, static_rule) = self.members().next().unwrap();
164-
Some(static_rule.to_rule())
147+
let (_, rule) = self.members().next().unwrap();
148+
Some(rule.clone())
165149
}
166150

167151
fn overload_list(&self, _gctx: &GlobalCtx<'_>) -> Vec<Rule> {
168-
self.members()
169-
.map(|(_, static_rule)| static_rule.to_rule())
170-
.collect()
152+
self.members().map(|(_, rule)| rule.clone()).collect()
171153
}
172154

173155
fn allowed_args(&self, i: usize, _gctx: &GlobalCtx<'_>) -> Vec<TypeResolution> {
174156
self.members()
175-
.map(|(_, rule)| TypeResolution::Value(rule.subexpressions[i].clone()))
157+
.map(|(_, rule)| rule.subexpressions[i].clone())
176158
.collect()
177159
}
178160

@@ -193,26 +175,11 @@ impl fmt::Debug for DiagnosticDebug<(&List, &GlobalCtx<'_>)> {
193175
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
194176
let (list, ctx) = self.0;
195177

196-
f.debug_map()
178+
f.debug_list()
197179
.entries(
198-
list.members().map(|(mask, rule)| {
199-
(DiagnosticDebug((rule, ctx.types)), list.members & mask != 0)
200-
}),
180+
list.members()
181+
.map(|(_mask, rule)| DiagnosticDebug((rule, ctx.types))),
201182
)
202183
.finish()
203184
}
204185
}
205-
206-
impl fmt::Debug for DiagnosticDebug<(&StaticRule, &crate::UniqueArena<crate::Type>)> {
207-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
208-
let (rule, arena) = self.0;
209-
f.write_str("(")?;
210-
for (i, subexpression) in rule.subexpressions.iter().enumerate() {
211-
if i > 0 {
212-
f.write_str(", ")?;
213-
}
214-
write!(f, "{:?}", DiagnosticDebug((subexpression, arena)))?;
215-
}
216-
write!(f, ") -> {:?}", DiagnosticDebug((&rule.conclusion, arena)))
217-
}
218-
}

0 commit comments

Comments
 (0)