summary refs log tree commit diff stats
path: root/tests/js/tmangle.nim
blob: c97bf7029f28bd54fc7df0c38485bec49807bd3a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
discard """
  output: '''true
true
true
true
true
true
true'''
"""

# Test not mangled:
block:
  type T = object
    a: int
    b: cstring
  proc test(): bool =
    let obj = T(a: 11, b: "foo")
    {. emit: [result, " = (", obj, ".a == 11);"] .}
    {. emit: [result, " = ", result, " && (", obj, ".b == \"foo\");"] .}
  echo test()

# Test indirect (fields in genAddr):
block:
  type T = object
    a: int
    b: cstring
  var global = T(a: 11, b: "foo")
  proc test(): bool =
    var obj = T(a: 11, b: "foo")
    {. emit: [result, " = (", obj.addr[], ".a == 11);"] .}
    {. emit: [result, " = ", result, " && (", obj.addr[], ".b == \"foo\");"] .}
    {. emit: [result, " = ", result, " && (", global, ".a == 11);"] .}
    {. emit: [result, " = ", result, " && (", global, ".b == \"foo\");"] .}
  echo test()

# Test addr of field:
block:
  type T = object
    a: int
    b: cstring
  proc test(): bool =
    var obj = T(a: 11, b: "foo")
    result = obj.a.addr[] == 11
    result = result and obj.b.addr[] == "foo".cstring
  echo test()

# Test reserved words:
block:
  type T = ref object
    `if`: int
    `for`: int
    `==`: cstring
    `&&`: cstring
  proc test(): bool =
    var
      obj1 = T(`if`: 11, `for`: 22, `==`: "foo", `&&`: "bar")
      obj2: T
    new obj2 # Test behaviour for createRecordVarAux.
    result = obj1.`if` == 11
    result = result and obj1.addr[].`for` == 22
    result = result and obj1.`==` == "foo".cstring
    result = result and obj1.`&&`.addr[] == "bar".cstring
    result = result and obj2.`if` == 0
    result = result and obj2.`for` == 0
    result = result and obj2.`==`.isNil()
    result = result and obj2.`&&`.isNil()
  echo test()

# Test codegen for fields with uppercase letters:
block:
  type MyObj = object
    mField: int
  proc test(): bool =
    var a: MyObj
    var b = a
    result = b.mField == 0
  echo test()

# Test tuples
block:
  type T = tuple
    a: int
    b: int
  proc test(): bool =
    var a: T = (a: 1, b: 1)
    result = a.a == 1
    result = result and a.b == 1
  echo test()

# Test importc / exportc fields:
block:
  type T = object
    a: int
    b {. importc: "notB" .}: cstring
  type U = object
    a: int
    b {. exportc: "notB" .}: cstring
  proc test(): bool =
    var
      obj1 = T(a: 11, b: "foo")
      obj2 = U(a: 11, b: "foo")
    {. emit: [result, " = (", obj1, ".a == 11);"] .}
    {. emit: [result, " = ", result, " && (", obj1, ".notB == \"foo\");"] .}
    {. emit: [result, " = (", obj2, ".a == 11);"] .}
    {. emit: [result, " = ", result, " && (", obj2, ".notB == \"foo\");"] .}
  echo test()