summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2013-10-31 13:43:19 -0700
committerAndreas Rumpf <rumpf_a@web.de>2013-10-31 13:43:19 -0700
commit528f972d176d578accddc10d12e6a825e061a042 (patch)
tree4b74ac1538b743eb6e264d58be58780433ea55e7 /compiler
parent2a1f8baac4daab34f2f613af23cd959505e89008 (diff)
parentf8206cb357d71d1aa274dddb8f2976c396c7de4b (diff)
downloadNim-528f972d176d578accddc10d12e6a825e061a042.tar.gz
Merge pull request #631 from mflamer/master
LockFree Hash Table 0.1
Diffstat (limited to 'compiler')
-rw-r--r--compiler/types.nim22
1 files changed, 13 insertions, 9 deletions
diff --git a/compiler/types.nim b/compiler/types.nim
index 66748c308..4dec9ea2f 100644
--- a/compiler/types.nim
+++ b/compiler/types.nim
@@ -808,11 +808,11 @@ proc SameTypeAux(x, y: PType, c: var TSameTypeClosure): bool =
       if containsOrIncl(c, a, b): return true
 
   proc sameFlags(a, b: PType): bool {.inline.} =
-    result = eqTypeFlags*a.flags == eqTypeFlags*b.flags
-    
+    result = eqTypeFlags*a.flags == eqTypeFlags*b.flags   
+
   if x == y: return true
   var a = skipTypes(x, {tyGenericInst})
-  var b = skipTypes(y, {tyGenericInst})
+  var b = skipTypes(y, {tyGenericInst})  
   assert(a != nil)
   assert(b != nil)
   if a.kind != b.kind:
@@ -824,7 +824,7 @@ proc SameTypeAux(x, y: PType, c: var TSameTypeClosure): bool =
       if a.kind != b.kind: return false
     of dcEqOrDistinctOf:
       while a.kind == tyDistinct: a = a.sons[0]
-      if a.kind != b.kind: return false
+      if a.kind != b.kind: return false  
   case a.Kind
   of tyEmpty, tyChar, tyBool, tyNil, tyPointer, tyString, tyCString,
      tyInt..tyBigNum, tyStmt:
@@ -837,15 +837,19 @@ proc SameTypeAux(x, y: PType, c: var TSameTypeClosure): bool =
       result = sameObjectStructures(a, b, c) and sameFlags(a, b)
   of tyDistinct:
     CycleCheck()
-    if c.cmp == dcEq: result = sameTypeAux(a, b, c) and sameFlags(a, b)
-    else: result = sameTypeAux(a.sons[0], b.sons[0], c) and sameFlags(a, b)
+    if c.cmp == dcEq:      
+      if sameFlags(a, b):
+        IfFastObjectTypeCheckFailed(a, b):
+          result = sameTypeAux(a.sons[0], b.sons[0], c)     
+    else: 
+      result = sameTypeAux(a.sons[0], b.sons[0], c) and sameFlags(a, b)
   of tyEnum, tyForward, tyProxy:
     # XXX generic enums do not make much sense, but require structural checking
     result = a.id == b.id and sameFlags(a, b)
   of tyTuple:
     CycleCheck()
     result = sameTuple(a, b, c) and sameFlags(a, b)
-  of tyGenericInst:
+  of tyGenericInst:    
     result = sameTypeAux(lastSon(a), lastSon(b), c)
   of tyTypeDesc:
     if c.cmp == dcEqIgnoreDistinct: result = false
@@ -858,7 +862,7 @@ proc SameTypeAux(x, y: PType, c: var TSameTypeClosure): bool =
      tyOpenArray, tySet, tyRef, tyPtr, tyVar, tyArrayConstr,
      tyArray, tyProc, tyConst, tyMutable, tyVarargs, tyIter,
      tyOrdinal, tyTypeClass:
-    CycleCheck()
+    CycleCheck()    
     result = sameChildrenAux(a, b, c) and sameFlags(a, b)
     if result and (a.kind == tyProc):
       result = a.callConv == b.callConv
@@ -867,7 +871,7 @@ proc SameTypeAux(x, y: PType, c: var TSameTypeClosure): bool =
     result = SameTypeOrNilAux(a.sons[0], b.sons[0], c) and
         SameValue(a.n.sons[0], b.n.sons[0]) and
         SameValue(a.n.sons[1], b.n.sons[1])
-  of tyNone: result = false
+  of tyNone: result = false  
 
 proc sameType*(x, y: PType): bool =
   var c = initSameTypeClosure()