Fixed #787 - the results of const reference return values need to be copied as the holder object may go out of scope

This commit is contained in:
Matthias Koefferlein 2021-05-02 23:00:38 +02:00
parent 918e1487c2
commit f6c9df7d28
3 changed files with 49 additions and 0 deletions

View File

@ -1488,3 +1488,24 @@ TEST(63)
EXPECT_EQ (g.under_construction (), false); EXPECT_EQ (g.under_construction (), false);
} }
// issue-787
TEST(64)
{
db::Layout g;
init_layout (g);
{
db::LayoutQuery q ("select inst.dtrans from instances of .*.*");
db::LayoutQueryIterator iq (q, &g);
std::string s = q2s_var (iq, "data");
EXPECT_EQ (s, "r0 0.01,-0.02,m45 -0.01,0.02,m45 -0.01,0.02,m45 -0.01,0.02,r0 0.01,-0.02,m45 -0.01,0.02");
}
{
db::LayoutQuery q ("select inst.dtrans.disp.x,inst.dtrans.disp.y from instances of .*.*");
db::LayoutQueryIterator iq (q, &g);
std::string s = q2s_var (iq, "data");
EXPECT_EQ (s, "0.01,-0.02,-0.01,0.02,-0.01,0.02,-0.01,0.02,0.01,-0.02,-0.01,0.02");
}
}

View File

@ -901,6 +901,13 @@ struct reader<ObjectType>
tl_assert (cls != 0); tl_assert (cls != 0);
*out = tl::Variant (); *out = tl::Variant ();
// consider prefer_copy
if (! owner && atype.prefer_copy () && !clsact->is_managed () && clsact->can_copy ()) {
obj = clsact->clone (obj);
owner = true;
}
out->set_user (obj, cls, owner); out->set_user (obj, cls, owner);
} }

View File

@ -1189,3 +1189,24 @@ TEST(19)
v = e.parse ("# A comment\nvar i=CellInstArray.new(17,tr,a,b,100,200); i.to_s(); # A final comment").execute (); v = e.parse ("# A comment\nvar i=CellInstArray.new(17,tr,a,b,100,200); i.to_s(); # A final comment").execute ();
EXPECT_EQ (v.to_string (), std::string ("#17 r90 10,20 [1,2*100;11,22*200]")); EXPECT_EQ (v.to_string (), std::string ("#17 r90 10,20 [1,2*100;11,22*200]"));
} }
// issue-787
TEST(20)
{
tl::Eval e;
e.parse ("var ly=Layout.new(true)").execute ();
e.parse ("var top=ly.create_cell('TOP')").execute ();
e.parse ("var cell=ly.create_cell('CHILD')").execute ();
e.parse ("var i1 = top.insert(CellInstArray.new(cell.cell_index,Trans.new(Vector.new(100,200))))").execute ();
e.parse ("var i2 = top.insert(CellInstArray.new(cell.cell_index,Trans.new(Vector.new(-100,300))))").execute ();
tl::Variant v;
v = e.parse ("i1.dtrans.disp.x").execute ();
EXPECT_EQ (v.to_string (), std::string ("0.1"));
v = e.parse ("i1.dtrans.disp.y").execute ();
EXPECT_EQ (v.to_string (), std::string ("0.2"));
v = e.parse ("i2.dtrans.disp.x").execute ();
EXPECT_EQ (v.to_string (), std::string ("-0.1"));
v = e.parse ("i2.dtrans.disp.y").execute ();
EXPECT_EQ (v.to_string (), std::string ("0.3"));
}