[
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 -- deep|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 -- shallow..?|borderStyle=solid}
/**
* Performs a deep copy on <i>other</i>.
*/
public Test2(Test2 other) {
if (other.isSetMyset()) {
this.myset = other.myset;
}
}
{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 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}
> 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 -- deep|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 -- shallow..?|borderStyle=solid}
> /**
> * Performs a deep copy on <i>other</i>.
> */
> public Test2(Test2 other) {
> if (other.isSetMyset()) {
> this.myset = other.myset;
> }
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)