void Object::displayListDetail(int fd) { raw()->car()->displayDetail(fd); Object *curr = raw()->cdr(); while (curr->isPair()) { dprintf(fd, " "); curr->raw()->car()->displayDetail(fd); curr = curr->raw()->cdr(); } if (curr != newNil()) { dprintf(fd, " . "); curr->displayDetail(fd); } }
// (internal use only) turning argument expressions into values // given that application itself is proper list, randExps is always // either nil or pair const SExp *evalArgs(const SExp *randExps, Environment *env) { if (sexpNil == randExps->tag) return newNil(); const SExp *firstVal = evalDispatch(sexpCar(randExps), env); const SExp *restVals = evalArgs(sexpCdr(randExps), env); // if the evaluation for sub-exprs have failed, // stop this immediately if (firstVal == NULL || restVals == NULL) return NULL; const SExp *retVal = newPair(firstVal,restVals); // here we cannot recursively de-allocate the resource, // because eval-handlers might return an existing pointer as results // which means the value returned might be allocated somewhere else. pointerManagerRegister(retVal); return retVal; }
void Object::printToFd(int fd) { RawObject *raw = unTag<RawObject>(); switch (getTag()) { case RawObject::kPairTag: dprintf(fd, "<Pair @%p>", raw); break; case RawObject::kSymbolTag: dprintf(fd, "<Symbol %s>", raw->as<const char *>()); break; case RawObject::kSingletonTag: if (this == newNil()) { dprintf(fd, "<Nil>"); } else { dprintf(fd, "<Unknown-singleton %p>", this); } break; case RawObject::kFixnumTag: dprintf(fd, "<Fixnum %ld>", fromFixnum()); break; case RawObject::kClosureTag: dprintf(fd, "<Closure "); raw->cloInfo()->funcName()->printToFd(fd); dprintf(fd, " @%p>", raw); break; case RawObject::kVectorTag: dprintf(fd, "<Vector %p>", raw); break; default: dprintf(fd, "<Unknown-ptr %p>", this); break; } }
void Object::displayDetail(int fd) { RawObject *raw = unTag<RawObject>(); switch (getTag()) { case RawObject::kPairTag: dprintf(fd, "("); displayListDetail(fd); dprintf(fd, ")"); break; case RawObject::kSymbolTag: dprintf(fd, "%s", raw->as<const char *>()); break; case RawObject::kSingletonTag: if (this == newNil()) { dprintf(fd, "()"); } else if (this == newTrue()) { dprintf(fd, "#t"); } else if (this == newFalse()) { dprintf(fd, "#f"); } else if (this == newVoid()) { dprintf(fd, "<void>"); } else { dprintf(fd, "<Unknown-singleton %p>", this); } break; case RawObject::kFixnumTag: dprintf(fd, "%ld", fromFixnum()); break; case RawObject::kClosureTag: if (raw->cloInfo()) { dprintf(fd, "<Closure "); raw->cloInfo()->funcName()->displayDetail(fd); dprintf(fd, ">"); } else { // info table is null during compilation dprintf(fd, "<Semi-Closure %p>", raw); } break; case RawObject::kVectorTag: { dprintf(fd, "(#"); for (intptr_t i = 0, len = raw->vectorSize(); i < len; ++i) { dprintf(fd, " "); raw->vectorAt(i)->displayDetail(fd); } dprintf(fd, ")"); break; } default: dprintf(fd, "<Unknown-ptr %p>", this); break; } }