From 2106ec4d277931ca3f6836d4ced0b12ed392d1ab Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Tue, 11 May 2021 15:17:15 +0200 Subject: [PATCH] Revert "fix #14873 properly by skipping `abi` field in importc type (#17944)" This reverts commit 98c29c01eb91a0c6ce7da09380a272eebe6bca6f. --- lib/core/locks.nim | 5 +++++ lib/system/syslocks.nim | 8 ++++++++ tests/stdlib/uselocks.nim | 18 +----------------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/core/locks.nim b/lib/core/locks.nim index baec45829216..92967b9db658 100644 --- a/lib/core/locks.nim +++ b/lib/core/locks.nim @@ -28,6 +28,11 @@ type {.push stackTrace: off.} + +proc `$`*(lock: Lock): string = + # workaround bug #14873 + result = "()" + proc initLock*(lock: var Lock) {.inline.} = ## Initializes the given lock. when not defined(js): diff --git a/lib/system/syslocks.nim b/lib/system/syslocks.nim index 9e8da610d122..2f0c8b0ba0b9 100644 --- a/lib/system/syslocks.nim +++ b/lib/system/syslocks.nim @@ -102,18 +102,26 @@ else: SysLockObj {.importc: "pthread_mutex_t", pure, final, header: """#include #include """.} = object + when defined(linux) and defined(amd64): + abi: array[40 div sizeof(clong), clong] SysLockAttr {.importc: "pthread_mutexattr_t", pure, final header: """#include #include """.} = object + when defined(linux) and defined(amd64): + abi: array[4 div sizeof(cint), cint] # actually a cint SysCondObj {.importc: "pthread_cond_t", pure, final, header: """#include #include """.} = object + when defined(linux) and defined(amd64): + abi: array[48 div sizeof(clonglong), clonglong] SysCondAttr {.importc: "pthread_condattr_t", pure, final header: """#include #include """.} = object + when defined(linux) and defined(amd64): + abi: array[4 div sizeof(cint), cint] # actually a cint SysLockType = distinct cint diff --git a/tests/stdlib/uselocks.nim b/tests/stdlib/uselocks.nim index e82de8adf99e..e9d23f9d9ac2 100644 --- a/tests/stdlib/uselocks.nim +++ b/tests/stdlib/uselocks.nim @@ -11,21 +11,5 @@ proc use* (m: var MyType): int = result = 3 block: - # bug #14873 var l: Lock - doAssert ($l).len > 0 - # on posix, "()", on windows, something else, but that shouldn't be part of the spec - # what matters is that `$` doesn't cause the codegen bug mentioned - -when true: # intentional - # bug https://github.com/nim-lang/Nim/issues/14873#issuecomment-784241605 - type - Test = object - path: string # Removing this makes both cases work. - lock: Lock - # A: This is not fine. - var a = Test() - proc main(): void = - # B: This is fine. - var b = Test() - main() + doAssert $l == "()"