add dynamic module resolution calls
This commit is contained in:
@@ -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(());
|
||||
|
||||
Reference in New Issue
Block a user