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); };
}