diff options
-rw-r--r-- | compiler/jsgen.nim | 10 | ||||
-rw-r--r-- | compiler/jstypes.nim | 4 | ||||
-rw-r--r-- | tests/enum/tbasicenum.nim | 11 | ||||
-rw-r--r-- | tests/enum/tenumhole.nim | 24 | ||||
-rw-r--r-- | tests/enum/tenumoffset.nim | 20 | ||||
-rw-r--r-- | tests/js/tbasicenum.nim | 10 | ||||
-rw-r--r-- | tests/js/tenumhole.nim | 12 | ||||
-rw-r--r-- | tests/js/tenumnegkey.nim | 12 | ||||
-rw-r--r-- | tests/js/tenumoffset.nim | 19 |
9 files changed, 95 insertions, 27 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 8f819686d..f5e8027b3 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -1634,16 +1634,8 @@ proc genRepr(p: PProc, n: PNode, r: var TCompRes) = of tyEnum, tyOrdinal: gen(p, n.sons[1], r) useMagic(p, "cstrToNimstr") - var offset = "" - if t.kind == tyEnum: - let firstFieldOffset = t.n.sons[0].sym.position - if firstFieldOffset < 0: - offset = "+" & $(-firstFieldOffset) - elif firstFieldOffset > 0: - offset = "-" & $firstFieldOffset - r.kind = resExpr - r.res = "cstrToNimstr($1.node.sons[$2$3].name)" % [genTypeInfo(p, t), r.res, rope(offset)] + r.res = "cstrToNimstr($1.node.sons[$2].name)" % [genTypeInfo(p, t), r.res] else: # XXX: internalError(n.info, "genRepr: Not implemented") diff --git a/compiler/jstypes.nim b/compiler/jstypes.nim index b96a260b3..f49bd7668 100644 --- a/compiler/jstypes.nim +++ b/compiler/jstypes.nim @@ -104,10 +104,10 @@ proc genEnumInfo(p: PProc, typ: PType, name: Rope) = let field = typ.n.sons[i].sym if i > 0: add(s, ", " & tnl) let extName = if field.ast == nil: field.name.s else: field.ast.strVal - addf(s, "{kind: 1, offset: $1, typ: $2, name: $3, len: 0, sons: null}", + addf(s, "\"$1\": {kind: 1, offset: $1, typ: $2, name: $3, len: 0, sons: null}", [rope(field.position), name, makeJSString(extName)]) var n = ("var NNI$1 = {kind: 2, offset: 0, typ: null, " & - "name: null, len: $2, sons: [$3]};$n") % [rope(typ.id), rope(length), s] + "name: null, len: $2, sons: {$3}};$n") % [rope(typ.id), rope(length), s] s = ("var $1 = {size: 0, kind: $2, base: null, node: null, " & "finalizer: null};$n") % [name, rope(ord(typ.kind))] prepend(p.g.typeInfo, s) diff --git a/tests/enum/tbasicenum.nim b/tests/enum/tbasicenum.nim new file mode 100644 index 000000000..eb2182f71 --- /dev/null +++ b/tests/enum/tbasicenum.nim @@ -0,0 +1,11 @@ +discard """ + file: "tbasicenum.nim" + output: "ABCDC" +""" + +type + MyEnum = enum + A,B,C,D +# trick the optimizer with an seq: +var x = @[A,B,C,D] +echo x[0],x[1],x[2],x[3],MyEnum(2) \ No newline at end of file diff --git a/tests/enum/tenumhole.nim b/tests/enum/tenumhole.nim index 68b82e283..4928572f9 100644 --- a/tests/enum/tenumhole.nim +++ b/tests/enum/tenumhole.nim @@ -1,24 +1,16 @@ discard """ file: "tenumhole.nim" - output: "my value A1my value Bconc2valueCabc4abc" + output: "first0second32third64" """ -const - strValB = "my value B" +type Holed = enum + hFirst = (0,"first") + hSecond = (32,"second") + hThird = (64,"third") + +var x = @[0,32,64] # This is just to avoid the compiler inlining the value of the enum -type - TMyEnum = enum - valueA = (1, "my value A"), - valueB = strValB & "conc", - valueC, - valueD = (4, "abc") - -# test the new "proc body can be an expr" feature: -proc getValue: TMyEnum = valueD - -# trick the optimizer with a variable: -var x = getValue() -echo valueA, ord(valueA), valueB, ord(valueB), valueC, valueD, ord(valueD), x +echo Holed(x[0]),ord Holed(x[0]),Holed(x[1]),ord Holed(x[1]),Holed(x[2]),ord Holed(x[2]) diff --git a/tests/enum/tenumoffset.nim b/tests/enum/tenumoffset.nim new file mode 100644 index 000000000..e67164604 --- /dev/null +++ b/tests/enum/tenumoffset.nim @@ -0,0 +1,20 @@ +discard """ + file: "tenumoffset.nim" + output: "my value A1my value Bconc2valueCabc4abc" +""" + +const + strValB = "my value B" + +type + TMyEnum = enum + valueA = (1, "my value A"), + valueB = strValB & "conc", + valueC, + valueD = (4, "abc") + +proc getValue(i:int): TMyEnum = TMyEnum(i) + +# trick the optimizer with a variable: +var x = getValue(4) +echo getValue(1), ord(valueA), getValue(2), ord(valueB), getValue(3), getValue(4), ord(valueD), x diff --git a/tests/js/tbasicenum.nim b/tests/js/tbasicenum.nim new file mode 100644 index 000000000..a9e9ce2da --- /dev/null +++ b/tests/js/tbasicenum.nim @@ -0,0 +1,10 @@ +discard """ + output: "ABCDC" +""" + +type + MyEnum = enum + A,B,C,D +# trick the optimizer with an seq: +var x = @[A,B,C,D] +echo x[0],x[1],x[2],x[3],MyEnum(2) \ No newline at end of file diff --git a/tests/js/tenumhole.nim b/tests/js/tenumhole.nim new file mode 100644 index 000000000..71a493e8c --- /dev/null +++ b/tests/js/tenumhole.nim @@ -0,0 +1,12 @@ +discard """ + output: "first0second32third64" +""" + +type Holed = enum + hFirst = (0,"first") + hSecond = (32,"second") + hThird = (64,"third") + +var x = @[0,32,64] # This is just to avoid the compiler inlining the value of the enum + +echo Holed(x[0]),ord Holed(x[0]),Holed(x[1]),ord Holed(x[1]),Holed(x[2]),ord Holed(x[2]) diff --git a/tests/js/tenumnegkey.nim b/tests/js/tenumnegkey.nim new file mode 100644 index 000000000..f96c554d4 --- /dev/null +++ b/tests/js/tenumnegkey.nim @@ -0,0 +1,12 @@ +discard """ + output: "first-12second32third64" +""" + +type Holed = enum + hFirst = (-12,"first") + hSecond = (32,"second") + hThird = (64,"third") + +var x = @[-12,32,64] # This is just to avoid the compiler inlining the value of the enum + +echo Holed(x[0]),ord Holed(x[0]),Holed(x[1]),ord Holed(x[1]),Holed(x[2]),ord Holed(x[2]) diff --git a/tests/js/tenumoffset.nim b/tests/js/tenumoffset.nim new file mode 100644 index 000000000..5bdc4c105 --- /dev/null +++ b/tests/js/tenumoffset.nim @@ -0,0 +1,19 @@ +discard """ + output: "my value A1my value Bconc2valueCabc4abc" +""" + +const + strValB = "my value B" + +type + TMyEnum = enum + valueA = (1, "my value A"), + valueB = strValB & "conc", + valueC, + valueD = (4, "abc") + +proc getValue(i:int): TMyEnum = TMyEnum(i) + +# trick the optimizer with a variable: +var x = getValue(4) +echo getValue(1), ord(valueA), getValue(2), ord(valueB), getValue(3), getValue(4), ord(valueD), x |