diff options
Diffstat (limited to 'compiler/cgmeth.nim')
-rw-r--r-- | compiler/cgmeth.nim | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/compiler/cgmeth.nim b/compiler/cgmeth.nim index d2358b84a..312afec1a 100644 --- a/compiler/cgmeth.nim +++ b/compiler/cgmeth.nim @@ -18,8 +18,10 @@ proc genConv(n: PNode, d: PType, downcast: bool): PNode = var source = skipTypes(n.typ, abstractPtrs) if (source.kind == tyObject) and (dest.kind == tyObject): var diff = inheritanceDiff(dest, source) - if diff == high(int): internalError(n.info, "cgmeth.genConv") - if diff < 0: + if diff == high(int): + # no subtype relation, nothing to do + result = n + elif diff < 0: result = newNodeIT(nkObjUpConv, n.info, d) addSon(result, n) if downcast: internalError(n.info, "cgmeth.genConv: no upcast allowed") @@ -66,15 +68,16 @@ proc sameMethodBucket(a, b: PSym): MethodResult = bb = bb.lastSon else: break - if sameType(aa, bb): discard + if sameType(aa, bb): + if aa.kind == tyObject and result != Invalid: result = Yes elif aa.kind == tyObject and bb.kind == tyObject: let diff = inheritanceDiff(bb, aa) - if diff < 0: discard "Ok" + if diff < 0: + if result != Invalid: result = Yes elif diff != high(int): result = Invalid else: return No - if result != Invalid: result = Yes proc attachDispatcher(s: PSym, dispatcher: PNode) = var L = s.ast.len-1 @@ -231,7 +234,7 @@ proc genDispatcher(methods: TSymSeq, relevantCols: IntSet): PSym = curr.typ.sons[col], false)) var ret: PNode if base.typ.sons[0] != nil: - var a = newNodeI(nkAsgn, base.info) + var a = newNodeI(nkFastAsgn, base.info) addSon(a, newSymNode(base.ast.sons[resultPos].sym)) addSon(a, call) ret = newNodeI(nkReturnStmt, base.info) @@ -256,4 +259,3 @@ proc generateMethodDispatchers*(): PNode = sortBucket(gMethods[bucket].methods, relevantCols) addSon(result, newSymNode(genDispatcher(gMethods[bucket].methods, relevantCols))) - |