Removed mangling of object fields for the js target only. (#5226)

* removed mangling of object fields for the js target only.

* changed default mangling behaviour for the php target as well.

* Added test for unorthodox field names (reserved words and operators). Adjusted field accessors and object constructors / new to be ECMAScript first edition compatible, when using fieldnames which are reserved words.
This commit is contained in:
Michael Jendrusch 2017-01-17 16:43:06 +01:00 • committed by Andreas Rumpf
commit 454547da8e
2 changed files with 90 additions and 8 deletions

83
tests/js/tmangle.nim Normal file
View file

@ -0,0 +1,83 @@
discard """
output: '''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[], "[0].a == 11);"] .}
{. emit: [result, " = ", result, " && (", obj.addr[], "[0].b == \"foo\");"] .}
{. emit: [result, " = ", result, " && (", global, "[0].a == 11);"] .}
{. emit: [result, " = ", result, " && (", global, "[0].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 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()