Skip to content

Commit 6fc8a13

Browse files
committed
C++11: fix downcast before calling _read() in --no-auto-read mode
See kaitai-io/kaitai_struct#919 (comment) Fixes the DebugSwitchUser test for C++11. Here's the diff in the generated parser code: ```diff --- 1/compiled-old/cpp_stl_11/debug_switch_user.cpp +++ 2/compiled/cpp_stl_11/debug_switch_user.cpp @@ -12,12 +12,12 @@ void debug_switch_user_t::_read() { switch (code()) { case 1: { m_data = std::unique_ptr<one_t>(new one_t(m__io, this, m__root)); - static_cast<std::unique_ptr<one_t>>(m_data)->_read(); + static_cast<one_t*>(m_data.get())->_read(); break; } case 2: { m_data = std::unique_ptr<two_t>(new two_t(m__io, this, m__root)); - static_cast<std::unique_ptr<two_t>>(m_data)->_read(); + static_cast<two_t*>(m_data.get())->_read(); break; } } ```
1 parent 157309f commit 6fc8a13

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

shared/src/main/scala/io/kaitai/struct/languages/CppCompiler.scala

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,8 @@ class CppCompiler(
335335

336336
override def attributeReader(attrName: Identifier, attrType: DataType, isNullable: Boolean): Unit = {
337337
ensureMode(PublicAccess)
338-
outHdr.puts(s"${kaitaiType2NativeType(attrType.asNonOwning())} ${publicMemberName(attrName)}() const { return ${nonOwningPointer(attrName, attrType)}; }")
338+
val ret = nonOwningPointer(privateMemberName(attrName), attrType)
339+
outHdr.puts(s"${kaitaiType2NativeType(attrType.asNonOwning())} ${publicMemberName(attrName)}() const { return $ret; }")
339340
}
340341

341342
override def universalDoc(doc: DocSpec): Unit = {
@@ -738,7 +739,7 @@ class CppCompiler(
738739

739740
override def userTypeDebugRead(id: String, dataType: DataType, assignType: DataType): Unit = {
740741
val expr = if (assignType.asCombined != dataType) {
741-
s"static_cast<${kaitaiType2NativeType(dataType)}>($id)"
742+
s"static_cast<${kaitaiType2NativeType(dataType.asNonOwning())}>(${nonOwningPointer(id, assignType)})"
742743
} else {
743744
id
744745
}
@@ -861,7 +862,7 @@ class CppCompiler(
861862
}
862863

863864
override def instanceReturn(instName: InstanceIdentifier, attrType: DataType, isNullable: Boolean): Unit =
864-
outSrc.puts(s"return ${nonOwningPointer(instName, attrType)};")
865+
outSrc.puts(s"return ${nonOwningPointer(privateMemberName(instName), attrType)};")
865866

866867
override def instanceCalculate(instName: Identifier, dataType: DataType, value: Ast.expr): Unit = {
867868
if (attrDebugNeeded(instName))
@@ -1028,22 +1029,22 @@ class CppCompiler(
10281029
case UniqueAndRawPointers => "nullptr"
10291030
}
10301031

1031-
def nonOwningPointer(attrName: Identifier, attrType: DataType): String = {
1032+
def nonOwningPointer(id: String, attrType: DataType): String = {
10321033
config.cppConfig.pointers match {
10331034
case RawPointers =>
1034-
privateMemberName(attrName)
1035+
id
10351036
case UniqueAndRawPointers =>
10361037
attrType match {
10371038
case st: SwitchType =>
1038-
nonOwningPointer(attrName, combineSwitchType(st))
1039+
nonOwningPointer(id, combineSwitchType(st))
10391040
case t: ComplexDataType =>
10401041
if (t.isOwning) {
1041-
s"${privateMemberName(attrName)}.get()"
1042+
s"$id.get()"
10421043
} else {
1043-
privateMemberName(attrName)
1044+
id
10441045
}
10451046
case _ =>
1046-
privateMemberName(attrName)
1047+
id
10471048
}
10481049
}
10491050
}

0 commit comments

Comments
 (0)