recover from OOM stack errord
This commit is contained in:
parent
7ee2813f90
commit
3d6d3f092a
37
C/atomic.c
37
C/atomic.c
@ -974,21 +974,25 @@ static Int cont_string_concat3(USES_REGS1) {
|
|||||||
Term t3;
|
Term t3;
|
||||||
Term ts[2];
|
Term ts[2];
|
||||||
size_t i, max;
|
size_t i, max;
|
||||||
int l = push_text_stack();
|
int l;
|
||||||
restart_aux:
|
restart_aux:
|
||||||
|
l = push_text_stack();
|
||||||
t3 = Deref(ARG3);
|
t3 = Deref(ARG3);
|
||||||
i = IntOfTerm(EXTRA_CBACK_ARG(3, 1));
|
i = IntOfTerm(EXTRA_CBACK_ARG(3, 1));
|
||||||
max = IntOfTerm(EXTRA_CBACK_ARG(3, 2));
|
max = IntOfTerm(EXTRA_CBACK_ARG(3, 2));
|
||||||
EXTRA_CBACK_ARG(3, 1) = MkIntTerm(i + 1);
|
EXTRA_CBACK_ARG(3, 1) = MkIntTerm(i + 1);
|
||||||
if (!Yap_SpliceString(t3, ts, i, max PASS_REGS)) {
|
if (!Yap_SpliceString(t3, ts, i, max PASS_REGS)) {
|
||||||
|
pop_text_stack(l);
|
||||||
release_cut_fail();
|
release_cut_fail();
|
||||||
} else {
|
} else {
|
||||||
if (i < max)
|
pop_text_stack(l);
|
||||||
|
if (i < max)
|
||||||
return Yap_unify(ARG1, ts[0]) && Yap_unify(ARG2, ts[1]);
|
return Yap_unify(ARG1, ts[0]) && Yap_unify(ARG2, ts[1]);
|
||||||
if (Yap_unify(ARG1, ts[0]) && Yap_unify(ARG2, ts[1]))
|
if (Yap_unify(ARG1, ts[0]) && Yap_unify(ARG2, ts[1]))
|
||||||
release_cut_succeed();
|
release_cut_succeed();
|
||||||
release_cut_fail();
|
release_cut_fail();
|
||||||
}
|
}
|
||||||
|
pop_text_stack(l);
|
||||||
/* Error handling */
|
/* Error handling */
|
||||||
if (LOCAL_Error_TYPE) {
|
if (LOCAL_Error_TYPE) {
|
||||||
if (Yap_HandleError("string_concat/3")) {
|
if (Yap_HandleError("string_concat/3")) {
|
||||||
@ -1005,30 +1009,34 @@ static Int string_concat3(USES_REGS1) {
|
|||||||
Term t2, t3, ot;
|
Term t2, t3, ot;
|
||||||
Term tf = 0;
|
Term tf = 0;
|
||||||
bool g1, g2, g3;
|
bool g1, g2, g3;
|
||||||
int l = push_text_stack();
|
int l;
|
||||||
restart_aux:
|
restart_aux:
|
||||||
|
l = push_text_stack();
|
||||||
t1 = Deref(ARG1);
|
t1 = Deref(ARG1);
|
||||||
t2 = Deref(ARG2);
|
t2 = Deref(ARG2);
|
||||||
t3 = Deref(ARG3);
|
t3 = Deref(ARG3);
|
||||||
g1 = Yap_IsGroundTerm(t1);
|
g1 = Yap_IsGroundTerm(t1);
|
||||||
g2 = Yap_IsGroundTerm(t2);
|
g2 = Yap_IsGroundTerm(t2);
|
||||||
g3 = Yap_IsGroundTerm(t3);
|
g3 = Yap_IsGroundTerm(t3);
|
||||||
|
|
||||||
if (g1 && g2) {
|
if (g1 && g2) {
|
||||||
tf = Yap_ConcatStrings(t1, t2 PASS_REGS);
|
tf = Yap_ConcatStrings(t1, t2 PASS_REGS);
|
||||||
ot = ARG3;
|
ot = ARG3;
|
||||||
} else if (g1 && g3) {
|
} else if (g1 && g3) {
|
||||||
tf = Yap_SubtractHeadString(t3, t1 PASS_REGS);
|
tf = Yap_SubtractHeadString(t3, t1 PASS_REGS);
|
||||||
ot = ARG2;
|
ot = ARG2;
|
||||||
} else if (g2 && g3) {
|
} else if (g2 && g3) {
|
||||||
tf = Yap_SubtractTailString(t3, t2 PASS_REGS);
|
tf = Yap_SubtractTailString(t3, t2 PASS_REGS);
|
||||||
ot = ARG1;
|
ot = ARG1;
|
||||||
} else if (g3) {
|
} else if (g3) {
|
||||||
EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0);
|
EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0);
|
||||||
EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_StringToLength(t3 PASS_REGS));
|
EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_StringToLength(t3 PASS_REGS));
|
||||||
|
pop_text_stack(l);
|
||||||
return cont_string_concat3(PASS_REGS1);
|
return cont_string_concat3(PASS_REGS1);
|
||||||
} else {
|
} else {
|
||||||
LOCAL_Error_TYPE = INSTANTIATION_ERROR;
|
LOCAL_Error_TYPE = INSTANTIATION_ERROR;
|
||||||
}
|
}
|
||||||
|
pop_text_stack(l);
|
||||||
if (tf) {
|
if (tf) {
|
||||||
if (Yap_unify(ot, tf)) {
|
if (Yap_unify(ot, tf)) {
|
||||||
release_cut_succeed();
|
release_cut_succeed();
|
||||||
@ -1053,8 +1061,9 @@ static Int cont_string_code3(USES_REGS1) {
|
|||||||
utf8proc_int32_t chr;
|
utf8proc_int32_t chr;
|
||||||
const unsigned char *s;
|
const unsigned char *s;
|
||||||
const unsigned char *s0;
|
const unsigned char *s0;
|
||||||
int l = push_text_stack();
|
int l;
|
||||||
restart_aux:
|
restart_aux:
|
||||||
|
l = push_text_stack();
|
||||||
t2 = Deref(ARG2);
|
t2 = Deref(ARG2);
|
||||||
s0 = UStringOfTerm(t2);
|
s0 = UStringOfTerm(t2);
|
||||||
i = IntOfTerm(
|
i = IntOfTerm(
|
||||||
@ -1860,8 +1869,12 @@ static Int atom_split(USES_REGS1) {
|
|||||||
ReleaseAndReturn((FALSE));
|
ReleaseAndReturn((FALSE));
|
||||||
s1 = s10 = Malloc(len);
|
s1 = s10 = Malloc(len);
|
||||||
s0 = RepAtom(at)->UStrOfAE;
|
s0 = RepAtom(at)->UStrOfAE;
|
||||||
if (s1 + len > (unsigned char *)ASP - 1024)
|
if (s1 + len > (unsigned char *)ASP - 1024) {
|
||||||
Yap_Error(RESOURCE_ERROR_STACK, t1, "$atom_split/4");
|
if (!Yap_gc(2, ENV, gc_P(P, CP))) {
|
||||||
|
Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
size_t j;
|
size_t j;
|
||||||
for (j = 0; j < len; j++) {
|
for (j = 0; j < len; j++) {
|
||||||
int32_t val;
|
int32_t val;
|
||||||
@ -2429,9 +2442,9 @@ static Int cont_current_atom(USES_REGS1) {
|
|||||||
READ_UNLOCK(ap->ARWLock);
|
READ_UNLOCK(ap->ARWLock);
|
||||||
}
|
}
|
||||||
EXTRA_CBACK_ARG(1, 2) = MkIntTerm(i);
|
EXTRA_CBACK_ARG(1, 2) = MkIntTerm(i);
|
||||||
return (TRUE);
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return (FALSE);
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user