fix uninit arrays
This commit is contained in:
parent
74e902c257
commit
afd24bb8db
34
C/arrays.c
34
C/arrays.c
@ -693,6 +693,7 @@ static StaticArrayEntry *CreateStaticArray(AtomEntry *ae, size_t dim,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
p->KindOfPE = ArrayProperty;
|
p->KindOfPE = ArrayProperty;
|
||||||
|
p->ValueOfVE.ints = NULL;
|
||||||
INIT_RWLOCK(p->ArRWLock);
|
INIT_RWLOCK(p->ArRWLock);
|
||||||
AddPropToAtom(ae, (PropEntry *)p);
|
AddPropToAtom(ae, (PropEntry *)p);
|
||||||
p->NextAE = LOCAL_StaticArrays;
|
p->NextAE = LOCAL_StaticArrays;
|
||||||
@ -1081,13 +1082,13 @@ static Int
|
|||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StaticArrayEntry *pp;
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
Yap_Error(INSTANTIATION_ERROR, t, "create static array");
|
Yap_Error(INSTANTIATION_ERROR, t, "create static array");
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
} else if (IsAtomTerm(t)) {
|
} else if (IsAtomTerm(t)) {
|
||||||
/* Create a named array */
|
/* Create a named array */
|
||||||
AtomEntry *ae = RepAtom(AtomOfTerm(t));
|
AtomEntry *ae = RepAtom(AtomOfTerm(t));
|
||||||
StaticArrayEntry *pp;
|
|
||||||
ArrayEntry *app;
|
ArrayEntry *app;
|
||||||
|
|
||||||
WRITE_LOCK(ae->ARWLock);
|
WRITE_LOCK(ae->ARWLock);
|
||||||
@ -1099,36 +1100,29 @@ static Int
|
|||||||
if (EndOfPAEntr(pp) || pp->ValueOfVE.ints == NULL) {
|
if (EndOfPAEntr(pp) || pp->ValueOfVE.ints == NULL) {
|
||||||
pp = CreateStaticArray(ae, size, props, NULL, pp PASS_REGS);
|
pp = CreateStaticArray(ae, size, props, NULL, pp PASS_REGS);
|
||||||
if (pp == NULL || pp->ValueOfVE.ints == NULL) {
|
if (pp == NULL || pp->ValueOfVE.ints == NULL) {
|
||||||
WRITE_UNLOCK(ae->ARWLock);
|
return TRUE;
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
WRITE_UNLOCK(ae->ARWLock);
|
|
||||||
return TRUE;
|
|
||||||
} else if (ArrayIsDynamic(app)) {
|
} else if (ArrayIsDynamic(app)) {
|
||||||
if (IsVarTerm(app->ValueOfVE) && IsUnboundVar(&app->ValueOfVE)) {
|
if (IsVarTerm(app->ValueOfVE) && IsUnboundVar(&app->ValueOfVE)) {
|
||||||
pp = CreateStaticArray(ae, size, props, NULL, pp PASS_REGS);
|
pp = CreateStaticArray(ae, size, props, NULL, pp PASS_REGS);
|
||||||
WRITE_UNLOCK(ae->ARWLock);
|
|
||||||
if (pp == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else {
|
} else {
|
||||||
WRITE_UNLOCK(ae->ARWLock);
|
|
||||||
Yap_Error(PERMISSION_ERROR_CREATE_ARRAY, t,
|
Yap_Error(PERMISSION_ERROR_CREATE_ARRAY, t,
|
||||||
"cannot create static array over dynamic array");
|
"cannot create static array over dynamic array");
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pp->ArrayEArity == size && pp->ArrayType == props) {
|
if (pp->ArrayType != props) {
|
||||||
WRITE_UNLOCK(ae->ARWLock);
|
Yap_Error(TYPE_ERROR_ATOM, t, "create static array %d/%d %d/%d", pp->ArrayEArity,size,pp->ArrayType,props);
|
||||||
return true;
|
pp = NULL;
|
||||||
|
} else {
|
||||||
|
AllocateStaticArraySpace(pp, props, pp->ValueOfVE.ints, size PASS_REGS);
|
||||||
}
|
}
|
||||||
Yap_FreeCodeSpace(pp->ValueOfVE.floats);
|
|
||||||
WRITE_UNLOCK(ae->ARWLock);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
WRITE_UNLOCK(ae->ARWLock);
|
||||||
|
if (!pp) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
Yap_Error(TYPE_ERROR_ATOM, t, "create static array");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user