void untag(U *p) { int i; if (iscons(p)) { do { if (p->tag == 0) return; p->tag = 0; untag(p->u.cons.car); p = p->u.cons.cdr; } while (iscons(p)); untag(p); return; } if (p->tag) { p->tag = 0; if (istensor(p)) { for (i = 0; i < p->u.tensor->nelem; i++) untag(p->u.tensor->elem[i]); } } }
Face<ndim> *Face<ndim>::init(const Face<ndim> *base, iter_t vbegin, iter_t vend, bool flipped) { CARVE_ASSERT(vbegin < vend); vertices.reserve((size_t)std::distance(vbegin, vend)); if (flipped) { std::reverse_copy(vbegin, vend, std::back_inserter(vertices)); plane_eqn = -base->plane_eqn; } else { std::copy(vbegin, vend, std::back_inserter(vertices)); plane_eqn = base->plane_eqn; } edges.clear(); edges.resize(nVertices(), NULL); aabb.fit(vertices.begin(), vertices.end(), vec_adapt_vertex_ptr()); untag(); int da = carve::geom::largestAxis(plane_eqn.N); project = getProjector(plane_eqn.N.v[da] > 0, da); unproject = getUnprojector(plane_eqn.N.v[da] > 0, da); return this; }
//-------------------------------------------------------------------------- bool push_many (mpsc_node_hook& first, mpsc_node_hook& last) { last.next = nullptr; mpsc_node_hook* old_tail = m_tail->exchange (&last, mo_acq_rel); //(*) another push() here would succeed, a pop() when the queue size is > 1 would succeed too. bool was_empty = is_tagged (old_tail); untag (old_tail)->next.store (&first, mo_release); return was_empty; }
void describe_symbol(LispObj sym) { lispsymbol *rawsym = (lispsymbol *)(untag(sym)); LispObj function = rawsym->fcell; Dprintf("Symbol %s at #x%08X", print_lisp_object(sym), sym); Dprintf(" value : %s", print_lisp_object(rawsym->vcell)); if (function != nrs_UDF.vcell) { Dprintf(" function : %s", print_lisp_object(function)); } }
void describe_symbol(LispObj sym) { lispsymbol *rawsym = (lispsymbol *)ptr_from_lispobj(untag(sym)); LispObj function = rawsym->fcell; #ifdef fulltag_symbol sym += (fulltag_symbol-fulltag_misc); #endif Dprintf("Symbol %s at #x%llX", print_lisp_object(sym), (long long)sym); Dprintf(" value : %s", print_lisp_object(rawsym->vcell)); if (function != nrs_UDF.vcell) { Dprintf(" function : %s", print_lisp_object(function)); } }
void sprint_symbol(LispObj o) { lispsymbol *rawsym = (lispsymbol *) ptr_from_lispobj(untag(o)); LispObj pname = rawsym->pname, package = rawsym->package_predicate; if (fulltag_of(package) == fulltag_cons) { package = car(package); } if (package == nrs_KEYWORD_PACKAGE.vcell) { add_char(':'); } add_lisp_base_string(pname); }
void GenerateExtraItems(json::Value& value, json::Value& data) { auto list = Strings::list("Items"); for (auto& kv : data["webglItems"].getMap()) { if (!kv.second.has("name")) continue; if (!list.has(kv.first)) { Logger::log("Item not found: %s", kv.first.c_str()); } else { value["webglItems"][kv.first]["name"] = untag(list[kv.first], true); } } for (auto& kv : data["webglDyes"].getMap()) { if (!list.has(kv.first)) { Logger::log("Item not found: %s", kv.first.c_str()); } else { value["webglDyes"][kv.first]["name"] = list[kv.first]; } } }
void gc(void) { int i, j; U *p; // tag everything for (i = 0; i < mcount; i++) { p = mem[i]; for (j = 0; j < N; j++) p[j].tag = 1; } // untag what's used untag(p0); untag(p1); untag(p2); untag(p3); untag(p4); untag(p5); untag(p6); untag(p7); untag(p8); untag(p9); untag(one); untag(zero); untag(imaginaryunit); for (i = 0; i < NSYM; i++) { untag(binding[i]); untag(arglist[i]); } for (i = 0; i < tos; i++) untag(stack[i]); for (i = (int) (frame - stack); i < TOS; i++) untag(stack[i]); // collect everything that's still tagged free_count = 0; for (i = 0; i < mcount; i++) { p = mem[i]; for (j = 0; j < N; j++) { if (p[j].tag == 0) continue; // still tagged so it's unused, put on free list switch (p[j].k) { case TENSOR: free(p[j].u.tensor); break; case STR: free(p[j].u.str); break; case NUM: mfree(p[j].u.q.a); mfree(p[j].u.q.b); break; } p[j].k = CONS; // so no double free occurs above p[j].u.cons.cdr = free_list; free_list = p + j; free_count++; } } }
virtual String toFriendlyString() const { // assume that the string can contain tags // TODO: distinguish between strings with tags and strings without return untag(value); }