fixes #1352
This commit is contained in:
parent
556f488087
commit
bebac34f87
4 changed files with 39 additions and 12 deletions
|
|
@ -147,7 +147,11 @@ proc semForFields(c: PContext, n: PNode, m: TMagic): PNode =
|
||||||
var fc: TFieldsCtx
|
var fc: TFieldsCtx
|
||||||
fc.m = m
|
fc.m = m
|
||||||
fc.c = c
|
fc.c = c
|
||||||
semForObjectFields(fc, tupleTypeA.n, n, stmts)
|
var t = tupleTypeA
|
||||||
|
while t.kind == tyObject:
|
||||||
|
semForObjectFields(fc, t.n, n, stmts)
|
||||||
|
if t.sons[0] == nil: break
|
||||||
|
t = skipTypes(t.sons[0], abstractPtrs)
|
||||||
dec(c.p.nestedLoopCounter)
|
dec(c.p.nestedLoopCounter)
|
||||||
# for TR macros this 'while true: ...; break' loop is pretty bad, so
|
# for TR macros this 'while true: ...; break' loop is pretty bad, so
|
||||||
# we avoid it now if we can:
|
# we avoid it now if we can:
|
||||||
|
|
|
||||||
|
|
@ -269,9 +269,14 @@ iterator fields*(x: TAny): tuple[name: string, any: TAny] =
|
||||||
# XXX BUG: does not work yet, however is questionable anyway
|
# XXX BUG: does not work yet, however is questionable anyway
|
||||||
when false:
|
when false:
|
||||||
if x.rawType.kind == tyObject: t = cast[ptr PNimType](x.value)[]
|
if x.rawType.kind == tyObject: t = cast[ptr PNimType](x.value)[]
|
||||||
var n = t.node
|
|
||||||
var ret: seq[tuple[name: cstring, any: TAny]] = @[]
|
var ret: seq[tuple[name: cstring, any: TAny]] = @[]
|
||||||
fieldsAux(p, n, ret)
|
if t.kind == tyObject:
|
||||||
|
while true:
|
||||||
|
fieldsAux(p, t.node, ret)
|
||||||
|
t = t.base
|
||||||
|
if t.isNil: break
|
||||||
|
else:
|
||||||
|
fieldsAux(p, t.node, ret)
|
||||||
for name, any in items(ret):
|
for name, any in items(ret):
|
||||||
yield ($name, any)
|
yield ($name, any)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,16 +5,19 @@ a char: false
|
||||||
an int: 5
|
an int: 5
|
||||||
an int: 6
|
an int: 6
|
||||||
a string: abc
|
a string: abc
|
||||||
false
|
a string: I'm root!
|
||||||
true
|
CMP false
|
||||||
true
|
CMP true
|
||||||
false
|
CMP true
|
||||||
true
|
CMP false
|
||||||
|
CMP true
|
||||||
|
CMP true
|
||||||
a: a
|
a: a
|
||||||
b: b
|
b: b
|
||||||
x: 5
|
x: 5
|
||||||
y: 6
|
y: 6
|
||||||
z: abc
|
z: abc
|
||||||
|
thaRootMan: I'm root!
|
||||||
myDisc: enC
|
myDisc: enC
|
||||||
c: Z
|
c: Z
|
||||||
enC
|
enC
|
||||||
|
|
@ -23,7 +26,9 @@ Z
|
||||||
"""
|
"""
|
||||||
|
|
||||||
type
|
type
|
||||||
TMyObj = object
|
SomeRootObj = object of RootObj
|
||||||
|
thaRootMan: string
|
||||||
|
TMyObj = object of SomeRootObj
|
||||||
a, b: char
|
a, b: char
|
||||||
x, y: int
|
x, y: int
|
||||||
z: string
|
z: string
|
||||||
|
|
@ -41,6 +46,7 @@ proc p(x: string) = echo "a string: ", x
|
||||||
|
|
||||||
proc myobj(a, b: char, x, y: int, z: string): TMyObj =
|
proc myobj(a, b: char, x, y: int, z: string): TMyObj =
|
||||||
result.a = a; result.b = b; result.x = x; result.y = y; result.z = z
|
result.a = a; result.b = b; result.x = x; result.y = y; result.z = z
|
||||||
|
result.thaRootMan = "I'm root!"
|
||||||
|
|
||||||
var x = myobj('a', 'b', 5, 6, "abc")
|
var x = myobj('a', 'b', 5, 6, "abc")
|
||||||
var y = myobj('A', 'b', 5, 9, "abc")
|
var y = myobj('A', 'b', 5, 9, "abc")
|
||||||
|
|
@ -49,7 +55,7 @@ for f in fields(x):
|
||||||
p f
|
p f
|
||||||
|
|
||||||
for a, b in fields(x, y):
|
for a, b in fields(x, y):
|
||||||
echo a == b
|
echo "CMP ", a == b
|
||||||
|
|
||||||
for key, val in fieldPairs(x):
|
for key, val in fieldPairs(x):
|
||||||
echo key, ": ", val
|
echo key, ": ", val
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
discard """
|
discard """
|
||||||
output: ""
|
output: '''{"age": 12, "name": "Cletus"}'''
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import marshal
|
import marshal
|
||||||
|
|
||||||
template testit(x: expr) = echo($$to[type(x)]($$x))
|
template testit(x: expr) = discard $$to[type(x)]($$x)
|
||||||
|
|
||||||
var x: array[0..4, array[0..4, string]] = [
|
var x: array[0..4, array[0..4, string]] = [
|
||||||
["test", "1", "2", "3", "4"], ["test", "1", "2", "3", "4"],
|
["test", "1", "2", "3", "4"], ["test", "1", "2", "3", "4"],
|
||||||
|
|
@ -63,3 +63,15 @@ testit(test7)
|
||||||
var test6: set[char] = {'A'..'Z', '_'}
|
var test6: set[char] = {'A'..'Z', '_'}
|
||||||
testit(test6)
|
testit(test6)
|
||||||
|
|
||||||
|
|
||||||
|
# bug #1352
|
||||||
|
|
||||||
|
type
|
||||||
|
Entity = object of RootObj
|
||||||
|
name: string
|
||||||
|
|
||||||
|
Person = object of Entity
|
||||||
|
age: int
|
||||||
|
|
||||||
|
var instance1 = Person(name: "Cletus", age: 12)
|
||||||
|
echo($$instance1)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue