bugfix for methods (comment in #185)
This commit is contained in:
parent
5f0bbb911f
commit
1c6870712b
2 changed files with 10 additions and 4 deletions
|
|
@ -36,6 +36,7 @@ proc methodCall*(n: PNode): PNode =
|
||||||
result = n
|
result = n
|
||||||
# replace ordinary method by dispatcher method:
|
# replace ordinary method by dispatcher method:
|
||||||
var disp = lastSon(result.sons[0].sym.ast).sym
|
var disp = lastSon(result.sons[0].sym.ast).sym
|
||||||
|
assert sfDispatcher in disp.flags
|
||||||
result.sons[0].sym = disp
|
result.sons[0].sym = disp
|
||||||
# change the arguments to up/downcasts to fit the dispatcher's parameters:
|
# change the arguments to up/downcasts to fit the dispatcher's parameters:
|
||||||
for i in countup(1, sonsLen(result)-1):
|
for i in countup(1, sonsLen(result)-1):
|
||||||
|
|
@ -99,6 +100,8 @@ proc methodDef*(s: PSym, fromCache: bool) =
|
||||||
if s.typ.sons[0] != nil:
|
if s.typ.sons[0] != nil:
|
||||||
disp.ast.sons[resultPos].sym = copySym(s.ast.sons[resultPos].sym)
|
disp.ast.sons[resultPos].sym = copySym(s.ast.sons[resultPos].sym)
|
||||||
attachDispatcher(s, newSymNode(disp))
|
attachDispatcher(s, newSymNode(disp))
|
||||||
|
# attach to itself to prevent bugs:
|
||||||
|
attachDispatcher(disp, newSymNode(disp))
|
||||||
|
|
||||||
proc relevantCol(methods: TSymSeq, col: int): bool =
|
proc relevantCol(methods: TSymSeq, col: int): bool =
|
||||||
# returns true iff the position is relevant
|
# returns true iff the position is relevant
|
||||||
|
|
|
||||||
|
|
@ -556,11 +556,14 @@ proc transformCall(c: PTransf, n: PNode): PTransNode =
|
||||||
inc(j)
|
inc(j)
|
||||||
add(result, a.ptransnode)
|
add(result, a.ptransnode)
|
||||||
if len(result) == 2: result = result[1]
|
if len(result) == 2: result = result[1]
|
||||||
elif n.sons[0].kind == nkSym and n.sons[0].sym.kind == skMethod:
|
|
||||||
# use the dispatcher for the call:
|
|
||||||
result = methodCall(transformSons(c, n).pnode).ptransNode
|
|
||||||
else:
|
else:
|
||||||
result = transformSons(c, n)
|
let s = transformSons(c, n).pnode
|
||||||
|
# bugfix: check after 'transformSons' if it's still a method call:
|
||||||
|
# use the dispatcher for the call:
|
||||||
|
if s.sons[0].kind == nkSym and s.sons[0].sym.kind == skMethod:
|
||||||
|
result = methodCall(s).ptransNode
|
||||||
|
else:
|
||||||
|
result = s.ptransNode
|
||||||
|
|
||||||
proc dontInlineConstant(orig, cnst: PNode): bool {.inline.} =
|
proc dontInlineConstant(orig, cnst: PNode): bool {.inline.} =
|
||||||
# symbols that expand to a complex constant (array, etc.) should not be
|
# symbols that expand to a complex constant (array, etc.) should not be
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue