Apply review suggestions

This commit is contained in:
Noah committed 2020-12-05 16:36:38 -06:00
1 parent 2bdbe6b804
commit 34bb5f0d7a
7 files changed
+44 -61

No files matched your search

+4 -7
View File
@@ -60,13 +60,10 @@ impl CodeInfo {
.cellvars
.iter()
.map(|var| {
for (i, arg) in all_args.iter().enumerate() {
if var == arg {
found_cellarg = true;
return i as isize;
}
}
-1
all_args.iter().position(|arg| var == arg).map_or(-1, |i| {
found_cellarg = true;
i as isize
})
})
.collect::<Box<[_]>>();
if found_cellarg {
+7 -2
View File
@@ -108,6 +108,7 @@ pub struct Symbol {
pub is_parameter: bool,
pub is_annotated: bool,
pub is_imported: bool,
pub is_nonlocal: bool,
// indicates if the symbol gets a value assigned by a named expression in a comprehension
// this is required to correct the scope in the analysis.
@@ -139,6 +140,7 @@ impl Symbol {
is_parameter: false,
is_annotated: false,
is_imported: false,
is_nonlocal: false,
is_assign_namedexpr_in_comprehension: false,
is_iter: false,
is_free_class: false,
@@ -218,7 +220,9 @@ mod stack {
}
}
impl<T> StackStack<T> {
pub fn append<F, R>(&mut self, x: &mut T, f: F) -> R
/// Appends a reference to this stack for the duration of the function `f`. When `f`
/// returns, the reference will be popped off the stack.
pub fn with_append<F, R>(&mut self, x: &mut T, f: F) -> R
where
F: FnOnce(&mut Self) -> R,
{
@@ -273,7 +277,7 @@ impl SymbolTableAnalyzer {
let sub_tables = &mut *symbol_table.sub_tables;
let mut info = (symbols, symbol_table.typ);
self.tables.append(&mut info, |list| {
self.tables.with_append(&mut info, |list| {
let inner_scope = unsafe { &mut *(list as *mut _ as *mut SymbolTableAnalyzer) };
// Analyze sub scopes:
for sub_table in sub_tables.iter_mut() {
@@ -1162,6 +1166,7 @@ impl SymbolTableBuilder {
match role {
SymbolUsage::Nonlocal => {
symbol.scope = SymbolScope::Free;
symbol.is_nonlocal = true;
}
SymbolUsage::Imported => {
symbol.is_assigned = true;
+19 -38
View File
@@ -615,9 +615,7 @@ impl PropertyItemMeta {
fn property_name(&self) -> Result<(String, GetSetItemKind)> {
let inner = self.inner();
let magic = inner._bool("magic")?;
let setter = inner._bool("setter")?;
let deleter = inner._bool("deleter")?;
let kind = match (setter, deleter) {
let kind = match (inner._bool("setter")?, inner._bool("deleter")?) {
(false, false) => GetSetItemKind::Get,
(true, false) => GetSetItemKind::Set,
(false, true) => GetSetItemKind::Delete,
@@ -636,54 +634,37 @@ impl PropertyItemMeta {
name
} else {
let sig_name = inner.item_name();
let name = if setter {
if let Some(name) = sig_name.strip_prefix("set_") {
let extract_prefix_name = |prefix, item_typ| {
if let Some(name) = sig_name.strip_prefix(prefix) {
if name.is_empty() {
return Err(syn::Error::new_spanned(
Err(syn::Error::new_spanned(
&inner.meta_ident,
format!(
"A #[{}(setter)] fn with a set_* name must \
have something after \"set_\"",
inner.meta_name()
"A #[{}({typ})] fn with a {prefix}* name must \
have something after \"{prefix}\"",
inner.meta_name(),
typ = item_typ,
prefix = prefix
),
));
))
} else {
Ok(name.to_owned())
}
name.to_string()
} else {
return Err(syn::Error::new_spanned(
Err(syn::Error::new_spanned(
&inner.meta_ident,
format!(
"A #[{}(setter)] fn must either have a `name` \
parameter or a fn name along the lines of \"set_*\"",
inner.meta_name()
),
));
))
}
} else if deleter {
if let Some(name) = sig_name.strip_prefix("del_") {
if name.is_empty() {
return Err(syn::Error::new_spanned(
&inner.meta_ident,
format!(
"A #[{}(deleter)] fn with a del_* name must \
have something after \"del_\"",
inner.meta_name()
),
));
}
name.to_string()
} else {
return Err(syn::Error::new_spanned(
&inner.meta_ident,
format!(
"A #[{}(deleter)] fn must either have a `name` \
parameter or a fn name along the lines of \"del_*\"",
inner.meta_name()
),
));
}
} else {
sig_name
};
let name = match kind {
GetSetItemKind::Get => sig_name,
GetSetItemKind::Set => extract_prefix_name("set_", "setter")?,
GetSetItemKind::Delete => extract_prefix_name("del_", "deleter")?,
};
if magic {
format!("__{}__", name)
+3 -2
View File
@@ -492,6 +492,7 @@ impl PyDictRef {
}
}
#[cold]
fn _subcls_getitem_option(
&self,
key: PyObjectRef,
@@ -504,7 +505,7 @@ impl PyDictRef {
}
}
pub fn get2<K: IntoPyObject + DictKey + Clone>(
pub fn get_chain<K: IntoPyObject + DictKey + Clone>(
&self,
other: &Self,
key: K,
@@ -513,7 +514,7 @@ impl PyDictRef {
let self_exact = self.class().is(&vm.ctx.types.dict_type);
let other_exact = self.class().is(&vm.ctx.types.dict_type);
if self_exact && other_exact {
self.entries.get2(&other.entries, vm, &key)
self.entries.get_chain(&other.entries, vm, &key)
} else if let Some(value) = self._get_item_option_inner(key.clone(), self_exact, vm)? {
Ok(Some(value))
} else {
+1 -1
View File
@@ -284,7 +284,7 @@ impl<T: Clone> Dict<T> {
Ok(ret)
}
pub fn get2<K: DictKey>(
pub fn get_chain<K: DictKey>(
&self,
other: &Self,
vm: &VirtualMachine,
+9 -10
View File
@@ -470,22 +470,14 @@ impl ExecutingFrame<'_> {
let x = self.locals.get_item_option(name.clone(), vm)?;
let x = match x {
Some(x) => x,
None => self
.globals
.get2(self.builtins, name.clone(), vm)?
.ok_or_else(|| {
vm.new_name_error(format!("name '{}' is not defined", name))
})?,
None => self.load_global_or_builtin(name, vm)?,
};
self.push_value(x);
Ok(None)
}
bytecode::Instruction::LoadGlobal(idx) => {
let name = &self.code.names[*idx];
let x = self
.globals
.get2(self.builtins, name.clone(), vm)?
.ok_or_else(|| vm.new_name_error(format!("name '{}' is not defined", name)))?;
let x = self.load_global_or_builtin(name, vm)?;
self.push_value(x);
Ok(None)
}
@@ -952,6 +944,13 @@ impl ExecutingFrame<'_> {
}
}
#[inline]
fn load_global_or_builtin(&self, name: &PyStrRef, vm: &VirtualMachine) -> PyResult {
self.globals
.get_chain(self.builtins, name.clone(), vm)?
.ok_or_else(|| vm.new_name_error(format!("name '{}' is not defined", name)))
}
#[cfg_attr(feature = "flame-it", flame("Frame"))]
fn get_elements(
&mut self,
+1 -1
View File
@@ -205,7 +205,7 @@ mod decl {
#[pymethod(name = "is_nonlocal")]
fn is_nonlocal(&self) -> bool {
matches!(self.symbol.scope, SymbolScope::Free)
self.symbol.is_nonlocal
}
#[pymethod(name = "is_referenced")]