This commit is contained in:
Araq
2014-12-14 11:49:32 +01:00
parent 556f488087
commit bebac34f87
4 changed files with 39 additions and 12 deletions

View File

@@ -147,7 +147,11 @@ proc semForFields(c: PContext, n: PNode, m: TMagic): PNode =
var fc: TFieldsCtx
fc.m = m
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)
# for TR macros this 'while true: ...; break' loop is pretty bad, so
# we avoid it now if we can:

View File

@@ -269,9 +269,14 @@ iterator fields*(x: TAny): tuple[name: string, any: TAny] =
# XXX BUG: does not work yet, however is questionable anyway
when false:
if x.rawType.kind == tyObject: t = cast[ptr PNimType](x.value)[]
var n = t.node
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):
yield ($name, any)

View File

@@ -5,16 +5,19 @@ a char: false
an int: 5
an int: 6
a string: abc
false
true
true
false
true
a string: I'm root!
CMP false
CMP true
CMP true
CMP false
CMP true
CMP true
a: a
b: b
x: 5
y: 6
z: abc
thaRootMan: I'm root!
myDisc: enC
c: Z
enC
@@ -23,7 +26,9 @@ Z
"""
type
TMyObj = object
SomeRootObj = object of RootObj
thaRootMan: string
TMyObj = object of SomeRootObj
a, b: char
x, y: int
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 =
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 y = myobj('A', 'b', 5, 9, "abc")
@@ -49,7 +55,7 @@ for f in fields(x):
p f
for a, b in fields(x, y):
echo a == b
echo "CMP ", a == b
for key, val in fieldPairs(x):
echo key, ": ", val

View File

@@ -1,10 +1,10 @@
discard """
output: ""
output: '''{"age": 12, "name": "Cletus"}'''
"""
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]] = [
["test", "1", "2", "3", "4"], ["test", "1", "2", "3", "4"],
@@ -63,3 +63,15 @@ testit(test7)
var test6: set[char] = {'A'..'Z', '_'}
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)