use anon structs and unions for a much better debug experience (#10055)

This commit is contained in:
Andreas Rumpf
2018-12-20 11:44:26 +01:00
committed by GitHub
parent 68ec42cec7
commit 2fd522cf58
2 changed files with 29 additions and 39 deletions

View File

@@ -36,27 +36,24 @@ macro testSizeAlignOf(args: varargs[untyped]): untyped =
if nim_size != c_size or nim_align != c_align:
var msg = strAlign(`arg`.type.name & ": ")
if nim_size != c_size:
msg.add " size(got, expected): " & $nim_size & " != " & $c_size
msg.add " size(got, expected): " & $nim_size & " != " & $c_size
if nim_align != c_align:
msg.add " align(get, expected): " & $nim_align & " != " & $c_align
echo msg
failed = true
macro testOffsetOf(a,b1,b2: untyped): untyped =
macro testOffsetOf(a, b: untyped): untyped =
let typeName = newLit(a.repr)
let member = newLit(b2.repr)
let member = newLit(b.repr)
result = quote do:
let
c_offset = c_offsetof(`a`,`b1`)
nim_offset = offsetof(`a`,`b2`)
c_offset = c_offsetof(`a`,`b`)
nim_offset = offsetof(`a`,`b`)
if c_offset != nim_offset:
echo `typeName`, ".", `member`, " offsetError, C: ", c_offset, " nim: ", nim_offset
failed = true
template testOffsetOf(a,b: untyped): untyped =
testOffsetOf(a,b,b)
proc strAlign(arg: string): string =
const minLen = 22
result = arg
@@ -337,16 +334,16 @@ testinstance:
testOffsetOf(AlignAtEnd, b)
testOffsetOf(AlignAtEnd, c)
testOffsetOf(SimpleBranch, "_Ukind", a)
testOffsetOf(SimpleBranch, "_Ukind", b)
testOffsetOf(SimpleBranch, "_Ukind", c)
testOffsetOf(SimpleBranch, a)
testOffsetOf(SimpleBranch, b)
testOffsetOf(SimpleBranch, c)
testOffsetOf(PaddingBeforeBranchA, cause)
testOffsetOf(PaddingBeforeBranchA, "_Ukind", a)
testOffsetOf(PaddingBeforeBranchA, a)
testOffsetOf(PaddingBeforeBranchB, cause)
testOffsetOf(PaddingBeforeBranchB, "_Ukind", a)
testOffsetOf(PaddingBeforeBranchB, a)
testOffsetOf(PaddingAfterBranch, "_Ukind", a)
testOffsetOf(PaddingAfterBranch, a)
testOffsetOf(PaddingAfterBranch, cause)
testOffsetOf(Foobar, c)
@@ -367,15 +364,15 @@ testinstance:
testOffsetOf(EnumObjectB, d)
testOffsetOf(RecursiveStuff, kind)
testOffsetOf(RecursiveStuff, "_Ukind.S1.a", a)
testOffsetOf(RecursiveStuff, "_Ukind.S2.b", b)
testOffsetOf(RecursiveStuff, "_Ukind.S3.kind2", kind2)
testOffsetOf(RecursiveStuff, "_Ukind.S3._Ukind2.S1.ca1", ca1)
testOffsetOf(RecursiveStuff, "_Ukind.S3._Ukind2.S1.ca2", ca2)
testOffsetOf(RecursiveStuff, "_Ukind.S3._Ukind2.S2.cb", cb)
testOffsetOf(RecursiveStuff, "_Ukind.S3._Ukind2.S3.cc", cc)
testOffsetOf(RecursiveStuff, "_Ukind.S3.d1", d1)
testOffsetOf(RecursiveStuff, "_Ukind.S3.d2", d2)
testOffsetOf(RecursiveStuff, a)
testOffsetOf(RecursiveStuff, b)
testOffsetOf(RecursiveStuff, kind2)
testOffsetOf(RecursiveStuff, ca1)
testOffsetOf(RecursiveStuff, ca2)
testOffsetOf(RecursiveStuff, cb)
testOffsetOf(RecursiveStuff, cc)
testOffsetOf(RecursiveStuff, d1)
testOffsetOf(RecursiveStuff, d2)
main()