[ 
https://issues.apache.org/jira/browse/THRIFT-3377?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Vincent Dumont updated THRIFT-3377:
-----------------------------------
    Description: 
Consider the following structures:

{code:title=thrift|borderStyle=solid}
typedef set<i32> sset;

struct Test {
  1: set<i32> myset;
}

struct Test2 {
  1: sset myset;
}
{code}

The generated code for Test's copy constructor looks fine, it deep copies the 
set. However, Test2, which should be equivalent, actually does not deep-copy 
the set and instead simply does a shallow assignment like if it was a POD type. 

{code:title=Test.java|borderStyle=solid}
  /** 
   * Performs a deep copy on <i>other</i>.
   */
  public Test(Test other) {
    if (other.isSetMyset()) {
      Set<Integer> __this__myset = new HashSet<Integer>(other.myset);
      this.myset = __this__myset;
    }   
  }
{code}

VS

{code:title=Test2.java|borderStyle=solid}
  /**
   * Performs a deep copy on <i>other</i>.
   */
  public Test2(Test2 other) {
    if (other.isSetMyset()) {
      this.myset = other.myset; // Not deep...
    }
  }
{code}

  was:
Consider the following structures:

{code:title=thrift|borderStyle=solid}
typedef set<i32> sset;

struct Test {
  1: set<i32> myset;
}

struct Test2 {
  1: sset myset;
}
{code}

The generate code for Test's copy constructor looks fine, it deep copies the 
set. However, Test2, which should be equivalent, actually does not deep-copy 
the set and instead simply does a shallow assignment like if it was a POD type. 

{code:title=Test.java|borderStyle=solid}
  /** 
   * Performs a deep copy on <i>other</i>.
   */
  public Test(Test other) {
    if (other.isSetMyset()) {
      Set<Integer> __this__myset = new HashSet<Integer>(other.myset);
      this.myset = __this__myset;
    }   
  }
{code}

VS

{code:title=Test2.java|borderStyle=solid}
  /**
   * Performs a deep copy on <i>other</i>.
   */
  public Test2(Test2 other) {
    if (other.isSetMyset()) {
      this.myset = other.myset; // Not deep...
    }
  }
{code}


> Deep copy is actually shallow when using typedef members
> --------------------------------------------------------
>
>                 Key: THRIFT-3377
>                 URL: https://issues.apache.org/jira/browse/THRIFT-3377
>             Project: Thrift
>          Issue Type: Bug
>          Components: Java - Compiler
>    Affects Versions: 0.9.2
>            Reporter: Vincent Dumont
>
> Consider the following structures:
> {code:title=thrift|borderStyle=solid}
> typedef set<i32> sset;
> struct Test {
>   1: set<i32> myset;
> }
> struct Test2 {
>   1: sset myset;
> }
> {code}
> The generated code for Test's copy constructor looks fine, it deep copies the 
> set. However, Test2, which should be equivalent, actually does not deep-copy 
> the set and instead simply does a shallow assignment like if it was a POD 
> type. 
> {code:title=Test.java|borderStyle=solid}
>   /** 
>    * Performs a deep copy on <i>other</i>.
>    */
>   public Test(Test other) {
>     if (other.isSetMyset()) {
>       Set<Integer> __this__myset = new HashSet<Integer>(other.myset);
>       this.myset = __this__myset;
>     }   
>   }
> {code}
> VS
> {code:title=Test2.java|borderStyle=solid}
>   /**
>    * Performs a deep copy on <i>other</i>.
>    */
>   public Test2(Test2 other) {
>     if (other.isSetMyset()) {
>       this.myset = other.myset; // Not deep...
>     }
>   }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to