From c98a8f3701c4410b6596cee7809f5e18ec6cf6b7 Mon Sep 17 00:00:00 2001 From: Brandon Pickering Date: Tue, 10 Jan 2017 20:54:04 -0800 Subject: [PATCH] Handle different enum sizes in reprAux (#5207) --- lib/system/repr.nim | 10 +++++++++- tests/system/tenum_array_repr.nim | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/system/tenum_array_repr.nim diff --git a/lib/system/repr.nim b/lib/system/repr.nim index cf7d6d7a9..b067d7a3d 100644 --- a/lib/system/repr.nim +++ b/lib/system/repr.nim @@ -233,6 +233,14 @@ when not defined(useNimRtl): add result, " --> " reprAux(result, p, typ.base, cl) + proc getInt(p: pointer, size: int): int = + case size + of 1: return int(cast[ptr uint8](p)[]) + of 2: return int(cast[ptr uint16](p)[]) + of 4: return int(cast[ptr uint32](p)[]) + of 8: return int(cast[ptr uint64](p)[]) + else: discard + proc reprAux(result: var string, p: pointer, typ: PNimType, cl: var ReprClosure) = if cl.recdepth == 0: @@ -266,7 +274,7 @@ when not defined(useNimRtl): of tyFloat: add result, $(cast[ptr float](p)[]) of tyFloat32: add result, $(cast[ptr float32](p)[]) of tyFloat64: add result, $(cast[ptr float64](p)[]) - of tyEnum: add result, reprEnum(cast[ptr int](p)[], typ) + of tyEnum: add result, reprEnum(getInt(p, typ.size), typ) of tyBool: add result, reprBool(cast[ptr bool](p)[]) of tyChar: add result, reprChar(cast[ptr char](p)[]) of tyString: reprStrAux(result, cast[ptr string](p)[]) diff --git a/tests/system/tenum_array_repr.nim b/tests/system/tenum_array_repr.nim new file mode 100644 index 000000000..3634692e3 --- /dev/null +++ b/tests/system/tenum_array_repr.nim @@ -0,0 +1,25 @@ +discard """ + output: ''' +1 +[a, b] + +2 +[c, d] + +4 +[e, f]''' +""" + +# issue 5045 + +type size1 = enum a, b +echo sizeof(size1) +echo repr([a, b]) + +type size2 = enum c=0, d=20000 +echo sizeof(size2) +echo repr([c, d]) + +type size4 = enum e=0, f=2000000000 +echo sizeof(size4) +echo repr([e, f])