31static UInt total_megaclause, total_released, nof_megaclauses;
41#define TabEntryAdjust(P)
42#define DoubleInCodeAdjust(D)
43#define IntegerInCodeAdjust(D)
44#define IntegerAdjust(D) (D)
45#define PtoPredAdjust(X) (X)
46#define PtoOpAdjust(X) (X)
47#define PtoLUClauseAdjust(P) (P)
48#define PtoLUIndexAdjust(P) (P)
51#define AtomTermAdjust(X) (X)
52#define CellPtoHeapAdjust(X) (X)
53#define FuncAdjust(X) (X)
54#define CodeAddrAdjust(X) (X)
55#define CodeComposedTermAdjust(X) (X)
56#define ConstantAdjust(X) (X)
57#define ArityAdjust(X) (X)
58#define OpcodeAdjust(X) (X)
59#define ModuleAdjust(X) (X)
60#define ExternalFunctionAdjust(X) (X)
61#define AdjustSwitchTable(X, Y, Z)
62#define DBGroundTermAdjust(X) (X)
63#define rehash(A, B, C)
65static Term BlobTermInCodeAdjust(Term t) {
68 return t - LOCAL_ClDiff;
70 return t + LOCAL_ClDiff;
74static Term ConstantTermAdjust(Term t) {
76 return AtomTermAdjust(t);
92 if (ap->PredFlags & (DynamicPredFlag | LogUpdatePredFlag | MegaClausePredFlag
97 ap->FirstClause == NULL || ap->NOfClauses < 16) {
100 cl = ClauseCodeToStaticClause(ap->FirstClause);
103 if (!(cl->ClFlags & FactMask))
105 if (cl->ClSize != sz)
107 if (cl->ClCode == ap->LastClause)
109 has_blobs |= (cl->ClFlags & HasBlobsMask);
118 required = sz * ap->NOfClauses +
sizeof(
MegaClause) +
119 (UInt)NEXTOP((
yamop *)NULL, l);
120 while (!(mcl = (
MegaClause *)Yap_AllocCodeSpace(required))) {
121 if (!Yap_growheap(FALSE, required, NULL)) {
127 total_megaclause += required;
128 cl = ClauseCodeToStaticClause(ap->FirstClause);
129 total_released += ap->NOfClauses * cl->ClSize;
132 Yap_ClauseSpace += required;
134 mcl->ClFlags = MegaMask | has_blobs;
135 mcl->ClSize = required;
137 mcl->ClItemSize = sz;
139 cl = ClauseCodeToStaticClause(ap->FirstClause);
140 mcl->ClLine = cl->usc.ClLine;
143 memmove((
void *)ptr, (
void *)cl->ClCode, sz);
145 LOCAL_ClDiff = (
char *)(ptr) - (
char *)cl->ClCode;
146 restore_opcodes(ptr, NULL PASS_REGS);
148 ptr = (
yamop *)((
char *)ptr + sz);
149 if (cl->ClCode == ap->LastClause)
153 ptr->opc = Yap_opcode(_Ystop);
154 cl = ClauseCodeToStaticClause(ap->FirstClause);
160 Yap_InformOfRemoval(cl);
161 Yap_ClauseSpace -= cl->ClSize;
162 Yap_FreeCodeSpace((ADDR)cl);
163 if (curcl->ClCode == ap->LastClause)
167 ap->FirstClause = ap->LastClause = mcl->ClCode;
168 ap->PredFlags |= MegaClausePredFlag;
169 Yap_inform_profiler_of_clause(mcl, (
char *)mcl + required, ap, GPROF_MEGA);
172void Yap_split_megaclause(
PredEntry *ap) {
176 UInt ncls = ap->NOfClauses, i;
178 mcl = ClauseCodeToMegaClause(ap->FirstClause);
179 if (mcl->ClFlags & ExoMask) {
180 Yap_Error(PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE, Yap_PredicateToIndicator(ap),
181 "while deleting clause from exo predicate %s/%d\n",
182 RepAtom(NameOfFunctor(ap->FunctorOfPred))->StrOfAE,
186 for (i = 0, ptr = mcl->ClCode; i < ncls; i++) {
189 (UInt)NEXTOP((
yamop *)NULL, p));
191 if (!Yap_growheap(FALSE,
197 Yap_InformOfRemoval(cl);
198 Yap_ClauseSpace -= cl->ClSize;
199 Yap_FreeCodeSpace((
char *)cl);
202 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
203 "while breaking up mega clause for %s/%d\n",
204 RepAtom(NameOfFunctor(ap->FunctorOfPred))->StrOfAE,
207 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
208 "while breaking up mega clause for %s\n",
209 RepAtom((
Atom)ap->FunctorOfPred)->StrOfAE);
217 new->ClFlags = StaticMask | FactMask;
218 new->ClSize = mcl->ClItemSize;
219 new->usc.ClLine = Yap_source_line_no();
221 memmove((
void *)new->ClCode, (
void *)ptr, mcl->ClItemSize);
227 ptr = (
yamop *)((
char *)ptr + mcl->ClItemSize);
230 ap->PredFlags &= ~MegaClausePredFlag;
231 ap->FirstClause = start->ClCode;
232 ap->LastClause = prev->ClCode;
236static UInt compute_dbcl_size(arity_t arity) {
240 sz = (UInt)NEXTOP((
yamop *)NULL, cc);
243 sz = (UInt)NEXTOP((
yamop *)NULL, ccc);
246 sz = (UInt)NEXTOP((
yamop *)NULL, cccc);
249 sz = (UInt)NEXTOP((
yamop *)NULL, ccccc);
252 sz = (UInt)NEXTOP((
yamop *)NULL, cccccc);
255 sz = arity * (UInt)NEXTOP((
yamop *)NULL, xc);
258 return (UInt)NEXTOP((
yamop *)sz, p);
261#define DerefAndCheck(t, V) \
263 if (IsVarTerm(t) || !(IsAtomOrIntTerm(t))) \
264 Yap_Error(TYPE_ERROR_ATOM, t0, "load_db");
266static int store_dbcl_size(
yamop *pc, arity_t arity, Term t0,
PredEntry *pe) {
268 CELL *tp = RepAppl(t0) + 1;
271 pc->opc = Yap_opcode(_get_2atoms);
272 DerefAndCheck(t, tp[0]);
274 DerefAndCheck(t, tp[1]);
279 pc->opc = Yap_opcode(_get_3atoms);
280 DerefAndCheck(t, tp[0]);
282 DerefAndCheck(t, tp[1]);
284 DerefAndCheck(t, tp[2]);
286 pc = NEXTOP(pc, ccc);
289 pc->opc = Yap_opcode(_get_4atoms);
290 DerefAndCheck(t, tp[0]);
292 DerefAndCheck(t, tp[1]);
294 DerefAndCheck(t, tp[2]);
296 DerefAndCheck(t, tp[3]);
298 pc = NEXTOP(pc, cccc);
301 pc->opc = Yap_opcode(_get_5atoms);
302 DerefAndCheck(t, tp[0]);
303 pc->y_u.ccccc.c1 = t;
304 DerefAndCheck(t, tp[1]);
305 pc->y_u.ccccc.c2 = t;
306 DerefAndCheck(t, tp[2]);
307 pc->y_u.ccccc.c3 = t;
308 DerefAndCheck(t, tp[3]);
309 pc->y_u.ccccc.c4 = t;
310 DerefAndCheck(t, tp[4]);
311 pc->y_u.ccccc.c5 = t;
312 pc = NEXTOP(pc, ccccc);
315 pc->opc = Yap_opcode(_get_6atoms);
316 DerefAndCheck(t, tp[0]);
317 pc->y_u.cccccc.c1 = t;
318 DerefAndCheck(t, tp[1]);
319 pc->y_u.cccccc.c2 = t;
320 DerefAndCheck(t, tp[2]);
321 pc->y_u.cccccc.c3 = t;
322 DerefAndCheck(t, tp[3]);
323 pc->y_u.cccccc.c4 = t;
324 DerefAndCheck(t, tp[4]);
325 pc->y_u.cccccc.c5 = t;
326 DerefAndCheck(t, tp[5]);
327 pc->y_u.cccccc.c6 = t;
328 pc = NEXTOP(pc, cccccc);
332 for (i = 0; i < arity; i++) {
333 pc->opc = Yap_opcode(_get_atom);
334#if PRECOMPUTE_REGADDRESS
335 pc->y_u.xc.x = (CELL)(XREGS + (i + 1));
337 pc->y_u.xc.x = i + 1;
339 DerefAndCheck(t, tp[0]);
346 pc->opc = Yap_opcode(_procceed);
352 p_dbload_get_space(USES_REGS1) {
353 Term t = Deref(ARG1);
354 Term mod = Deref(ARG2);
355 Term tn = Deref(ARG3);
365 if (IsVarTerm(mod) || !IsAtomTerm(mod)) {
369 Atom a = AtomOfTerm(t);
371 pe = PredPropByAtom(a, mod);
372 }
else if (IsApplTerm(t)) {
373 register Functor f = FunctorOfTerm(t);
374 arity = ArityOfFunctor(f);
375 pe = PredPropByFunc(f, mod);
381 ap = RepPredProp(pe);
382 if (ap->PredFlags & (DynamicPredFlag | LogUpdatePredFlag
387 Yap_Error(PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE, Yap_PredicateToIndicator(ap),
388 "dbload_get_space/4");
391 if (IsVarTerm(tn) || !IsIntegerTerm(tn)) {
394 ncls = IntegerOfTerm(tn);
399 sz = compute_dbcl_size(arity);
400 required = sz * ncls +
sizeof(
MegaClause) + (UInt)NEXTOP((
yamop *)NULL, l);
402 total_megaclause += required;
405 while (!(mcl = (
MegaClause *)Yap_AllocCodeSpace(required))) {
406 if (!Yap_growheap(FALSE, required, NULL)) {
411 Yap_ClauseSpace += required;
413 mcl->ClFlags = MegaMask;
414 mcl->ClSize = sz * ncls;
416 mcl->ClItemSize = sz;
418 ap->FirstClause = ap->LastClause = mcl->ClCode;
419 ap->PredFlags |= (MegaClausePredFlag);
420 ap->NOfClauses = ncls;
421 if (ap->PredFlags & (SpiedPredFlag | CountPredFlag | ProfiledPredFlag)) {
422 ap->OpcodeOfPred = Yap_opcode(_spy_pred);
424 ap->OpcodeOfPred = INDEX_OPCODE;
426 ap->CodeOfPred = ap->TrueCodeOfPred =
427 (
yamop *)(&(ap->OpcodeOfPred));
428 ptr = (
yamop *)((ADDR)mcl->ClCode + ncls * sz);
429 ptr->opc = Yap_opcode(_Ystop);
430 return Yap_unify(ARG4, MkIntegerTerm((Int)mcl));
433static Int p_dbassert(USES_REGS1) {
434 Term thandle = Deref(ARG2);
435 Term tn = Deref(ARG3);
440 if (IsVarTerm(thandle) || !IsIntegerTerm(thandle)) {
444 if (IsVarTerm(tn) || !IsIntegerTerm(tn)) {
447 n = IntegerOfTerm(tn);
449 return store_dbcl_size((
yamop *)((ADDR)mcl->ClCode + n * (mcl->ClItemSize)),
450 pe->ArityOfPE, Deref(ARG1), pe);
453void Yap_InitDBLoadPreds(
void) {
456 Yap_InitCPred(
"$dbload_get_space", 4, p_dbload_get_space, 0L);
457 Yap_InitCPred(
"$dbassert", 3, p_dbassert, 0L);