summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/jsgen.nim10
-rw-r--r--compiler/jstypes.nim4
-rw-r--r--tests/enum/tbasicenum.nim11
-rw-r--r--tests/enum/tenumhole.nim24
-rw-r--r--tests/enum/tenumoffset.nim20
-rw-r--r--tests/js/tbasicenum.nim10
-rw-r--r--tests/js/tenumhole.nim12
-rw-r--r--tests/js/tenumnegkey.nim12
-rw-r--r--tests/js/tenumoffset.nim19
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