fix TypeDef(const Value& val) for Union/UnionA/StructA
This commit is contained in:
+14
-6
@@ -297,12 +297,20 @@ void Member::Helper::copy_tree(const FieldDesc* desc, Member& node)
|
||||
{
|
||||
node.code = desc->code;
|
||||
node.id = desc->id;
|
||||
node.children.reserve(desc->miter.size());
|
||||
for(auto& pair : desc->miter) {
|
||||
auto cdesc = desc+pair.second;
|
||||
node.children.emplace_back(cdesc->code, pair.first);
|
||||
node.children.back().id = cdesc->id;
|
||||
copy_tree(cdesc, node.children.back());
|
||||
if(desc->code==TypeCode::Struct || desc->code==TypeCode::Union) {
|
||||
auto cbase = desc->code==TypeCode::Struct ? desc : desc->members.data();
|
||||
node.children.reserve(desc->miter.size());
|
||||
for(auto& pair : desc->miter) {
|
||||
auto cdesc = cbase+pair.second;
|
||||
assert(desc!=cdesc);
|
||||
node.children.emplace_back(cdesc->code, pair.first);
|
||||
node.children.back().id = cdesc->id;
|
||||
copy_tree(cdesc, node.children.back());
|
||||
}
|
||||
|
||||
} else if(desc->code==TypeCode::StructA || desc->code==TypeCode::UnionA) {
|
||||
copy_tree(&desc->members[0], node);
|
||||
node.code = node.code.arrayOf();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-1
@@ -588,11 +588,19 @@ void testFormat()
|
||||
);
|
||||
}
|
||||
|
||||
void testAppendBig()
|
||||
{
|
||||
auto orig(neckBolt());
|
||||
TypeDef append(orig);
|
||||
auto copy(append.create());
|
||||
testTrue(orig.equalType(copy));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
MAIN(testtype)
|
||||
{
|
||||
testPlan(68);
|
||||
testPlan(69);
|
||||
testSetup();
|
||||
showSize();
|
||||
testCode();
|
||||
@@ -603,6 +611,7 @@ MAIN(testtype)
|
||||
testTypeDefAppendIncremental();
|
||||
testOp();
|
||||
testFormat();
|
||||
testAppendBig();
|
||||
cleanup_for_valgrind();
|
||||
return testDone();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user