diff options
Diffstat (limited to 'compiler/semcall.nim')
-rwxr-xr-x | compiler/semcall.nim | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/compiler/semcall.nim b/compiler/semcall.nim index 962e4d3cc..0a5f19822 100755 --- a/compiler/semcall.nim +++ b/compiler/semcall.nim @@ -84,15 +84,34 @@ proc resolveOverloads(c: PContext, n, orig: PNode, getProcHeader(best.calleeSym), getProcHeader(alt.calleeSym), args]) -proc instantiateGenericConverters(c: PContext, n: PNode, x: TCandidate) {. - noinline.}= - for i in 1 .. <n.len: - var a = n.sons[i] - if a.kind == nkHiddenCallConv and a.sons[0].kind == nkSym and - isGenericRoutine(a.sons[0].sym): - let finalCallee = generateInstance(c, a.sons[0].sym, x.bindings, n.info) - a.sons[0].sym = finalCallee - a.sons[0].typ = finalCallee.typ + +proc instGenericConvertersArg*(c: PContext, a: PNode, x: TCandidate) = + if a.kind == nkHiddenCallConv and a.sons[0].kind == nkSym and + isGenericRoutine(a.sons[0].sym): + let finalCallee = generateInstance(c, a.sons[0].sym, x.bindings, a.info) + a.sons[0].sym = finalCallee + a.sons[0].typ = finalCallee.typ + #a.typ = finalCallee.typ.sons[0] + +proc instGenericConvertersSons*(c: PContext, n: PNode, x: TCandidate) = + assert n.kind in nkCallKinds + if x.genericConverter: + for i in 1 .. <n.len: + instGenericConvertersArg(c, n.sons[i], x) + +proc IndexTypesMatch(c: PContext, f, a: PType, arg: PNode): PNode = + var m: TCandidate + initCandidate(m, f) + result = paramTypesMatch(c, m, f, a, arg, nil) + if m.genericConverter and result != nil: + instGenericConvertersArg(c, result, m) + +proc ConvertTo*(c: PContext, f: PType, n: PNode): PNode = + var m: TCandidate + initCandidate(m, f) + result = paramTypesMatch(c, m, f, n.typ, n, nil) + if m.genericConverter and result != nil: + instGenericConvertersArg(c, result, m) proc semResolvedCall(c: PContext, n: PNode, x: TCandidate): PNode = assert x.state == csMatch @@ -111,8 +130,7 @@ proc semResolvedCall(c: PContext, n: PNode, x: TCandidate): PNode = if ContainsGenericType(result.typ): result.typ = errorType(c) return result = x.call - if x.genericConverter: - instantiateGenericConverters(c, result, x) + instGenericConvertersSons(c, result, x) result.sons[0] = newSymNode(finalCallee, result.sons[0].info) result.typ = finalCallee.typ.sons[0] |