Reduce usage of Default::default()

This commit is contained in:
Stephen Chung 2021-09-11 19:40:40 +08:00
parent 5d3a22ab6f
commit 6510b617fe
14 changed files with 59 additions and 45 deletions

View File

@ -9,6 +9,7 @@ Bug fixes
* Custom syntax starting with a disabled standard keyword now works properly. * Custom syntax starting with a disabled standard keyword now works properly.
* When calling `Engine::call_fn`, new variables defined during evaluation of the body script are removed and no longer spill into the function call. * When calling `Engine::call_fn`, new variables defined during evaluation of the body script are removed and no longer spill into the function call.
* `NamespaceRef::new` is fixed.
Enhancements Enhancements
------------ ------------

View File

@ -49,7 +49,7 @@ impl ExportedParams for ExportedModParams {
fn from_info(info: ExportInfo) -> syn::Result<Self> { fn from_info(info: ExportInfo) -> syn::Result<Self> {
let ExportInfo { items: attrs, .. } = info; let ExportInfo { items: attrs, .. } = info;
let mut name = Default::default(); let mut name = String::new();
let mut skip = false; let mut skip = false;
let mut scope = None; let mut scope = None;
for attr in attrs { for attr in attrs {

View File

@ -201,13 +201,7 @@ pub struct AST {
impl Default for AST { impl Default for AST {
#[inline(always)] #[inline(always)]
fn default() -> Self { fn default() -> Self {
Self { Self::new_empty()
source: None,
body: Default::default(),
functions: Default::default(),
#[cfg(not(feature = "no_module"))]
resolver: None,
}
} }
} }
@ -227,6 +221,18 @@ impl AST {
resolver: None, resolver: None,
} }
} }
/// Create an empty [`AST`].
#[inline]
#[must_use]
pub fn new_empty() -> Self {
Self {
source: None,
body: Default::default(),
functions: Default::default(),
#[cfg(not(feature = "no_module"))]
resolver: None,
}
}
/// Create a new [`AST`] with a source name. /// Create a new [`AST`] with a source name.
#[inline(always)] #[inline(always)]
#[must_use] #[must_use]

View File

@ -163,9 +163,9 @@ fn main() {
// REPL loop // REPL loop
let mut input = String::new(); let mut input = String::new();
let mut main_ast: AST = Default::default(); let mut main_ast = AST::new_empty();
let mut ast_u: AST = Default::default(); let mut ast_u = AST::new_empty();
let mut ast: AST = Default::default(); let mut ast = AST::new_empty();
'main_loop: loop { 'main_loop: loop {
print!("rhai-repl> "); print!("rhai-repl> ");

View File

@ -198,7 +198,7 @@ impl Engine {
) -> Result<&mut Self, ParseError> { ) -> Result<&mut Self, ParseError> {
use markers::*; use markers::*;
let mut segments: StaticVec<ImmutableString> = Default::default(); let mut segments = StaticVec::<ImmutableString>::new();
for s in symbols { for s in symbols {
let s = s.as_ref().trim(); let s = s.as_ref().trim();

View File

@ -2766,7 +2766,7 @@ impl Engine {
} }
#[cfg(not(feature = "no_object"))] #[cfg(not(feature = "no_object"))]
_ => { _ => {
let mut err_map: Map = Default::default(); let mut err_map = Map::new();
let err_pos = err.take_position(); let err_pos = err.take_position();
err_map.insert("message".into(), err.to_string().into()); err_map.insert("message".into(), err.to_string().into());

View File

@ -961,7 +961,7 @@ impl Engine {
let remainder = iter.next().expect("name contains separator").trim(); let remainder = iter.next().expect("name contains separator").trim();
if !root.contains_key(sub_module) { if !root.contains_key(sub_module) {
let mut m: Module = Default::default(); let mut m = Module::new();
register_static_module_raw(m.sub_modules_mut(), remainder, module); register_static_module_raw(m.sub_modules_mut(), remainder, module);
m.build_index(); m.build_index();
root.insert(sub_module.into(), m.into()); root.insert(sub_module.into(), m.into());
@ -1351,7 +1351,7 @@ impl Engine {
json: &str, json: &str,
has_null: bool, has_null: bool,
) -> Result<Map, Box<EvalAltResult>> { ) -> Result<Map, Box<EvalAltResult>> {
let mut scope = Default::default(); let mut scope = Scope::new();
let json_text = json.trim_start(); let json_text = json.trim_start();
let scripts = if json_text.starts_with(Token::MapStart.literal_syntax()) { let scripts = if json_text.starts_with(Token::MapStart.literal_syntax()) {
[json_text, ""] [json_text, ""]
@ -1860,7 +1860,7 @@ impl Engine {
name: impl AsRef<str>, name: impl AsRef<str>,
args: impl crate::FuncArgs, args: impl crate::FuncArgs,
) -> Result<T, Box<EvalAltResult>> { ) -> Result<T, Box<EvalAltResult>> {
let mut arg_values: crate::StaticVec<_> = Default::default(); let mut arg_values = crate::StaticVec::new();
args.parse(&mut arg_values); args.parse(&mut arg_values);
let mut args: crate::StaticVec<_> = arg_values.iter_mut().collect(); let mut args: crate::StaticVec<_> = arg_values.iter_mut().collect();
let name = name.as_ref(); let name = name.as_ref();
@ -2053,7 +2053,7 @@ impl Engine {
#[inline] #[inline]
#[must_use] #[must_use]
pub fn gen_fn_signatures(&self, include_packages: bool) -> Vec<String> { pub fn gen_fn_signatures(&self, include_packages: bool) -> Vec<String> {
let mut signatures: Vec<_> = Default::default(); let mut signatures = Vec::new();
signatures.extend(self.global_namespace().gen_fn_signatures()); signatures.extend(self.global_namespace().gen_fn_signatures());

View File

@ -264,7 +264,7 @@ pub use module::NamespaceRef;
/// being the third number, be reached, then, lobbest thou thy `SmallVec` towards thy heap, who, /// being the third number, be reached, then, lobbest thou thy `SmallVec` towards thy heap, who,
/// being slow and cache-naughty in My sight, shall snuff it." /// being slow and cache-naughty in My sight, shall snuff it."
/// ///
/// # Explanation on the Number Three /// # Why Three
/// ///
/// `StaticVec` is used frequently to keep small lists of items in inline (non-heap) storage in /// `StaticVec` is used frequently to keep small lists of items in inline (non-heap) storage in
/// order to improve cache friendliness and reduce indirections. /// order to improve cache friendliness and reduce indirections.
@ -274,14 +274,14 @@ pub use module::NamespaceRef;
/// in that matter) contain fewer than 4 arguments, the exception being closures that capture a /// in that matter) contain fewer than 4 arguments, the exception being closures that capture a
/// large number of external variables. /// large number of external variables.
/// ///
/// In addition, most script blocks either contain many statements, or just a few lines; /// In addition, most script blocks either contain many statements, or just one or two lines;
/// most scripts load fewer than 4 external modules; most module paths contain fewer than 4 levels /// most scripts load fewer than 4 external modules; most module paths contain fewer than 4 levels
/// (e.g. `std::collections::map::HashMap` is 4 levels). /// (e.g. `std::collections::map::HashMap` is 4 levels and it is just about as long as they get).
#[cfg(not(feature = "internals"))] #[cfg(not(feature = "internals"))]
type StaticVec<T> = smallvec::SmallVec<[T; 3]>; type StaticVec<T> = smallvec::SmallVec<[T; 3]>;
/// _(internals)_ Alias to [`smallvec`](https://crates.io/crates/smallvec), which is a specialized /// _(internals)_ Alias to [`smallvec::SmallVec<[T; 3]>`](https://crates.io/crates/smallvec),
/// [`Vec`] backed by a small, inline, fixed-size array when there are ≤ 3 items stored. /// which is a [`Vec`] backed by a small, inline, fixed-size array when there are ≤ 3 items stored.
/// Exported under the `internals` feature only. /// Exported under the `internals` feature only.
/// ///
/// # History /// # History
@ -299,7 +299,7 @@ type StaticVec<T> = smallvec::SmallVec<[T; 3]>;
/// being the third number, be reached, then, lobbest thou thy `SmallVec` towards thy heap, who, /// being the third number, be reached, then, lobbest thou thy `SmallVec` towards thy heap, who,
/// being slow and cache-naughty in My sight, shall snuff it." /// being slow and cache-naughty in My sight, shall snuff it."
/// ///
/// # Explanation on the Number Three /// # Why Three
/// ///
/// `StaticVec` is used frequently to keep small lists of items in inline (non-heap) storage in /// `StaticVec` is used frequently to keep small lists of items in inline (non-heap) storage in
/// order to improve cache friendliness and reduce indirections. /// order to improve cache friendliness and reduce indirections.
@ -309,9 +309,9 @@ type StaticVec<T> = smallvec::SmallVec<[T; 3]>;
/// in that matter) contain fewer than 4 arguments, the exception being closures that capture a /// in that matter) contain fewer than 4 arguments, the exception being closures that capture a
/// large number of external variables. /// large number of external variables.
/// ///
/// In addition, most script blocks either contain many statements, or just a few lines; /// In addition, most script blocks either contain many statements, or just one or two lines;
/// most scripts load fewer than 4 external modules; most module paths contain fewer than 4 levels /// most scripts load fewer than 4 external modules; most module paths contain fewer than 4 levels
/// (e.g. `std::collections::map::HashMap` is 4 levels). /// (e.g. `std::collections::map::HashMap` is 4 levels and it is just about as long as they get).
#[cfg(feature = "internals")] #[cfg(feature = "internals")]
pub type StaticVec<T> = smallvec::SmallVec<[T; 3]>; pub type StaticVec<T> = smallvec::SmallVec<[T; 3]>;

View File

@ -179,7 +179,7 @@ mod array_functions {
if n as usize > array.len() { if n as usize > array.len() {
mem::take(array) mem::take(array)
} else { } else {
let mut result: Array = Default::default(); let mut result = Array::new();
result.extend(array.drain(array.len() - n as usize..)); result.extend(array.drain(array.len() - n as usize..));
result result
} }
@ -189,7 +189,7 @@ mod array_functions {
} else if start as usize >= array.len() { } else if start as usize >= array.len() {
Default::default() Default::default()
} else { } else {
let mut result: Array = Default::default(); let mut result = Array::new();
result.extend(array.drain(start as usize..)); result.extend(array.drain(start as usize..));
result result
} }

View File

@ -92,7 +92,7 @@ fn collect_fn_metadata(ctx: NativeCallContext) -> crate::Array {
.map(|&s| s.into()) .map(|&s| s.into())
.collect(); .collect();
let mut list: Array = Default::default(); let mut list = Array::new();
ctx.iter_namespaces() ctx.iter_namespaces()
.flat_map(|m| m.iter_script_fn()) .flat_map(|m| m.iter_script_fn())

View File

@ -82,7 +82,7 @@ pub struct ParseState<'e> {
/// Interned strings. /// Interned strings.
interned_strings: IdentifierBuilder, interned_strings: IdentifierBuilder,
/// Encapsulates a local stack with variable names to simulate an actual runtime scope. /// Encapsulates a local stack with variable names to simulate an actual runtime scope.
stack: Vec<(Identifier, AccessMode)>, stack: StaticVec<(Identifier, AccessMode)>,
/// Size of the local variables stack upon entry of the current block scope. /// Size of the local variables stack upon entry of the current block scope.
entry_stack_len: usize, entry_stack_len: usize,
/// Tracks a list of external variables (variables that are not explicitly declared in the scope). /// Tracks a list of external variables (variables that are not explicitly declared in the scope).
@ -124,7 +124,7 @@ impl<'e> ParseState<'e> {
#[cfg(not(feature = "no_closure"))] #[cfg(not(feature = "no_closure"))]
allow_capture: true, allow_capture: true,
interned_strings: Default::default(), interned_strings: Default::default(),
stack: Vec::with_capacity(16), stack: Default::default(),
entry_stack_len: 0, entry_stack_len: 0,
#[cfg(not(feature = "no_module"))] #[cfg(not(feature = "no_module"))]
modules: Default::default(), modules: Default::default(),
@ -828,8 +828,8 @@ fn parse_map_literal(
// #{ ... // #{ ...
settings.pos = eat_token(input, Token::MapStart); settings.pos = eat_token(input, Token::MapStart);
let mut map: StaticVec<(Ident, Expr)> = Default::default(); let mut map = StaticVec::<(Ident, Expr)>::new();
let mut template: BTreeMap<Identifier, crate::Dynamic> = Default::default(); let mut template = BTreeMap::<Identifier, crate::Dynamic>::new();
loop { loop {
const MISSING_RBRACE: &str = "to end this object map literal"; const MISSING_RBRACE: &str = "to end this object map literal";
@ -1179,7 +1179,7 @@ fn parse_primary(
// Interpolated string // Interpolated string
Token::InterpolatedString(_) => { Token::InterpolatedString(_) => {
let mut segments: StaticVec<Expr> = Default::default(); let mut segments = StaticVec::<Expr>::new();
if let (Token::InterpolatedString(s), pos) = input.next().expect(NEVER_ENDS) { if let (Token::InterpolatedString(s), pos) = input.next().expect(NEVER_ENDS) {
segments.push(Expr::StringConstant(s.into(), pos)); segments.push(Expr::StringConstant(s.into(), pos));
@ -1389,7 +1389,7 @@ fn parse_primary(
if let Some((ref mut namespace, _)) = namespace { if let Some((ref mut namespace, _)) = namespace {
namespace.push(var_name_def); namespace.push(var_name_def);
} else { } else {
let mut ns: NamespaceRef = Default::default(); let mut ns = NamespaceRef::new();
ns.push(var_name_def); ns.push(var_name_def);
namespace = Some((ns, 42)); namespace = Some((ns, 42));
} }
@ -1977,9 +1977,9 @@ fn parse_custom_syntax(
pos: Position, pos: Position,
) -> Result<Expr, ParseError> { ) -> Result<Expr, ParseError> {
let mut settings = settings; let mut settings = settings;
let mut keywords: StaticVec<Expr> = Default::default(); let mut keywords = StaticVec::<Expr>::new();
let mut segments: StaticVec<_> = Default::default(); let mut segments = StaticVec::new();
let mut tokens: StaticVec<_> = Default::default(); let mut tokens = StaticVec::new();
// Adjust the variables stack // Adjust the variables stack
if syntax.scope_may_be_changed { if syntax.scope_may_be_changed {
@ -2699,7 +2699,7 @@ fn parse_stmt(
#[cfg(not(feature = "no_function"))] #[cfg(not(feature = "no_function"))]
#[cfg(feature = "metadata")] #[cfg(feature = "metadata")]
let comments = { let comments = {
let mut comments: StaticVec<String> = Default::default(); let mut comments = StaticVec::<String>::new();
let mut comments_pos = Position::NONE; let mut comments_pos = Position::NONE;
// Handle doc-comments. // Handle doc-comments.
@ -2982,7 +2982,7 @@ fn parse_fn(
(_, pos) => return Err(PERR::FnMissingParams(name).into_err(*pos)), (_, pos) => return Err(PERR::FnMissingParams(name).into_err(*pos)),
}; };
let mut params: StaticVec<_> = Default::default(); let mut params = StaticVec::new();
if !match_token(input, Token::RightParen).0 { if !match_token(input, Token::RightParen).0 {
let sep_err = format!("to separate the parameters of function '{}'", name); let sep_err = format!("to separate the parameters of function '{}'", name);
@ -3115,7 +3115,7 @@ fn parse_anon_fn(
#[cfg(not(feature = "unchecked"))] #[cfg(not(feature = "unchecked"))]
settings.ensure_level_within_max_limit(state.max_expr_depth)?; settings.ensure_level_within_max_limit(state.max_expr_depth)?;
let mut params_list: StaticVec<_> = Default::default(); let mut params_list = StaticVec::new();
if input.next().expect(NEVER_ENDS).0 != Token::Or && !match_token(input, Token::Pipe).0 { if input.next().expect(NEVER_ENDS).0 != Token::Or && !match_token(input, Token::Pipe).0 {
loop { loop {

View File

@ -142,7 +142,7 @@ impl<'d> Visitor<'d> for DynamicVisitor {
#[cfg(not(feature = "no_index"))] #[cfg(not(feature = "no_index"))]
fn visit_seq<A: SeqAccess<'d>>(self, mut seq: A) -> Result<Self::Value, A::Error> { fn visit_seq<A: SeqAccess<'d>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
let mut arr: Array = Default::default(); let mut arr = Array::new();
while let Some(v) = seq.next_element()? { while let Some(v) = seq.next_element()? {
arr.push(v); arr.push(v);
@ -153,7 +153,7 @@ impl<'d> Visitor<'d> for DynamicVisitor {
#[cfg(not(feature = "no_object"))] #[cfg(not(feature = "no_object"))]
fn visit_map<M: MapAccess<'d>>(self, mut map: M) -> Result<Self::Value, M::Error> { fn visit_map<M: MapAccess<'d>>(self, mut map: M) -> Result<Self::Value, M::Error> {
let mut m: Map = Default::default(); let mut m = Map::new();
while let Some((k, v)) = map.next_entry::<&str, _>()? { while let Some((k, v)) = map.next_entry::<&str, _>()? {
m.insert(k.into(), v); m.insert(k.into(), v);

View File

@ -207,6 +207,13 @@ struct ModuleMetadata {
pub functions: Vec<FnMetadata>, pub functions: Vec<FnMetadata>,
} }
impl ModuleMetadata {
#[inline(always)]
pub fn new() -> Self {
Default::default()
}
}
impl From<&crate::Module> for ModuleMetadata { impl From<&crate::Module> for ModuleMetadata {
fn from(module: &crate::Module) -> Self { fn from(module: &crate::Module) -> Self {
let mut functions: Vec<_> = module.iter_fn().map(|f| f.into()).collect(); let mut functions: Vec<_> = module.iter_fn().map(|f| f.into()).collect();
@ -239,7 +246,7 @@ impl Engine {
include_global: bool, include_global: bool,
) -> serde_json::Result<String> { ) -> serde_json::Result<String> {
let _ast = ast; let _ast = ast;
let mut global: ModuleMetadata = Default::default(); let mut global = ModuleMetadata::new();
if include_global { if include_global {
self.global_modules self.global_modules

View File

@ -1421,7 +1421,7 @@ fn get_next_token_inner(
// digit ... // digit ...
('0'..='9', _) => { ('0'..='9', _) => {
let mut result: smallvec::SmallVec<[char; 16]> = Default::default(); let mut result = smallvec::SmallVec::<[char; 16]>::new();
let mut radix_base: Option<u32> = None; let mut radix_base: Option<u32> = None;
let mut valid: fn(char) -> bool = is_numeric_digit; let mut valid: fn(char) -> bool = is_numeric_digit;
result.push(c); result.push(c);
@ -1951,7 +1951,7 @@ fn get_identifier(
start_pos: Position, start_pos: Position,
first_char: char, first_char: char,
) -> Option<(Token, Position)> { ) -> Option<(Token, Position)> {
let mut result: smallvec::SmallVec<[char; 8]> = Default::default(); let mut result = smallvec::SmallVec::<[char; 8]>::new();
result.push(first_char); result.push(first_char);
while let Some(next_char) = stream.peek_next() { while let Some(next_char) = stream.peek_next() {