Esempio n. 1
0
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);
  }
}
Esempio n. 2
0
// (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;
}
Esempio n. 3
0
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;
  }
}
Esempio n. 4
0
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;
  }
}