summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorcooldome <ariabushenko@bk.ru>2018-06-10 23:27:45 +0100
committercooldome <ariabushenko@bk.ru>2018-06-10 23:27:45 +0100
commita65e9c0e2520911d16b81e7af47fea8c3fdd2958 (patch)
tree394894bbdf96fdffffd7328ca8194391d9e567c5
parent4d87d666ee12d9a16a0a3b21ab30b46f9e933cb0 (diff)
downloadNim-a65e9c0e2520911d16b81e7af47fea8c3fdd2958.tar.gz
fix comments
-rw-r--r--compiler/sigmatch.nim27
-rw-r--r--compiler/types.nim48
2 files changed, 52 insertions, 23 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index ec13b7557..bdae01d7d 100644
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -633,26 +633,21 @@ proc procTypeRel(c: var TCandidate, f, a: PType): TTypeRelation =
   else: discard
 
 proc typeRangeRel(f, a: PType): TTypeRelation {.noinline.} =
-  template check_range_in(t: typedesc): untyped = 
-    let
-      a0 = firstValue[t](a)
-      a1 = lastValue[t](a)
-      f0 = firstValue[t](f)
-      f1 = lastValue[t](f)
-    if a0 == f0 and a1 == f1:
-      result = isEqual
-    elif a0 >= f0 and a1 <= f1:
-      result = isConvertible
-    elif a0 <= f1 and f0 <= a1:
+  template check_range[T](a_first, a_last, f_first, f_last: T): TTypeRelation = 
+    if a_first == f_first and a_last == f_last:
+      isEqual
+    elif a_first >= f_first and a_last <= f_last:
+      isConvertible
+    elif a_first <= f_last and f_first <= a_last:
       # X..Y and C..D overlap iff (X <= D and C <= Y)
-      result = isConvertible
+      isConvertible
     else:
-      result = isNone
+      isNone
   
   if f.isOrdinalType: 
-    check_range_in(BiggestInt)
-  else:
-    check_range_in(BiggestFloat)
+    check_range(firstOrd(a), lastOrd(a), firstOrd(f), lastOrd(f))
+  else: 
+    check_range(firstFloat(a), lastFloat(a), firstFloat(f), lastFloat(f))
     
 
 proc matchUserTypeClass*(m: var TCandidate; ff, a: PType): PType =
diff --git a/compiler/types.nim b/compiler/types.nim
index 1fab842cc..83e20c38e 100644
--- a/compiler/types.nim
+++ b/compiler/types.nim
@@ -88,13 +88,16 @@ proc isPureObject*(typ: PType): bool =
 
 proc getOrdValue*(n: PNode): BiggestInt =
   case n.kind
-  of nkCharLit..nkUInt64Lit: result = n.intVal
-  of nkNilLit: result = 0
-  of nkHiddenStdConv: result = getOrdValue(n.sons[1])
-  else:
-    #localError(n.info, errOrdinalTypeExpected)
-    # XXX check usages of getOrdValue
-    result = high(BiggestInt)
+  of nkCharLit..nkUInt64Lit: n.intVal
+  of nkNilLit: 0
+  of nkHiddenStdConv: getOrdValue(n.sons[1])
+  else: high(BiggestInt)
+
+proc getFloatValue*(n: PNode): BiggestFloat =
+  case n.kind
+  of nkFloatLiterals: n.floatVal
+  of nkHiddenStdConv: getFloatValue(n.sons[1])
+  else: NaN
 
 proc isIntLit*(t: PType): bool {.inline.} =
   result = t.kind == tyInt and t.n != nil and t.n.kind == nkIntLit
@@ -623,6 +626,21 @@ proc firstOrd*(t: PType): BiggestInt =
     internalError(newPartialConfigRef(), "invalid kind for firstOrd(" & $t.kind & ')')
     result = 0
 
+
+proc firstFloat*(t: PType): BiggestFloat =
+  case t.kind
+  of tyFloat..tyFloat128: -Inf
+  of tyRange:
+    assert(t.n != nil)        # range directly given:
+    assert(t.n.kind == nkRange)
+    getFloatValue(t.n.sons[0])
+  of tyVar: firstFloat(t.sons[0])
+  of tyGenericInst, tyDistinct, tyTypeDesc, tyAlias, tyStatic, tyInferred:
+    firstFloat(lastSon(t))
+  else:
+    internalError(newPartialConfigRef(), "invalid kind for firstValue(" & $t.kind & ')')
+    NaN
+
 proc lastOrd*(t: PType; fixedUnsigned = false): BiggestInt =
   case t.kind
   of tyBool: result = 1
@@ -663,6 +681,22 @@ proc lastOrd*(t: PType; fixedUnsigned = false): BiggestInt =
     internalError(newPartialConfigRef(), "invalid kind for lastOrd(" & $t.kind & ')')
     result = 0
 
+
+proc lastFloat*(t: PType): BiggestFloat =
+  case t.kind
+  of tyFloat..tyFloat128: Inf
+  of tyVar: lastFloat(t.sons[0])
+  of tyRange:
+    assert(t.n != nil)        # range directly given:
+    assert(t.n.kind == nkRange)
+    getFloatValue(t.n.sons[1])
+  of tyGenericInst, tyDistinct, tyTypeDesc, tyAlias, tyStatic, tyInferred:
+    lastFloat(lastSon(t))
+  else:
+    internalError(newPartialConfigRef(), "invalid kind for lastOrd(" & $t.kind & ')')
+    NaN
+
+
 proc lengthOrd*(t: PType): BiggestInt =
   case t.kind
   of tyInt64, tyInt32, tyInt: result = lastOrd(t)