the is operator now uses exactly the same algorithm as proc signature matching

This commit is contained in:
Zahary Karadjov
2014-01-26 00:45:50 +02:00
parent 3f71b7f1f6
commit 5a6030a16b
3 changed files with 11 additions and 22 deletions

View File

@@ -322,24 +322,13 @@ proc isOpImpl(c: PContext, n: PNode): PNode =
t.callConv == ccClosure and
tfIterator in t.flags))
else:
var match: bool
let t2 = n[2].typ.skipTypes({tyTypeDesc})
case t2.kind
of tyTypeClasses:
var m: TCandidate
initCandidate(c, m, t2)
match = typeRel(m, t2, t1) != isNone
of tyOrdinal:
var m: TCandidate
initCandidate(c, m, t2)
match = isOrdinalType(t1)
of tySequence, tyArray, tySet:
var m: TCandidate
initCandidate(c, m, t2)
match = typeRel(m, t2, t1) != isNone
else:
match = sameType(t1, t2)
var t2 = n[2].typ.skipTypes({tyTypeDesc})
let lifted = liftParamType(c, skType, newNodeI(nkArgList, n.info),
t2, ":anon", n.info)
if lifted != nil: t2 = lifted
var m: TCandidate
initCandidate(c, m, t2)
let match = typeRel(m, t2, t1) != isNone
result = newIntNode(nkIntLit, ord(match))
result.typ = n.typ

View File

@@ -820,7 +820,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
else:
return isNone
of tyUserTypeClassInst:
of tyUserTypeClass, tyUserTypeClassInst:
considerPreviousT:
result = matchUserTypeClass(c.c, c, f, a)
if result == isGeneric:

View File

@@ -192,7 +192,7 @@ when defined(Posix):
of AF_UNIX: result = posix.AF_UNIX
of AF_INET: result = posix.AF_INET
of AF_INET6: result = posix.AF_INET6
else: nil
else: discard
proc toInt(typ: TType): cint =
case typ
@@ -200,7 +200,7 @@ when defined(Posix):
of SOCK_DGRAM: result = posix.SOCK_DGRAM
of SOCK_SEQPACKET: result = posix.SOCK_SEQPACKET
of SOCK_RAW: result = posix.SOCK_RAW
else: nil
else: discard
proc toInt(p: TProtocol): cint =
case p
@@ -210,7 +210,7 @@ when defined(Posix):
of IPPROTO_IPV6: result = posix.IPPROTO_IPV6
of IPPROTO_RAW: result = posix.IPPROTO_RAW
of IPPROTO_ICMP: result = posix.IPPROTO_ICMP
else: nil
else: discard
else:
proc toInt(domain: TDomain): cint =