diff --git a/C/cdmgr.c b/C/cdmgr.c index 3c4d46a9e..de71b5120 100644 --- a/C/cdmgr.c +++ b/C/cdmgr.c @@ -836,7 +836,7 @@ Yap_BuildMegaClause(PredEntry *ap) memcpy((void *)ptr, (void *)cl->ClCode, sz); if (has_blobs) { ClDiff = (char *)(ptr)-(char *)cl->ClCode; - restore_opcodes(ptr); + restore_opcodes(ptr, NULL); } ptr = (yamop *)((char *)ptr + sz); if (cl->ClCode == ap->cs.p_code.LastClause) diff --git a/H/rclause.h b/H/rclause.h index 2a8b4c486..9e509f3ca 100644 --- a/H/rclause.h +++ b/H/rclause.h @@ -4,10 +4,12 @@ static void -restore_opcodes(yamop *pc) +restore_opcodes(yamop *pc, yamop *max) { do { - op_numbers op = Yap_op_from_opcode(pc->opc); + op_numbers op; + if (max && pc >= max) return; + op = Yap_op_from_opcode(pc->opc); pc->opc = Yap_opcode(op); #ifdef DEBUG_RESTORE2 fprintf(stderr, "%s ", Yap_op_names[op]); diff --git a/H/rheap.h b/H/rheap.h index bf2caad0f..04da9bad0 100644 --- a/H/rheap.h +++ b/H/rheap.h @@ -517,7 +517,7 @@ RestoreStaticClause(StaticClause *cl) if (cl->ClNext) { cl->ClNext = PtoStCAdjust(cl->ClNext); } - restore_opcodes(cl->ClCode); + restore_opcodes(cl->ClCode, NULL); } /* Restores a prolog clause, in its compiled form */ @@ -528,11 +528,20 @@ RestoreMegaClause(MegaClause *cl) * clause for this predicate or not */ { + UInt ncls, i; + yamop *ptr; + cl->ClPred = PtoPredAdjust(cl->ClPred); if (cl->ClNext) { - cl->ClNext = (MegaClause *)AddrAdjust((ADDR)(cl->ClNext)); + cl->ClNext = (MegaClause *)AddrAdjust((ADDR)(cl->ClNext)); + } + ncls = cl->ClPred->cs.p_code.NOfClauses; + + for (i = 0, ptr = cl->ClCode; i < ncls; i++) { + yamop *nextptr = (yamop *)((char *)ptr + cl->ClItemSize); + restore_opcodes(ptr, nextptr); + ptr = nextptr; } - restore_opcodes(cl->ClCode); } /* Restores a prolog clause, in its compiled form */ @@ -547,7 +556,7 @@ RestoreDynamicClause(DynamicClause *cl, PredEntry *pp) cl->ClPrevious = PtoOpAdjust(cl->ClPrevious); } INIT_LOCK(cl->ClLock); - restore_opcodes(cl->ClCode); + restore_opcodes(cl->ClCode, NULL); } /* Restores a prolog clause, in its compiled form */ @@ -573,7 +582,7 @@ RestoreLUClause(LogUpdClause *cl, PredEntry *pp) cl->ClNext = PtoLUCAdjust(cl->ClNext); } cl->ClPred = PtoPredAdjust(cl->ClPred); - restore_opcodes(cl->ClCode); + restore_opcodes(cl->ClCode, NULL); } static void @@ -615,7 +624,7 @@ CleanLUIndex(LogUpdIndex *idx, int recurse) CleanLUIndex(idx->ChildIndex, TRUE); } if (!(idx->ClFlags & SwitchTableMask)) { - restore_opcodes(idx->ClCode); + restore_opcodes(idx->ClCode, NULL); } } @@ -634,7 +643,7 @@ CleanSIndex(StaticIndex *idx, int recurse) CleanSIndex(idx->ChildIndex, TRUE); } if (!(idx->ClFlags & SwitchTableMask)) { - restore_opcodes(idx->ClCode); + restore_opcodes(idx->ClCode, NULL); } } diff --git a/misc/buildops b/misc/buildops index 0543739a0..2b4a5c18d 100644 --- a/misc/buildops +++ b/misc/buildops @@ -77,10 +77,12 @@ header(W) :- header_rclause(W) :- format(W,'~n /* This file was generated automatically by \"yap -L misc/buildops\"~n please do not update */~n~n static void -restore_opcodes(yamop *pc) +restore_opcodes(yamop *pc, yamop *max) { do { - op_numbers op = Yap_op_from_opcode(pc->opc); + op_numbers op; + if (max && pc >= max) return; + op = Yap_op_from_opcode(pc->opc); pc->opc = Yap_opcode(op); #ifdef DEBUG_RESTORE2 fprintf(stderr, "%s ", Yap_op_names[op]); diff --git a/packages/chr b/packages/chr index c325e4564..e071f01c1 160000 --- a/packages/chr +++ b/packages/chr @@ -1 +1 @@ -Subproject commit c325e4564bb8d4e32c27f2061df85f13d315974e +Subproject commit e071f01c1d9015e6d3fabc73092a6e902541485a diff --git a/packages/jpl b/packages/jpl index a2d2f0310..eb6d27251 160000 --- a/packages/jpl +++ b/packages/jpl @@ -1 +1 @@ -Subproject commit a2d2f03107eecd45462cd61a678035132cf06326 +Subproject commit eb6d27251c2548c25e6d37fff2a27a014caaa7aa