Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix an assert while deleting table elements #1274

Merged
merged 1 commit into from
Feb 19, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions crates/cli-support/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ edition = '2018'
[dependencies]
base64 = "0.9"
failure = "0.1.2"
log = "0.4"
rustc-demangle = "0.1.13"
tempfile = "3.0"
walrus = "0.2.1"
Expand Down
11 changes: 3 additions & 8 deletions crates/cli-support/src/js/closures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,14 @@ use crate::descriptor::Descriptor;
use crate::js::js2rust::Js2Rust;
use crate::js::Context;
use failure::Error;
use std::collections::BTreeMap;
use std::collections::{BTreeMap, HashSet};
use std::mem;
use walrus::ir::{Expr, ExprId};
use walrus::{FunctionId, LocalFunction};

pub fn rewrite(input: &mut Context) -> Result<(), Error> {
let info = ClosureDescriptors::new(input);

// Sanity check to make sure things look ok and skip everything below if
// there's not calls to `Closure::new`.
assert_eq!(
info.element_removal_list.len(),
info.func_to_descriptor.len(),
);
if info.element_removal_list.len() == 0 {
return Ok(());
}
Expand All @@ -41,7 +35,7 @@ struct ClosureDescriptors {
/// A list of elements to remove from the function table. The first element
/// of the pair is the index of the entry in the element section, and the
/// second element of the pair is the index within that entry to remove.
element_removal_list: Vec<usize>,
element_removal_list: HashSet<usize>,

/// A map from local functions which contain calls to
/// `__wbindgen_describe_closure` to the information about the closure
Expand Down Expand Up @@ -150,6 +144,7 @@ impl ClosureDescriptors {
walrus::TableKind::Function(f) => f,
};
for idx in self.element_removal_list.iter().cloned() {
log::trace!("delete element {}", idx);
assert!(table.elements[idx].is_some());
table.elements[idx] = None;
}
Expand Down
6 changes: 3 additions & 3 deletions crates/wasm-interpreter/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

#![deny(missing_docs)]

use std::collections::{BTreeMap, HashMap};
use std::collections::{BTreeMap, HashMap, HashSet};
use walrus::ir::ExprId;
use walrus::{FunctionId, LocalFunction, LocalId, Module, TableId};

Expand Down Expand Up @@ -168,7 +168,7 @@ impl Interpreter {
&mut self,
id: FunctionId,
module: &Module,
entry_removal_list: &mut Vec<usize>,
entry_removal_list: &mut HashSet<usize>,
) -> Option<&[u32]> {
// Call the `id` function. This is an internal `#[inline(never)]`
// whose code is completely controlled by the `wasm-bindgen` crate, so
Expand Down Expand Up @@ -213,7 +213,7 @@ impl Interpreter {

// This is used later to actually remove the entry from the table, but
// we don't do the removal just yet
entry_removal_list.push(descriptor_table_idx);
entry_removal_list.insert(descriptor_table_idx);

// And now execute the descriptor!
self.interpret_descriptor_id(descriptor_id, module)
Expand Down