implement dynamic, multifile, and discontiguous properties and callable type checking for predicate_property/2
This commit is contained in:
@@ -549,6 +549,7 @@ impl<'a> Drop for LoadState<'a> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: necessary? unnecessary?
|
||||
// self.wam.code_repo.code.truncate(self.retraction_info.orig_code_extent);
|
||||
}
|
||||
@@ -1543,6 +1544,108 @@ impl Machine {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate)
|
||||
fn dynamic_property(&mut self) {
|
||||
let module_name = atom_from!(
|
||||
self.machine_st,
|
||||
self.machine_st.store(self.machine_st.deref(
|
||||
self.machine_st[temp_v!(1)]
|
||||
))
|
||||
);
|
||||
|
||||
let key =
|
||||
self.machine_st.read_predicate_key(
|
||||
self.machine_st[temp_v!(2)],
|
||||
self.machine_st[temp_v!(3)],
|
||||
);
|
||||
|
||||
let compilation_target =
|
||||
match module_name.as_str() {
|
||||
"user" => CompilationTarget::User,
|
||||
_ => CompilationTarget::Module(module_name),
|
||||
};
|
||||
|
||||
match self.indices.get_predicate_skeleton(
|
||||
&compilation_target,
|
||||
&key,
|
||||
) {
|
||||
Some(skeleton) => {
|
||||
self.machine_st.fail = !skeleton.is_dynamic;
|
||||
}
|
||||
None => {
|
||||
self.machine_st.fail = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate)
|
||||
fn multifile_property(&mut self) {
|
||||
let module_name = atom_from!(
|
||||
self.machine_st,
|
||||
self.machine_st.store(self.machine_st.deref(
|
||||
self.machine_st[temp_v!(1)]
|
||||
))
|
||||
);
|
||||
|
||||
let key =
|
||||
self.machine_st.read_predicate_key(
|
||||
self.machine_st[temp_v!(2)],
|
||||
self.machine_st[temp_v!(3)],
|
||||
);
|
||||
|
||||
let compilation_target =
|
||||
match module_name.as_str() {
|
||||
"user" => CompilationTarget::User,
|
||||
_ => CompilationTarget::Module(module_name),
|
||||
};
|
||||
|
||||
match self.indices.get_predicate_skeleton(
|
||||
&compilation_target,
|
||||
&key,
|
||||
) {
|
||||
Some(skeleton) => {
|
||||
self.machine_st.fail = !skeleton.is_multifile;
|
||||
}
|
||||
None => {
|
||||
self.machine_st.fail = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate)
|
||||
fn discontiguous_property(&mut self) {
|
||||
let module_name = atom_from!(
|
||||
self.machine_st,
|
||||
self.machine_st.store(self.machine_st.deref(
|
||||
self.machine_st[temp_v!(1)]
|
||||
))
|
||||
);
|
||||
|
||||
let key =
|
||||
self.machine_st.read_predicate_key(
|
||||
self.machine_st[temp_v!(2)],
|
||||
self.machine_st[temp_v!(3)],
|
||||
);
|
||||
|
||||
let compilation_target =
|
||||
match module_name.as_str() {
|
||||
"user" => CompilationTarget::User,
|
||||
_ => CompilationTarget::Module(module_name),
|
||||
};
|
||||
|
||||
match self.indices.get_predicate_skeleton(
|
||||
&compilation_target,
|
||||
&key,
|
||||
) {
|
||||
Some(skeleton) => {
|
||||
self.machine_st.fail = !skeleton.is_discontiguous;
|
||||
}
|
||||
None => {
|
||||
self.machine_st.fail = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate)
|
||||
fn builtin_property(&mut self) {
|
||||
let key =
|
||||
|
||||
Reference in New Issue
Block a user