Skip to content

Commit d164d87

Browse files
authored
Merge branch 'master' into ironcev/panic-expression
2 parents 8cb0ff3 + 2b06d79 commit d164d87

File tree

18 files changed

+263
-123
lines changed

18 files changed

+263
-123
lines changed

forc-plugins/forc-doc/src/render/item/context.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ impl Renderable for TyFunctionDecl {
614614
let attributes = self.attributes.to_html_string();
615615

616616
let mut fn_sig = format!("fn {}(", self.name.as_str());
617-
for param in &self.parameters {
617+
for param in self.parameters.iter() {
618618
let mut param_str = String::new();
619619
if param.is_reference {
620620
write!(param_str, "ref ")?;
@@ -651,7 +651,7 @@ impl Renderable for TyFunctionDecl {
651651
}
652652
: "(";
653653
@ if multiline {
654-
@ for param in &self.parameters {
654+
@ for param in self.parameters.iter() {
655655
br;
656656
: " ";
657657
@ if param.is_reference {
@@ -672,7 +672,7 @@ impl Renderable for TyFunctionDecl {
672672
br;
673673
: ")";
674674
} else {
675-
@ for param in &self.parameters {
675+
@ for param in self.parameters.iter() {
676676
@ if param.is_reference {
677677
: "ref";
678678
}

sway-core/src/concurrent_slab.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,15 @@ where
115115
.clone()
116116
}
117117

118+
/// Improve performance by avoiding `Arc::clone`.
119+
/// The slab is kept locked while running `f`.
120+
pub fn map<R>(&self, index: usize, f: impl FnOnce(&T) -> R) -> R {
121+
let inner = self.inner.read();
122+
f(inner.items[index]
123+
.as_ref()
124+
.expect("invalid slab index for ConcurrentSlab::get"))
125+
}
126+
118127
pub fn retain(&self, predicate: impl Fn(&usize, &mut Arc<T>) -> bool) {
119128
let mut inner = self.inner.write();
120129

sway-core/src/control_flow_analysis/dead_code_analysis.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1099,7 +1099,7 @@ fn connect_fn_params_struct_enums<'eng: 'cfg, 'cfg>(
10991099
fn_decl_entry_node: NodeIndex,
11001100
) -> Result<(), CompileError> {
11011101
let type_engine = engines.te();
1102-
for fn_param in &fn_decl.parameters {
1102+
for fn_param in fn_decl.parameters.iter() {
11031103
let ty = type_engine.to_typeinfo(
11041104
fn_param.type_argument.type_id(),
11051105
&fn_param.type_argument.span(),

sway-core/src/decl_engine/engine.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ impl Clone for DeclEngine {
121121

122122
pub trait DeclEngineGet<I, U> {
123123
fn get(&self, index: &I) -> Arc<U>;
124+
fn map<R>(&self, index: &I, f: impl FnOnce(&U) -> R) -> R;
124125
}
125126

126127
pub trait DeclEngineGetParsedDeclId<T>
@@ -175,12 +176,20 @@ macro_rules! decl_engine_get {
175176
fn get(&self, index: &DeclId<$decl>) -> Arc<$decl> {
176177
self.$slab.get(index.inner())
177178
}
179+
180+
fn map<R>(&self, index: &DeclId<$decl>, f: impl FnOnce(&$decl) -> R) -> R {
181+
self.$slab.map(index.inner(), f)
182+
}
178183
}
179184

180185
impl DeclEngineGet<DeclRef<DeclId<$decl>>, $decl> for DeclEngine {
181186
fn get(&self, index: &DeclRef<DeclId<$decl>>) -> Arc<$decl> {
182187
self.$slab.get(index.id().inner())
183188
}
189+
190+
fn map<R>(&self, index: &DeclRef<DeclId<$decl>>, f: impl FnOnce(&$decl) -> R) -> R {
191+
self.$slab.map(index.id().inner(), f)
192+
}
184193
}
185194
};
186195
}

sway-core/src/decl_engine/parsed_engine.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pub struct ParsedDeclEngine {
3535

3636
pub trait ParsedDeclEngineGet<I, U> {
3737
fn get(&self, index: &I) -> Arc<U>;
38+
fn map<R>(&self, index: &I, f: impl FnOnce(&U) -> R) -> R;
3839
}
3940

4041
pub trait ParsedDeclEngineInsert<T> {
@@ -58,6 +59,10 @@ macro_rules! decl_engine_get {
5859
fn get(&self, index: &ParsedDeclId<$decl>) -> Arc<$decl> {
5960
self.$slab.get(index.inner())
6061
}
62+
63+
fn map<R>(&self, index: &ParsedDeclId<$decl>, f: impl FnOnce(&$decl) -> R) -> R {
64+
self.$slab.map(index.inner(), f)
65+
}
6166
}
6267
};
6368
}

sway-core/src/decl_engine/replace_decls.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,24 @@ pub trait ReplaceDecls {
3030
}
3131
}
3232

33+
impl<T: ReplaceDecls + Clone> ReplaceDecls for std::sync::Arc<T> {
34+
fn replace_decls_inner(
35+
&mut self,
36+
decl_mapping: &DeclMapping,
37+
handler: &Handler,
38+
ctx: &mut TypeCheckContext,
39+
) -> Result<bool, ErrorEmitted> {
40+
if let Some(item) = std::sync::Arc::get_mut(self) {
41+
item.replace_decls_inner(decl_mapping, handler, ctx)
42+
} else {
43+
let mut item = self.as_ref().clone();
44+
let r = item.replace_decls_inner(decl_mapping, handler, ctx)?;
45+
*self = std::sync::Arc::new(item);
46+
Ok(r)
47+
}
48+
}
49+
}
50+
3351
pub(crate) trait ReplaceFunctionImplementingType {
3452
fn replace_implementing_type(&mut self, engines: &Engines, implementing_type: ty::TyDecl);
3553
}
@@ -38,6 +56,18 @@ pub(crate) trait UpdateConstantExpression {
3856
fn update_constant_expression(&mut self, engines: &Engines, implementing_type: &TyDecl);
3957
}
4058

59+
impl<T: UpdateConstantExpression + Clone> UpdateConstantExpression for std::sync::Arc<T> {
60+
fn update_constant_expression(&mut self, engines: &Engines, implementing_type: &TyDecl) {
61+
if let Some(item) = std::sync::Arc::get_mut(self) {
62+
item.update_constant_expression(engines, implementing_type);
63+
} else {
64+
let mut item = self.as_ref().clone();
65+
item.update_constant_expression(engines, implementing_type);
66+
*self = std::sync::Arc::new(item);
67+
}
68+
}
69+
}
70+
4171
// Iterate the tree searching for references to a const generic,
4272
// and initialize its value with the passed value
4373
pub(crate) trait MaterializeConstGenerics {
@@ -49,3 +79,22 @@ pub(crate) trait MaterializeConstGenerics {
4979
value: &TyExpression,
5080
) -> Result<(), ErrorEmitted>;
5181
}
82+
83+
impl<T: MaterializeConstGenerics + Clone> MaterializeConstGenerics for std::sync::Arc<T> {
84+
fn materialize_const_generics(
85+
&mut self,
86+
engines: &Engines,
87+
handler: &Handler,
88+
name: &str,
89+
value: &TyExpression,
90+
) -> Result<(), ErrorEmitted> {
91+
if let Some(item) = std::sync::Arc::get_mut(self) {
92+
item.materialize_const_generics(engines, handler, name, value)
93+
} else {
94+
let mut item = self.as_ref().clone();
95+
let r = item.materialize_const_generics(engines, handler, name, value);
96+
*self = std::sync::Arc::new(item);
97+
r
98+
}
99+
}
100+
}

sway-core/src/language/ty/declaration/function.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ impl TyFunctionDecl {
437437
TyFunctionDecl {
438438
purity: *purity,
439439
name: name.clone(),
440-
body: TyCodeBlock::default(),
440+
body: <_>::default(),
441441
implementing_type: None,
442442
implementing_for_typeid: None,
443443
span: span.clone(),

sway-core/src/language/ty/program.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ fn get_type_not_allowed_error(
4949

5050
fn check_no_ref_main(engines: &Engines, handler: &Handler, main_function: &DeclId<TyFunctionDecl>) {
5151
let main_function = engines.de().get_function(main_function);
52-
for param in &main_function.parameters {
52+
for param in main_function.parameters.iter() {
5353
if param.is_reference && param.is_mutable {
5454
handler.emit_err(CompileError::RefMutableNotAllowedInMain {
5555
param_name: param.name.clone(),

sway-core/src/semantic_analysis/ast_node/declaration/abi.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ impl ty::TyAbiDecl {
203203
)
204204
.unwrap_or_else(|_| ty::TyFunctionDecl::error(&method));
205205
error_on_shadowing_superabi_method(&method.name, ctx);
206-
for param in &method.parameters {
206+
for param in method.parameters.iter() {
207207
if param.is_reference || param.is_mutable {
208208
handler.emit_err(CompileError::RefMutableNotAllowedInContractAbi {
209209
param_name: param.name.clone(),

sway-core/src/semantic_analysis/ast_node/declaration/function.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ impl ty::TyFunctionDecl {
163163

164164
let function_decl = ty::TyFunctionDecl {
165165
name: name.clone(),
166-
body: TyCodeBlock::default(),
166+
body: <_>::default(),
167167
parameters: new_parameters,
168168
implementing_type: None,
169169
implementing_for_typeid,
@@ -220,7 +220,7 @@ impl ty::TyFunctionDecl {
220220
}
221221

222222
// Insert the previously type checked function parameters into the current namespace.
223-
for p in parameters {
223+
for p in parameters.iter() {
224224
p.insert_into_namespace(handler, ctx.by_ref());
225225
}
226226

0 commit comments

Comments
 (0)