static void put_new_attvar(Word p, atom_t name, Word value ARG_LD) { Word gp, at; assert(gTop+6 <= gMax && tTop+1 <= tMax); gp = gTop; if ( p >= (Word)lBase ) { gTop += 6; at = &gp[1]; setVar(*at); gp[0] = consPtr(&gp[1], TAG_ATTVAR|STG_GLOBAL); *p = makeRefG(&gp[0]); LTrail(p); } else { gTop += 5; at = &gp[0]; setVar(*at); *p = consPtr(&gp[0], TAG_ATTVAR|STG_GLOBAL); GTrail(p); } at[1] = FUNCTOR_att3; at[2] = name; at[3] = linkVal(value); at[4] = ATOM_nil; at[0] = consPtr(&at[1], TAG_COMPOUND|STG_GLOBAL); }
static void make_new_attvar(Word p ARG_LD) { Word gp; assert(gTop+3 <= gMax && tTop+1 <= tMax); gp = link_attvar(PASS_LD1); gp[1] = ATOM_nil; gp[0] = consPtr(&gp[1], TAG_ATTVAR|STG_GLOBAL); gTop += 2; trail_new_attvar(gp PASS_LD); Trail(p, makeRefG(gp)); }
static void make_new_attvar(Word p ARG_LD) { Word gp; assert(gTop+2 <= gMax && tTop+1 <= tMax); if ( p >= (Word)lBase ) { gp = gTop; gp[1] = ATOM_nil; gp[0] = consPtr(&gp[1], TAG_ATTVAR|STG_GLOBAL); *p = makeRefG(gp); gTop += 2; LTrail(p); } else { gp = gTop; gp[0] = ATOM_nil; *p = consPtr(&gp[0], TAG_ATTVAR|STG_GLOBAL); gTop += 1; GTrail(p); } }
static void put_new_attvar(Word p, atom_t name, Word value ARG_LD) { Word gp, at; assert(gTop+7 <= gMax && tTop+1 <= tMax); gp = link_attvar(PASS_LD1); gTop += 6; at = &gp[1]; setVar(*at); gp[0] = consPtr(&gp[1], TAG_ATTVAR|STG_GLOBAL); at[1] = FUNCTOR_att3; at[2] = name; at[3] = linkVal(value); at[4] = ATOM_nil; at[0] = consPtr(&at[1], TAG_COMPOUND|STG_GLOBAL); trail_new_attvar(gp PASS_LD); Trail(p, makeRefG(gp)); }
static int copy_term(Word from, Word to, int flags ARG_LD) { term_agendaLR agenda; int rc = TRUE; initTermAgendaLR(&agenda, 1, from, to); while( nextTermAgendaLR(&agenda, &from, &to) ) { again: switch(tag(*from)) { case TAG_REFERENCE: { Word p2 = unRef(*from); if ( *p2 == VAR_MARK ) /* reference to a copied variable */ { *to = makeRef(p2); } else { from = p2; /* normal reference */ goto again; } continue; } case TAG_VAR: { if ( shared(*from) ) { *to = VAR_MARK; *from = makeRef(to); TrailCyclic(from PASS_LD); } else { setVar(*to); } continue; } case TAG_ATTVAR: if ( flags©_ATTRS ) { Word p = valPAttVar(*from); if ( isAttVar(*p) ) /* already copied */ { *to = makeRefG(p); } else { Word attr; if ( !(attr = alloc_attvar(PASS_LD1)) ) { rc = GLOBAL_OVERFLOW; goto out; } TrailCyclic(p PASS_LD); TrailCyclic(from PASS_LD); *from = consPtr(attr, STG_GLOBAL|TAG_ATTVAR); *to = makeRefG(attr); from = p; to = &attr[1]; goto again; } } else { if ( shared(*from) ) { Word p = valPAttVar(*from & ~BOTH_MASK); if ( *p == VAR_MARK ) { *to = makeRef(p); } else { *to = VAR_MARK; *from = consPtr(to, STG_GLOBAL|TAG_ATTVAR)|BOTH_MASK; TrailCyclic(p PASS_LD); TrailCyclic(from PASS_LD); } } else { setVar(*to); } } continue; case TAG_COMPOUND: { Functor ff = valueTerm(*from); if ( isRef(ff->definition) ) { *to = consPtr(unRef(ff->definition), TAG_COMPOUND|STG_GLOBAL); continue; } if ( ground(ff->definition) ) { *to = *from; continue; } if ( shared(ff->definition) ) { int arity = arityFunctor(ff->definition); Functor ft; if ( !(ft = (Functor)allocGlobalNoShift(arity+1)) ) { rc = GLOBAL_OVERFLOW; goto out; } ft->definition = ff->definition & ~BOTH_MASK; ff->definition = makeRefG((Word)ft); TrailCyclic(&ff->definition PASS_LD); *to = consPtr(ft, TAG_COMPOUND|STG_GLOBAL); if ( pushWorkAgendaLR(&agenda, arity, ff->arguments, ft->arguments) ) continue; rc = MEMORY_OVERFLOW; goto out; } else /* unshared term */ { int arity = arityFunctor(ff->definition); Functor ft; if ( !(ft = (Functor)allocGlobalNoShift(arity+1)) ) { rc = GLOBAL_OVERFLOW; goto out; } ft->definition = ff->definition & ~BOTH_MASK; *to = consPtr(ft, TAG_COMPOUND|STG_GLOBAL); if ( pushWorkAgendaLR(&agenda, arity, ff->arguments, ft->arguments) ) continue; rc = MEMORY_OVERFLOW; goto out; } } default: *to = *from; continue; } } out: clearTermAgendaLR(&agenda); return rc; }