implement logical update semantics for dynamic database predicates
This commit is contained in:
@@ -37,6 +37,9 @@ impl CodeRepo {
|
||||
&IndexingLine::IndexedChoice(ref indexed_choice_instrs) => {
|
||||
RefOrOwned::Owned(Line::IndexedChoice(indexed_choice_instrs[i]))
|
||||
}
|
||||
&IndexingLine::DynamicIndexedChoice(ref indexed_choice_instrs) => {
|
||||
RefOrOwned::Owned(Line::DynamicIndexedChoice(indexed_choice_instrs[i]))
|
||||
}
|
||||
_ => {
|
||||
unreachable!()
|
||||
}
|
||||
@@ -86,11 +89,98 @@ impl CodeRepo {
|
||||
&CodePtr::VerifyAttrInterrupt(p) => {
|
||||
Some(RefOrOwned::Borrowed(&self.code[p]))
|
||||
}
|
||||
/*
|
||||
&CodePtr::DynamicTransaction(..) => {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub(super)
|
||||
fn find_living_dynamic_else(&self, mut p: usize, cc: usize) -> Option<(usize, usize)> {
|
||||
loop {
|
||||
match &self.code[p] {
|
||||
&Line::Choice(ChoiceInstruction::DynamicElse(birth, death, NextOrFail::Next(i))) => {
|
||||
if birth < cc && Death::Finite(cc) <= death {
|
||||
return Some((p, i));
|
||||
} else if i > 0 {
|
||||
p += i;
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
&Line::Choice(ChoiceInstruction::DynamicElse(birth, death, NextOrFail::Fail(_))) => {
|
||||
if birth < cc && Death::Finite(cc) <= death {
|
||||
return Some((p, 0));
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
&Line::Choice(ChoiceInstruction::DynamicInternalElse(
|
||||
birth,
|
||||
death,
|
||||
NextOrFail::Next(i),
|
||||
)) => {
|
||||
if birth < cc && Death::Finite(cc) <= death {
|
||||
return Some((p, i));
|
||||
} else if i > 0 {
|
||||
p += i;
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
&Line::Choice(ChoiceInstruction::DynamicInternalElse(
|
||||
birth,
|
||||
death,
|
||||
NextOrFail::Fail(_)),
|
||||
) => {
|
||||
if birth < cc && Death::Finite(cc) <= death {
|
||||
return Some((p, 0));
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
&Line::Control(ControlInstruction::RevJmpBy(i)) => {
|
||||
p -= i;
|
||||
}
|
||||
_ => {
|
||||
unreachable!();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(super)
|
||||
fn find_living_dynamic(&self, p: LocalCodePtr, cc: usize) -> Option<(usize, usize, usize, bool)> {
|
||||
let (p, oi, mut ii) = match p {
|
||||
LocalCodePtr::IndexingBuf(p, oi, ii) => (p, oi, ii),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let indexed_choice_instrs = match &self.code[p] {
|
||||
Line::IndexingCode(ref indexing_code) => match &indexing_code[oi] {
|
||||
IndexingLine::DynamicIndexedChoice(ref indexed_choice_instrs) => {
|
||||
indexed_choice_instrs
|
||||
}
|
||||
_ => unreachable!()
|
||||
}
|
||||
_ => unreachable!()
|
||||
};
|
||||
|
||||
loop {
|
||||
match &indexed_choice_instrs.get(ii) {
|
||||
Some(&offset) => {
|
||||
match &self.code[p + offset - 1] {
|
||||
&Line::Choice(ChoiceInstruction::DynamicInternalElse(
|
||||
birth, death, next_or_fail,
|
||||
)) => {
|
||||
if birth < cc && Death::Finite(cc) <= death {
|
||||
return Some((offset, oi, ii, next_or_fail.is_next()));
|
||||
} else {
|
||||
ii += 1;
|
||||
}
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
None => return None,
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user