static void createRefresher()

in src/DataFrame.cpp [155:205]


static void createRefresher(DataFrameInfo *info, const RRef* _ref) {
  RRef ref;
  ref.CopyFrom(*_ref);
  RRef* current = &ref;
  bool dereferenceIt = false;
  for (bool done = false; !done;) {
    switch (current->ref_case()) {
    case RRef::kPersistentIndex:
      return;
    case RRef::kGlobalEnv:
      done = true;
      break;
    case RRef::kCurrentEnv:
    case RRef::kSysFrameIndex:
    case RRef::kErrorStackSysFrameIndex:
      dereferenceIt = true;
      done = true;
      break;
    case RRef::kMember:
      current = current->mutable_member()->mutable_env();
      dereferenceIt = true;
      done = true;
      break;
    case RRef::kParentEnv:
      current = current->mutable_parentenv()->mutable_env();
      dereferenceIt = true;
      done = true;
      break;
    case RRef::kExpression:
      current = current->mutable_expression()->mutable_env();
      dereferenceIt = true;
      done = true;
      break;
    case RRef::kListElement:
      current = current->mutable_listelement()->mutable_list();
      break;
    case RRef::kAttributes:
      current = current->mutable_attributes();
      break;
    default:
      return;
    }
  }

  if (dereferenceIt) {
    int index = rpiService->persistentRefStorage.add(rpiService->dereference(*current));
    current->set_persistentindex(index);
    info->finalizer = [=] { rpiService->persistentRefStorage.remove(index); };
  }
  info->refresher = [=] { return rpiService->dereference(ref); };
}