mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 05:50:30 +00:00
fixes #1352
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user