docs: @Override
      public int estimateUnassembledValueSize(int index) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              JmfTr.entry(this, tc, "estimateUnassembledValueSize", index);
  
          int size = 0;
  
          // We are only interested in 'real' fields, not boxed variants etc
          if (index < cacheSize) {
              checkIndex(index);
  
              synchronized (getMessageLockArtefact()) {
  
                  // We can only figure out the size if we have a field definition (which presumably should
                  // be the case). Have to specifiy false on getFieldDef, otherwise it will return null
                  // if the message hasn't been assembled.
                  JSField field = getFieldDef(index, false);
                  if (field != null) {
  
                      Object val = cache[index];
  
                      // If the value is in the cache and isn't something with 0 size
                      if ((val != null)
                          && (val != nullIndicator)
                          && (val != JSVaryingListImpl.EMPTY_UNBOXED_VARYINGLIST)
                          && (val != JSFixedListImpl.EMPTY_FIXEDLIST)) {
                          size = (field.estimateSizeOfUnassembledValue(val, indirect));
                      }
  
                      // If not, estimate it from the information in the contents, if we have any
                      else if (contents != null) {
                          try {
                              size = (field.estimateSizeOfUnassembledValue(contents, getAbsoluteOffset(index), indirect));
                          } catch (JMFUninitializedAccessException e) {
                              // No FFDC code needed
                              // We don't want to throw an exception or even FFDC it (as we don't
                              // know anything useful to FFDC). We'll just let it default to 0.
                          }
                      }
                  }
              }
          }
  
          // If we have no FieldDef, a nullIndicator or no contents, then we will just return 0;
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              JmfTr.exit(this, tc, "estimateUnassembledValueSize", size);
          return size;
      }