You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Mathias Herberts (JIRA)" <ji...@apache.org> on 2010/09/01 08:22:54 UTC

[jira] Issue Comment Edited: (THRIFT-882) deep copy of binary fields does not copy ByteBuffer characteristics (arrayOffset, position)

    [ https://issues.apache.org/jira/browse/THRIFT-882?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12904944#action_12904944 ] 

Mathias Herberts edited comment on THRIFT-882 at 9/1/10 2:21 AM:
-----------------------------------------------------------------

The handling of non array backed buffers will change any existing mark:

{code}
      orig.mark();
      orig.get(copy.array());
      orig.reset();
{code}

It can be avoided by doing

{code}
  // Save current position
  int pos = orig.position();

  int mark = -1;

  // Save current mark if set
  try {
    orig.reset();
    mark = orig.position();
    orig.position(pos);
  } catch (InvalidMarkException ime) {
  }

  orig.mark();
  orig.get(copy.array());

  // Get rid of mark and reset position to 0.
  orig.rewind();

  // Reset mark to its original value if it was set
  if (-1 != mark) {
    orig.position(mark);
    orig.mark();
  }

  // Reset position to its original value.
  orig.position(pos);
{code}

      was (Author: herberts):
    The handling of non array backed buffers will change any existing mark:


      orig.mark();
      orig.get(copy.array());
      orig.reset();

It can be avoided by doing

  // Save current position
  int pos = orig.position();

  int mark = -1;

  // Save current mark if set
  try {
    orig.reset();
    mark = orig.position();
    orig.position(pos);
  } catch (InvalidMarkException ime) {
  }

  orig.mark();
  orig.get(copy.array());

  // Get rid of mark and reset position to 0.
  orig.rewind();

  // Reset mark to its original value if it was set
  if (-1 != mark) {
    orig.position(mark);
    orig.mark();
  }

  // Reset position to its original value.
  orig.position(pos);

  
> deep copy of binary fields does not copy ByteBuffer characteristics (arrayOffset, position)
> -------------------------------------------------------------------------------------------
>
>                 Key: THRIFT-882
>                 URL: https://issues.apache.org/jira/browse/THRIFT-882
>             Project: Thrift
>          Issue Type: Bug
>          Components: Java - Compiler
>    Affects Versions: 0.4
>            Reporter: Mathias Herberts
>            Assignee: Bryan Duxbury
>             Fix For: 0.5
>
>         Attachments: thrift-882.patch
>
>
> Generated objects have a constructor which does a deep copy of an existing instance.
> For binary fields, the deep copy is done like that:
> {code}
>     if (other.isSetBinary_field()) {
>       this.binary_field = ByteBuffer.wrap(new byte[other.binary_field.limit() - other.binary_field.arrayOffset()]);
>       System.arraycopy(other.binary_field.array(), other.binary_field.arrayOffset(), binary_field.array(), 0, other.binary_field.limit() - other.binary_field.arrayOffset());
>     }
> {code}
> This copies the backing array of the ByteBuffer but does not set the position correctly.
> In various protocol implementations, ByteBuffer instances are serialized by considering data between position and limit, this means that an object created from another object might lead to different serialized data (and thus a different deserialized value) in case a ByteBuffer has a non default position (which can happen since ByteBuffers can be set).

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.