clear out expansions from code_repo if code entry fails
This commit is contained in:
@@ -149,7 +149,7 @@ pub fn compile_term(wam: &mut Machine, term: Term) -> EvalSession
|
|||||||
Err(e) => EvalSession::from(e)
|
Err(e) => EvalSession::from(e)
|
||||||
},
|
},
|
||||||
TopLevelPacket::Decl(TopLevel::Declaration(decl), _) => {
|
TopLevelPacket::Decl(TopLevel::Declaration(decl), _) => {
|
||||||
let mut compiler = ListingCompiler::new();
|
let mut compiler = ListingCompiler::new(&wam.code_repo);
|
||||||
|
|
||||||
let indices = try_eval_session!(compile_decl(wam, &mut compiler, decl));
|
let indices = try_eval_session!(compile_decl(wam, &mut compiler, decl));
|
||||||
try_eval_session!(compiler.add_code(wam, vec![], indices));
|
try_eval_session!(compiler.add_code(wam, vec![], indices));
|
||||||
@@ -170,15 +170,19 @@ struct GatherResult {
|
|||||||
pub struct ListingCompiler {
|
pub struct ListingCompiler {
|
||||||
non_counted_bt_preds: HashSet<PredicateKey>,
|
non_counted_bt_preds: HashSet<PredicateKey>,
|
||||||
module: Option<Module>,
|
module: Option<Module>,
|
||||||
user_term_dir: TermDir
|
user_term_dir: TermDir,
|
||||||
|
orig_term_expansion_lens: (usize, usize),
|
||||||
|
orig_goal_expansion_lens: (usize, usize)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ListingCompiler {
|
impl ListingCompiler {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new() -> Self {
|
pub fn new(code_repo: &CodeRepo) -> Self {
|
||||||
ListingCompiler {
|
ListingCompiler {
|
||||||
module: None, non_counted_bt_preds: HashSet::new(),
|
module: None, non_counted_bt_preds: HashSet::new(),
|
||||||
user_term_dir: TermDir::new()
|
user_term_dir: TermDir::new(),
|
||||||
|
orig_term_expansion_lens: code_repo.term_dir_entry_len((clause_name!("term_expansion"), 2)),
|
||||||
|
orig_goal_expansion_lens: code_repo.term_dir_entry_len((clause_name!("goal_expansion"), 2)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -416,13 +420,29 @@ impl ListingCompiler {
|
|||||||
addition_results
|
addition_results
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn drop_expansions(&self, wam: &mut Machine, err: SessionError) -> SessionError {
|
||||||
|
let (te_len, te_queue_len) = self.orig_term_expansion_lens;
|
||||||
|
let (ge_len, ge_queue_len) = self.orig_goal_expansion_lens;
|
||||||
|
|
||||||
|
let flags = wam.machine_flags();
|
||||||
|
|
||||||
|
wam.code_repo.truncate_terms((clause_name!("term_expansion"), 2), te_len, te_queue_len);
|
||||||
|
wam.code_repo.truncate_terms((clause_name!("goal_expansion"), 2), ge_len, ge_queue_len);
|
||||||
|
|
||||||
|
discard_result!(wam.code_repo.compile_hook(CompileTimeHook::UserGoalExpansion, flags));
|
||||||
|
discard_result!(wam.code_repo.compile_hook(CompileTimeHook::UserTermExpansion, flags));
|
||||||
|
|
||||||
|
err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub
|
pub
|
||||||
fn compile_listing<R: Read>(wam: &mut Machine, src: R, mut indices: IndexStore) -> EvalSession
|
fn compile_listing<R: Read>(wam: &mut Machine, src: R, mut indices: IndexStore) -> EvalSession
|
||||||
{
|
{
|
||||||
let mut compiler = ListingCompiler::new();
|
let mut compiler = ListingCompiler::new(&wam.code_repo);
|
||||||
let mut results = try_eval_session!(compiler.gather_items(wam, src, &mut indices));
|
let mut results = try_eval_session!(compiler.gather_items(wam, src, &mut indices)
|
||||||
|
.map_err(|e| compiler.drop_expansions(wam, e)));
|
||||||
|
|
||||||
let module_code = try_eval_session!(compiler.generate_code(results.worker_results, wam,
|
let module_code = try_eval_session!(compiler.generate_code(results.worker_results, wam,
|
||||||
&mut indices.code_dir));
|
&mut indices.code_dir));
|
||||||
|
|||||||
Reference in New Issue
Block a user