scan registers of instructions leading to verify_attributes interrupt to find the number of registers to save (#2307)
This commit is contained in:
@@ -792,8 +792,8 @@ enum InstructionTemplate {
|
||||
#[strum_discriminants(strum(props(Arity = "0", Name = "install_verify_attr")))]
|
||||
InstallVerifyAttr,
|
||||
// call verify_attrs.
|
||||
#[strum_discriminants(strum(props(Arity = "0", Name = "verify_attr_interrupt")))]
|
||||
VerifyAttrInterrupt,
|
||||
#[strum_discriminants(strum(props(Arity = "1", Name = "verify_attr_interrupt")))]
|
||||
VerifyAttrInterrupt(usize),
|
||||
// procedures
|
||||
CallClause(ClauseType, usize, usize, bool, bool), // ClauseType,
|
||||
// arity,
|
||||
@@ -1153,6 +1153,33 @@ fn generate_instruction_preface() -> TokenStream {
|
||||
pub type CodeDeque = VecDeque<Instruction>;
|
||||
|
||||
impl Instruction {
|
||||
#[inline]
|
||||
pub fn registers(&self) -> Vec<RegType> {
|
||||
match self {
|
||||
&Instruction::GetConstant(_, _, r) => vec![r],
|
||||
&Instruction::GetList(_, r) => vec![r],
|
||||
&Instruction::GetPartialString(_, _, r, _) => vec![r],
|
||||
&Instruction::GetStructure(_, _, _, r) => vec![r],
|
||||
&Instruction::GetVariable(r, t) => vec![r, temp_v!(t)],
|
||||
&Instruction::GetValue(r, t) => vec![r, temp_v!(t)],
|
||||
&Instruction::UnifyLocalValue(r) => vec![r],
|
||||
&Instruction::UnifyVariable(r) => vec![r],
|
||||
&Instruction::PutConstant(_, _, r) => vec![r],
|
||||
&Instruction::PutList(_, r) => vec![r],
|
||||
&Instruction::PutPartialString(_, _, r, _) => vec![r],
|
||||
&Instruction::PutStructure(_, _, r) => vec![r],
|
||||
&Instruction::PutValue(r, t) => vec![r, temp_v!(t)],
|
||||
&Instruction::PutVariable(r, t) => vec![r, temp_v!(t)],
|
||||
&Instruction::SetLocalValue(r) => vec![r],
|
||||
&Instruction::SetVariable(r) => vec![r],
|
||||
&Instruction::SetValue(r) => vec![r],
|
||||
&Instruction::GetLevel(r) => vec![r],
|
||||
&Instruction::GetPrevLevel(r) => vec![r],
|
||||
&Instruction::GetCutPoint(r) => vec![r],
|
||||
_ => vec![],
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn to_indexing_line_mut(&mut self) -> Option<&mut Vec<IndexingLine>> {
|
||||
match self {
|
||||
@@ -1243,8 +1270,8 @@ fn generate_instruction_preface() -> TokenStream {
|
||||
&Instruction::InstallVerifyAttr => {
|
||||
functor!(atom!("install_verify_attr"))
|
||||
}
|
||||
&Instruction::VerifyAttrInterrupt => {
|
||||
functor!(atom!("verify_attr_interrupt"))
|
||||
&Instruction::VerifyAttrInterrupt(arity) => {
|
||||
functor!(atom!("verify_attr_interrupt"), [fixnum(arity)])
|
||||
}
|
||||
&Instruction::DynamicElse(birth, death, next_or_fail) => {
|
||||
match (death, next_or_fail) {
|
||||
|
||||
Reference in New Issue
Block a user