diff --git a/C/exo.c b/C/exo.c index 4d3a68fa8..afb6dedd5 100644 --- a/C/exo.c +++ b/C/exo.c @@ -421,7 +421,7 @@ p_exodb_get_space( USES_REGS1 ) Yap_ClauseSpace += required; /* cool, it's our turn to do the conversion */ mcl->ClFlags = MegaMask|ExoMask; - mcl->ClSize = required-sizeof(MegaClause); + mcl->ClSize = required; mcl->ClPred = ap; mcl->ClItemSize = arity*sizeof(CELL); mcl->ClNext = NULL; diff --git a/C/qlyr.c b/C/qlyr.c index 5c473b718..00417535d 100755 --- a/C/qlyr.c +++ b/C/qlyr.c @@ -849,6 +849,7 @@ read_clauses(IOSTREAM *stream, PredEntry *pp, UInt nclauses, UInt flags) { } else if (pp->PredFlags & MegaClausePredFlag) { CACHE_REGS char *base = (void *)read_uint(stream); + UInt mask = read_uint(stream); UInt size = read_uint(stream); MegaClause *cl = (MegaClause *)Yap_AlwaysAllocCodeSpace(size); @@ -857,12 +858,20 @@ read_clauses(IOSTREAM *stream, PredEntry *pp, UInt nclauses, UInt flags) { } LOCAL_HDiff = (char *)cl-base; read_bytes(stream, cl, size); + cl->ClFlags = mask; pp->cs.p_code.FirstClause = pp->cs.p_code.LastClause = cl->ClCode; pp->PredFlags |= MegaClausePredFlag; /* enter index mode */ - pp->OpcodeOfPred = INDEX_OPCODE; + if (mask & ExoMask) { + struct index_t **icl = (struct index_t **)(cl->ClCode); + pp->OpcodeOfPred = Yap_opcode(_enter_exo); + icl[0] = NULL; + icl[1] = NULL; + } else { + pp->OpcodeOfPred = INDEX_OPCODE; + } pp->CodeOfPred = pp->cs.p_code.TrueCodeOfPred = (yamop *)(&(pp->OpcodeOfPred)); /* This must be set for restoremegaclause */ pp->cs.p_code.NOfClauses = nclauses; diff --git a/C/qlyw.c b/C/qlyw.c index 0bde3d2e6..cb5187921 100755 --- a/C/qlyw.c +++ b/C/qlyw.c @@ -649,6 +649,7 @@ save_clauses(IOSTREAM *stream, PredEntry *pp) { UInt size = cl->ClSize; CHECK(save_uint(stream, (UInt)cl)); + CHECK(save_uint(stream, (UInt)(cl->ClFlags))); CHECK(save_uint(stream, size)); CHECK(save_bytes(stream, cl, size)); } else if (pp->PredFlags & DynamicPredFlag) { diff --git a/H/rheap.h b/H/rheap.h index 5c04ef8f2..663b443bf 100644 --- a/H/rheap.h +++ b/H/rheap.h @@ -588,10 +588,21 @@ RestoreMegaClause(MegaClause *cl USES_REGS) } max = (yamop *)((CODEADDR)cl+cl->ClSize); - for (ptr = cl->ClCode; ptr < max; ) { - nextptr = (yamop *)((char *)ptr + cl->ClItemSize); - restore_opcodes(ptr, nextptr PASS_REGS); - ptr = nextptr; + if (cl->ClFlags & ExoMask) { + CELL *base = (CELL *)((ADDR)cl->ClCode+2*sizeof(struct index_t *)); + CELL *end = (CELL*)max, *ptr; + + for (ptr = base; ptr < end; ptr++) { + Term t = *ptr; + if (IsAtomTerm(t)) *ptr = AtomTermAdjust(t); + /* don't handle other complex terms just yet, ints are ok */ + } + } else { + for (ptr = cl->ClCode; ptr < max; ) { + nextptr = (yamop *)((char *)ptr + cl->ClItemSize); + restore_opcodes(ptr, nextptr PASS_REGS); + ptr = nextptr; + } } }