The nim code attached compile and runs under amd64 both windows and linux, but when compiling under windows/x86/xp the nim compiler output:
nimcache\enumtest.c: In function 'enumtestInit000':
nimcache\enumtest.c:261:2: error: duplicate case value case ((Eventgroups95004) 256):
^
nimcache\enumtest.c:219:2: error: previously used here case ((Eventgroups95004) 0):
^
nimcache\enumtest.c:268:2: error: duplicate case value case ((Eventgroups95004) 512):
^
nimcache\enumtest.c:219:2: error: previously used here case ((Eventgroups95004) 0):
^
nimcache\enumtest.c:296:2: error: duplicate case value case ((Eventgroups95004) 1024):
^
nimcache\enumtest.c:219:2: error: previously used here case ((Eventgroups95004) 0):
^
nimcache\enumtest.c:303:2: error: duplicate case value case ((Eventgroups95004) 2048):
^
nimcache\enumtest.c:219:2: error: previously used here case ((Eventgroups95004) 0):
^
nimcache\enumtest.c:310:2: error: duplicate case value case ((Eventgroups95004) 8192):
^
nimcache\enumtest.c:219:2: error: previously used here case ((Eventgroups95004) 0):
^
It seems something wrong with the translated C code definiton:
typedef NU8 Eventgroups95004
under amd64 is was:
typedef NI64 Eventgroups95004
but I'm not sure
type
EVENT_GROUPS* = enum
HANDLE_INITIALIZATION = 0x00000000, ## #* attached/detached
HANDLE_MOUSE = 0x00000001, ## #* mouse events
HANDLE_KEY = 0x00000002, ## #* key events
HANDLE_FOCUS = 0x00000004, ## #* focus events, if this flag is set it also means that element it attached to is focusable
HANDLE_SCROLL = 0x00000008, ## #* scroll events
HANDLE_TIMER = 0x00000010, ## #* timer event
HANDLE_SIZE = 0x00000020, ## #* size changed event
HANDLE_DRAW = 0x00000040, ## #* drawing request (event)
HANDLE_DATA_ARRIVED = 0x00000080, ## #* requested data () has been delivered
HANDLE_BEHAVIOR_EVENT = 0x00000100, ## #* logical, synthetic events:
## # BUTTON_CLICK, HYPERLINK_CLICK, etc.,
## # a.k.a. notifications from intrinsic behaviors
HANDLE_METHOD_CALL = 0x00000200, ## #* behavior specific methods
HANDLE_SCRIPTING_METHOD_CALL = 0x00000400, ## #* behavior specific methods
HANDLE_TISCRIPT_METHOD_CALL = 0x00000800, ## #* behavior specific methods using direct tiscript::value's
HANDLE_EXCHANGE = 0x00001000, ## #* system drag-n-drop
HANDLE_GESTURE = 0x00002000, ## #* touch input events
HANDLE_ALL = 0x0000FFFF, ## # all of them
SUBSCRIPTIONS_REQUEST = 0xFFFFFFFF ## #* special value for getting subscription flags
echo HANDLE_INITIALIZATION, "\t", ord(HANDLE_INITIALIZATION)
echo HANDLE_MOUSE, "\t", ord(HANDLE_MOUSE)
echo HANDLE_KEY, "\t", ord(HANDLE_KEY)
echo HANDLE_FOCUS, "\t", ord(HANDLE_FOCUS)
echo HANDLE_SCROLL, "\t", ord(HANDLE_SCROLL)
echo HANDLE_TIMER, "\t", ord(HANDLE_TIMER)
echo HANDLE_SIZE, "\t", ord(HANDLE_SIZE)
echo HANDLE_DRAW, "\t", ord(HANDLE_DRAW)
echo HANDLE_DATA_ARRIVED, "\t", ord(HANDLE_DATA_ARRIVED)
echo HANDLE_BEHAVIOR_EVENT, "\t", ord(HANDLE_BEHAVIOR_EVENT)
echo HANDLE_METHOD_CALL, "\t", ord(HANDLE_METHOD_CALL)
echo HANDLE_SCRIPTING_METHOD_CALL, "\t", ord(HANDLE_SCRIPTING_METHOD_CALL)
echo HANDLE_TISCRIPT_METHOD_CALL, "\t", ord(HANDLE_TISCRIPT_METHOD_CALL)
echo HANDLE_EXCHANGE, "\t", ord(HANDLE_EXCHANGE)
echo HANDLE_GESTURE, "\t", ord(HANDLE_GESTURE)
echo HANDLE_ALL, "\t", ord(HANDLE_ALL)
echo SUBSCRIPTIONS_REQUEST, "\t", ord(SUBSCRIPTIONS_REQUEST)
var v = 0
# var v:EVENT_GROUPS = HANDLE_INITIALIZATION
case EVENT_GROUPS(v)
of HANDLE_INITIALIZATION:
echo HANDLE_INITIALIZATION, "\t", ord(HANDLE_INITIALIZATION)
of HANDLE_MOUSE:
echo HANDLE_MOUSE, "\t", ord(HANDLE_MOUSE)
of HANDLE_KEY:
echo HANDLE_KEY, "\t", ord(HANDLE_KEY)
of HANDLE_FOCUS:
echo HANDLE_FOCUS, "\t", ord(HANDLE_FOCUS)
of HANDLE_DRAW:
echo HANDLE_DRAW, "\t", ord(HANDLE_DRAW)
of HANDLE_TIMER:
echo HANDLE_TIMER, "\t", ord(HANDLE_TIMER)
of HANDLE_BEHAVIOR_EVENT:
echo HANDLE_BEHAVIOR_EVENT, "\t", ord(HANDLE_BEHAVIOR_EVENT)
of HANDLE_METHOD_CALL:
echo HANDLE_METHOD_CALL, "\t", ord(HANDLE_METHOD_CALL)
of HANDLE_DATA_ARRIVED:
echo HANDLE_DATA_ARRIVED, "\t", ord(HANDLE_DATA_ARRIVED)
of HANDLE_SCROLL:
echo HANDLE_SCROLL, "\t", ord(HANDLE_SCROLL)
of HANDLE_SIZE:
echo HANDLE_SIZE, "\t", ord(HANDLE_SIZE)
of HANDLE_SCRIPTING_METHOD_CALL:
echo HANDLE_SCRIPTING_METHOD_CALL, "\t", ord(HANDLE_SCRIPTING_METHOD_CALL)
of HANDLE_TISCRIPT_METHOD_CALL:
echo HANDLE_TISCRIPT_METHOD_CALL, "\t", ord(HANDLE_TISCRIPT_METHOD_CALL)
of HANDLE_GESTURE:
echo HANDLE_GESTURE, "\t", ord(HANDLE_GESTURE)
else:
echo "else"
The above code does compile when cross compiling on a amd64 machine targeting i386, but the produced binaray panic with RangeError:
HANDLE_INITIALIZATION 0
HANDLE_MOUSE 1
HANDLE_KEY 2
HANDLE_FOCUS 4
HANDLE_SCROLL 8
HANDLE_TIMER 16
HANDLE_SIZE 32
HANDLE_DRAW 64
HANDLE_DATA_ARRIVED 128
HANDLE_BEHAVIOR_EVENT 256
HANDLE_METHOD_CALL 512
HANDLE_SCRIPTING_METHOD_CALL 1024
HANDLE_TISCRIPT_METHOD_CALL 2048
HANDLE_EXCHANGE 4096
HANDLE_GESTURE 8192
HANDLE_ALL 65535
SUBSCRIPTIONS_REQUEST 4294967295
Traceback (most recent call last)
enumtest.nim(44) enumtest
system.nim(2540) sysFatal
Error: unhandled exception: value out of range: 0 [RangeError]
Thank you! It does work :)
But I'm working on some translated C code from a C library. The SUBSCRIPTIONS_REQUEST is exactly 0xFFFFFFFF in the C side. Though I don't understand the ture meanings of this const, I think it's better not to do such modification when doing 3rd party library bindings.
BTW, from your reply I think Nim by default translate Enum to C side int, is this right? or is this proper? or is there some other way to tell Nim to treat it as an uint?
Yet, you can try:
Using var v = 0 the example works with range-checks disabled (to not disable them totally, say via -d:release, the case statement can be wrapped with {.push checks: off.} and {.pop.}).
Instead of all that (w/o using size pragma), maybe you can use SUBSCRIPTIONS_REQUEST = -1, at least it works for this example, but the order should be changed (this item to be the first), so it can affect your program (at least EVENT_GROUPS.low and EVENT_GROUPS.high are affected), and maybe different values for SUBSCRIPTIONS_REQUEST will be needed for 32 and 64 bits (via when).
But I can't find the documentation about pragma size in the Nim manual, only a similar pragm bitsize exists which is for object field.
Is pragma size official or is it not documented yet?