fix save_program to reload foreign files SWI style when restarting.
This commit is contained in:
@@ -111,10 +111,10 @@ p_load_foreign(void)
|
||||
|
||||
static Int
|
||||
p_open_shared_object(void) {
|
||||
StringList ofiles = NULL;
|
||||
Term t = Deref(ARG1);
|
||||
Term tflags = Deref(ARG2);
|
||||
void *ptr;
|
||||
char *s;
|
||||
void *handle;
|
||||
|
||||
if (IsVarTerm(t)) {
|
||||
Yap_Error(INSTANTIATION_ERROR,t,"open_shared_object/3");
|
||||
@@ -129,35 +129,22 @@ p_open_shared_object(void) {
|
||||
Yap_Error(INSTANTIATION_ERROR,tflags,"open_shared_object/3");
|
||||
return FALSE;
|
||||
}
|
||||
if (!IsIntTerm(tflags)) {
|
||||
if (!IsIntegerTerm(tflags)) {
|
||||
Yap_Error(TYPE_ERROR_INTEGER,tflags,"open_shared_object/3");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ofiles = (StringList) Yap_AllocCodeSpace(sizeof(StringListItem));
|
||||
ofiles->next = NULL;
|
||||
ofiles->s = RepAtom(AtomOfTerm(t))->StrOfAE;
|
||||
if ((ptr = Yap_LoadForeignFile(ofiles->s, IntOfTerm(tflags)))==NULL) {
|
||||
return FALSE;
|
||||
s = RepAtom(AtomOfTerm(t))->StrOfAE;
|
||||
if ((handle = Yap_LoadForeignFile(s, IntegerOfTerm(tflags)))==NULL) {
|
||||
return FALSE;
|
||||
} else {
|
||||
ForeignObj *f_code = (ForeignObj *)Yap_AllocCodeSpace(sizeof(ForeignObj));
|
||||
ofiles->handle = ptr;
|
||||
|
||||
f_code->objs = ofiles;
|
||||
f_code->libs = NULL;
|
||||
f_code->f = NULL;
|
||||
f_code->next = ForeignCodeLoaded;
|
||||
f_code->module = CurrentModule;
|
||||
ForeignCodeLoaded = f_code;
|
||||
|
||||
return Yap_unify(MkIntegerTerm((Int)f_code),ARG3);
|
||||
return Yap_unify(MkIntegerTerm((Int)handle),ARG3);
|
||||
}
|
||||
}
|
||||
|
||||
static Int
|
||||
p_close_shared_object(void) {
|
||||
Term t = Deref(ARG1);
|
||||
ForeignObj *f, *f0 = NULL, *fi = ForeignCodeLoaded;
|
||||
void *handle;
|
||||
|
||||
if (IsVarTerm(t)) {
|
||||
@@ -168,30 +155,15 @@ p_close_shared_object(void) {
|
||||
Yap_Error(TYPE_ERROR_INTEGER,t,"open_shared_object/3");
|
||||
return FALSE;
|
||||
}
|
||||
f = (ForeignObj *)IntegerOfTerm(t);
|
||||
handle = (char *)IntegerOfTerm(t);
|
||||
|
||||
while (fi != f && fi) {
|
||||
f0 = fi;
|
||||
fi = f->next;
|
||||
}
|
||||
if (!fi)
|
||||
return FALSE;
|
||||
if (f0) {
|
||||
f0->next = f->next;
|
||||
} else {
|
||||
ForeignCodeLoaded = f->next;
|
||||
}
|
||||
handle = f->objs->handle;
|
||||
Yap_FreeCodeSpace((ADDR)f->objs);
|
||||
Yap_FreeCodeSpace((ADDR)f);
|
||||
return Yap_CloseForeignFile(f->f);
|
||||
return Yap_CloseForeignFile(handle);
|
||||
}
|
||||
|
||||
static Int
|
||||
p_call_shared_object_function(void) {
|
||||
Term t = Deref(ARG1);
|
||||
Term tfunc = Deref(ARG2);
|
||||
ForeignObj *f, *f0 = NULL, *fi = ForeignCodeLoaded;
|
||||
void *handle;
|
||||
|
||||
if (IsVarTerm(t)) {
|
||||
@@ -202,7 +174,7 @@ p_call_shared_object_function(void) {
|
||||
Yap_Error(TYPE_ERROR_INTEGER,t,"open_shared_object/3");
|
||||
return FALSE;
|
||||
}
|
||||
f = (ForeignObj *)IntegerOfTerm(t);
|
||||
handle = (void *)IntegerOfTerm(t);
|
||||
if (IsVarTerm(tfunc)) {
|
||||
Yap_Error(INSTANTIATION_ERROR,t,"open_shared_object/3");
|
||||
return FALSE;
|
||||
@@ -212,13 +184,6 @@ p_call_shared_object_function(void) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
while (fi != f && fi) {
|
||||
f0 = fi;
|
||||
fi = f->next;
|
||||
}
|
||||
if (!fi)
|
||||
return FALSE;
|
||||
handle = f->objs->handle;
|
||||
return Yap_CallForeignFile(handle, RepAtom(AtomOfTerm(tfunc))->StrOfAE);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user