parent
1db21721ec
commit
7213969901
2 changed files with 26 additions and 5 deletions
|
|
@ -41,20 +41,26 @@ proc genEnumToStrProc*(t: PType; info: TLineInfo; g: ModuleGraph): PSym =
|
||||||
result.ast = n
|
result.ast = n
|
||||||
incl result.flags, sfFromGeneric
|
incl result.flags, sfFromGeneric
|
||||||
|
|
||||||
proc searchObjCase(obj: PNode; field: PSym): PNode =
|
proc searchObjCaseImpl(obj: PNode; field: PSym): PNode =
|
||||||
case obj.kind
|
case obj.kind
|
||||||
of nkSym:
|
of nkSym:
|
||||||
result = nil
|
result = nil
|
||||||
of nkElse, nkOfBranch:
|
of nkElse, nkOfBranch:
|
||||||
result = searchObjCase(obj.lastSon, field)
|
result = searchObjCaseImpl(obj.lastSon, field)
|
||||||
else:
|
else:
|
||||||
if obj.kind == nkRecCase and obj[0].kind == nkSym and obj[0].sym == field:
|
if obj.kind == nkRecCase and obj[0].kind == nkSym and obj[0].sym == field:
|
||||||
result = obj
|
result = obj
|
||||||
else:
|
else:
|
||||||
for x in obj:
|
for x in obj:
|
||||||
result = searchObjCase(x, field)
|
result = searchObjCaseImpl(x, field)
|
||||||
if result != nil: break
|
if result != nil: break
|
||||||
|
|
||||||
|
proc searchObjCase(t: PType; field: PSym): PNode =
|
||||||
|
result = searchObjCaseImpl(t.n, field)
|
||||||
|
if result == nil and t.len > 0:
|
||||||
|
result = searchObjCase(t[0].skipTypes({tyAlias, tyGenericInst, tyRef, tyPtr}), field)
|
||||||
|
doAssert result != nil
|
||||||
|
|
||||||
proc genCaseObjDiscMapping*(t: PType; field: PSym; info: TLineInfo; g: ModuleGraph): PSym =
|
proc genCaseObjDiscMapping*(t: PType; field: PSym; info: TLineInfo; g: ModuleGraph): PSym =
|
||||||
result = newSym(skProc, getIdent(g.cache, "objDiscMapping"), t.owner, info)
|
result = newSym(skProc, getIdent(g.cache, "objDiscMapping"), t.owner, info)
|
||||||
|
|
||||||
|
|
@ -75,8 +81,7 @@ proc genCaseObjDiscMapping*(t: PType; field: PSym; info: TLineInfo; g: ModuleGra
|
||||||
var caseStmt = newNodeI(nkCaseStmt, info)
|
var caseStmt = newNodeI(nkCaseStmt, info)
|
||||||
caseStmt.add(newSymNode dest)
|
caseStmt.add(newSymNode dest)
|
||||||
|
|
||||||
let subObj = searchObjCase(t.n, field)
|
let subObj = searchObjCase(t, field)
|
||||||
doAssert subObj != nil
|
|
||||||
for i in 1..<subObj.len:
|
for i in 1..<subObj.len:
|
||||||
let ofBranch = subObj[i]
|
let ofBranch = subObj[i]
|
||||||
var newBranch = newNodeI(ofBranch.kind, ofBranch.info)
|
var newBranch = newNodeI(ofBranch.kind, ofBranch.info)
|
||||||
|
|
|
||||||
|
|
@ -31,3 +31,19 @@ var y = MyCaseObjectB(kind: A)
|
||||||
y.x = 1
|
y.x = 1
|
||||||
y.kind = C
|
y.kind = C
|
||||||
echo "no crash"
|
echo "no crash"
|
||||||
|
|
||||||
|
|
||||||
|
#################
|
||||||
|
## bug #12821
|
||||||
|
|
||||||
|
type
|
||||||
|
RefBaseObject* = ref object of RootObj
|
||||||
|
case kind: bool
|
||||||
|
of true: a: int
|
||||||
|
of false: b: float
|
||||||
|
|
||||||
|
MyRefObject = ref object of RefBaseObject
|
||||||
|
x: float
|
||||||
|
|
||||||
|
let z = new(MyRefObject)
|
||||||
|
z.kind = false
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue