inline bool objectCopy(JsonObjectData* dst, const JsonObjectData* src,
                       MemoryPool* pool) {
  if (!dst || !src) return false;
  objectClear(dst);
  for (VariantSlot* s = src->head; s; s = s->next) {
    JsonVariantData* var;
    if (s->value.keyIsOwned)
      var = objectAdd(dst, ZeroTerminatedRamString(s->ownedKey->value), pool);
    else
      var = objectAdd(dst, ZeroTerminatedRamStringConst(s->linkedKey), pool);
    if (!variantCopy(var, &s->value, pool)) return false;
  }
  return true;
}
inline ZeroTerminatedRamString makeString(const TChar* str) {
  return ZeroTerminatedRamString(reinterpret_cast<const char*>(str));
}