add dynamic module resolution calls

This commit is contained in:
Mark Thom
2019-01-06 00:15:32 -07:00
parent 387bdb4da6
commit c9f6ab984f
7 changed files with 86 additions and 74 deletions

View File

@@ -203,6 +203,32 @@ impl MachineState {
_ => self.fail = true
};
},
&SystemClauseType::DynamicModuleResolution => {
let module_name = self.store(self.deref(self[temp_v!(1)].clone()));
if let Addr::Con(Constant::Atom(module_name, _)) = module_name {
match self.store(self.deref(self[temp_v!(2)].clone())) {
Addr::Str(a) =>
if let HeapCellValue::NamedStr(arity, name, _) = self.heap[a].clone() {
for i in 1 .. arity + 1 {
self.registers[i] = self.heap[a+i].as_addr(a+i);
}
return self.module_lookup(indices, (name, arity), module_name, true);
},
Addr::Con(Constant::Atom(name, _)) =>
return self.module_lookup(indices, (name, 0), module_name, true),
addr => {
let stub = MachineError::functor_stub(clause_name!("(:)"), 2);
let type_error = MachineError::type_error(ValidType::Callable, addr);
let type_error = self.error_form(type_error, stub);
return Err(type_error);
}
}
};
},
&SystemClauseType::ExpandGoal => {
self.p = CodePtr::Local(LocalCodePtr::UserGoalExpansion(0));
return Ok(());