summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2016-12-19 11:35:45 +0100
committerAraq <rumpf_a@web.de>2016-12-19 11:35:45 +0100
commit237252f90cbea354ee7104388b174f0ed899803c (patch)
tree498e985bb160e21c79f5c7c84975e2e6b1cc819b
parent24239c23619e9d64562699b5d890fa2575e9c9cb (diff)
parentc130a2af17e0d5e948d21e6cb5bd0aca02ddb977 (diff)
downloadNim-237252f90cbea354ee7104388b174f0ed899803c.tar.gz
Merge branch 'devel' into sighashes
-rw-r--r--compiler/astalgo.nim2
-rw-r--r--compiler/cgen.nim25
-rw-r--r--compiler/evaltempl.nim21
-rw-r--r--compiler/sem.nim1
-rw-r--r--compiler/semfold.nim2
-rw-r--r--compiler/sigmatch.nim4
-rw-r--r--compiler/suggest.nim5
-rw-r--r--lib/pure/concurrency/cpuload.nim6
-rw-r--r--lib/system/alloc.nim24
-rw-r--r--tests/errmsgs/tdont_show_system.nim13
-rw-r--r--tests/errmsgs/tproper_stacktrace.nim11
-rw-r--r--tests/misc/tnot.nim4
-rw-r--r--tests/system/tdeepcopy.nim1
-rw-r--r--tests/system/trealloc.nim21
14 files changed, 115 insertions, 25 deletions
diff --git a/compiler/astalgo.nim b/compiler/astalgo.nim
index 7c07b2995..affbdffd9 100644
--- a/compiler/astalgo.nim
+++ b/compiler/astalgo.nim
@@ -386,6 +386,7 @@ proc debugTree(n: PNode, indent: int, maxRecDepth: int;
     var istr = rspaces(indent + 2)
     result = "{$N$1\"kind\": $2" %
              [istr, makeYamlString($n.kind)]
+    addf(result, ",$N$1\"info\": $2", [istr, lineInfoToStr(n.info)])
     if maxRecDepth != 0:
       case n.kind
       of nkCharLit..nkUInt64Lit:
@@ -418,7 +419,6 @@ proc debugTree(n: PNode, indent: int, maxRecDepth: int;
             addf(result, "$N$1$2", [rspaces(indent + 4), debugTree(n.sons[i],
                 indent + 4, maxRecDepth - 1, renderType)])
           addf(result, "$N$1]", [istr])
-    addf(result, ",$N$1\"info\": $2", [istr, lineInfoToStr(n.info)])
     addf(result, "$N$1}", [rspaces(indent)])
 
 proc debug(n: PSym) =
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index 082512753..0ca8e46fc 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -184,24 +184,27 @@ proc freshLineInfo(p: BProc; info: TLineInfo): bool =
     result = true
 
 proc genLineDir(p: BProc, t: PNode) =
-  let info = t.info
-  #if t.kind in nkCallKinds+{nkStmtListExpr} and t.len > 1: t[1].info
-  #else: t.info
-  var line = info.safeLineNm
+  var tt = t
+  #while tt.kind in {nkStmtListExpr}+nkCallKinds:
+  #  tt = tt.lastSon
+  if tt.kind in nkCallKinds and tt.len > 1:
+    tt = tt.sons[1]
+  let line = tt.info.safeLineNm
+
   if optEmbedOrigSrc in gGlobalOptions:
-    add(p.s(cpsStmts), ~"//" & info.sourceLine & rnl)
-  genCLineDir(p.s(cpsStmts), info.toFullPath, line)
+    add(p.s(cpsStmts), ~"//" & tt.info.sourceLine & rnl)
+  genCLineDir(p.s(cpsStmts), tt.info.toFullPath, line)
   if ({optStackTrace, optEndb} * p.options == {optStackTrace, optEndb}) and
       (p.prc == nil or sfPure notin p.prc.flags):
-    if freshLineInfo(p, info):
+    if freshLineInfo(p, tt.info):
       linefmt(p, cpsStmts, "#endb($1, $2);$n",
-              line.rope, makeCString(toFilename(info)))
+              line.rope, makeCString(toFilename(tt.info)))
   elif ({optLineTrace, optStackTrace} * p.options ==
       {optLineTrace, optStackTrace}) and
-      (p.prc == nil or sfPure notin p.prc.flags) and info.fileIndex >= 0:
-    if freshLineInfo(p, info):
+      (p.prc == nil or sfPure notin p.prc.flags) and tt.info.fileIndex >= 0:
+    if freshLineInfo(p, tt.info):
       linefmt(p, cpsStmts, "nimln($1, $2);$n",
-              line.rope, info.quotedFilename)
+              line.rope, tt.info.quotedFilename)
 
 proc postStmtActions(p: BProc) {.inline.} =
   add(p.s(cpsStmts), p.module.injectStmt)
diff --git a/compiler/evaltempl.nim b/compiler/evaltempl.nim
index 96ede44fd..87745f7ed 100644
--- a/compiler/evaltempl.nim
+++ b/compiler/evaltempl.nim
@@ -104,6 +104,25 @@ proc evalTemplateArgs(n: PNode, s: PSym; fromHlo: bool): PNode =
 var evalTemplateCounter* = 0
   # to prevent endless recursion in templates instantiation
 
+proc wrapInComesFrom*(info: TLineInfo; res: PNode): PNode =
+  when true:
+    result = res
+    result.info = info
+    if result.kind in {nkStmtList, nkStmtListExpr} and result.len > 0:
+      result.lastSon.info = info
+    when false:
+      # this hack is required to
+      var x = result
+      while x.kind == nkStmtListExpr: x = x.lastSon
+      if x.kind in nkCallKinds:
+        for i in 1..<x.len:
+          if x[i].kind in nkCallKinds:
+            x.sons[i].info = info
+  else:
+    result = newNodeI(nkPar, info)
+    result.add res
+    result.flags.incl nfNone
+
 proc evalTemplate*(n: PNode, tmpl, genSymOwner: PSym; fromHlo=false): PNode =
   inc(evalTemplateCounter)
   if evalTemplateCounter > 100:
@@ -132,5 +151,5 @@ proc evalTemplate*(n: PNode, tmpl, genSymOwner: PSym; fromHlo=false): PNode =
     #if ctx.instLines: result.info = n.info
     for i in countup(0, safeLen(body) - 1):
       evalTemplateAux(body.sons[i], args, ctx, result)
-
+  result = wrapInComesFrom(n.info, result)
   dec(evalTemplateCounter)
diff --git a/compiler/sem.nim b/compiler/sem.nim
index 7524d7388..755abec5d 100644
--- a/compiler/sem.nim
+++ b/compiler/sem.nim
@@ -369,6 +369,7 @@ proc semMacroExpr(c: PContext, n, nOrig: PNode, sym: PSym,
   result = evalMacroCall(c.module, c.cache, n, nOrig, sym)
   if efNoSemCheck notin flags:
     result = semAfterMacroCall(c, result, sym, flags)
+  result = wrapInComesFrom(nOrig.info, result)
   popInfoContext()
 
 proc forceBool(c: PContext, n: PNode): PNode =
diff --git a/compiler/semfold.nim b/compiler/semfold.nim
index 0f1138e04..39d84c0fa 100644
--- a/compiler/semfold.nim
+++ b/compiler/semfold.nim
@@ -769,7 +769,7 @@ proc getConstExpr(m: PSym, n: PNode): PNode =
   of nkCast:
     var a = getConstExpr(m, n.sons[1])
     if a == nil: return
-    if n.typ.kind in NilableTypes:
+    if n.typ != nil and n.typ.kind in NilableTypes:
       # we allow compile-time 'cast' for pointer types:
       result = a
       result.typ = n.typ
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index 16358b1a8..a94579339 100644
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -172,7 +172,9 @@ proc sumGeneric(t: PType): int =
       inc result
     of tyGenericInvocation, tyTuple, tyProc:
       result += ord(t.kind == tyGenericInvocation)
-      for i in 0 .. <t.len: result += t.sons[i].sumGeneric
+      for i in 0 .. <t.len:
+        if t.sons[i] != nil:
+          result += t.sons[i].sumGeneric
       break
     of tyGenericParam, tyExpr, tyStatic, tyStmt: break
     of tyAlias: t = t.lastSon
diff --git a/compiler/suggest.nim b/compiler/suggest.nim
index 888e80085..958dfe50e 100644
--- a/compiler/suggest.nim
+++ b/compiler/suggest.nim
@@ -57,10 +57,11 @@ proc symToSuggest(s: PSym, isLocal: bool, section: string, li: TLineInfo;
     result.qualifiedPath = @[]
     if not isLocal and s.kind != skModule:
       let ow = s.owner
-      if ow.kind != skModule and ow.owner != nil:
+      if ow != nil and ow.kind != skModule and ow.owner != nil:
         let ow2 = ow.owner
         result.qualifiedPath.add(ow2.origModuleName)
-      result.qualifiedPath.add(ow.origModuleName)
+      if ow != nil:
+        result.qualifiedPath.add(ow.origModuleName)
     result.qualifiedPath.add(s.name.s)
 
     if s.typ != nil:
diff --git a/lib/pure/concurrency/cpuload.nim b/lib/pure/concurrency/cpuload.nim
index b0fd002ed..db5f47407 100644
--- a/lib/pure/concurrency/cpuload.nim
+++ b/lib/pure/concurrency/cpuload.nim
@@ -45,12 +45,12 @@ proc advice*(s: var ThreadPoolState): ThreadPoolAdvice =
         procKernelDiff = procKernel - s.prevProcKernel
         procUserDiff = procUser - s.prevProcUser
 
-        sysTotal = int(sysKernelDiff + sysUserDiff)
-        procTotal = int(procKernelDiff + procUserDiff)
+        sysTotal = sysKernelDiff + sysUserDiff
+        procTotal = procKernelDiff + procUserDiff
       # total CPU usage < 85% --> create a new worker thread.
       # Measurements show that 100% and often even 90% is not reached even
       # if all my cores are busy.
-      if sysTotal == 0 or procTotal / sysTotal < 0.85:
+      if sysTotal == 0 or procTotal.float / sysTotal.float < 0.85:
         result = doCreateThread
     s.prevSysKernel = sysKernel
     s.prevSysUser = sysUser
diff --git a/lib/system/alloc.nim b/lib/system/alloc.nim
index 3a8e8a1b6..5b0955132 100644
--- a/lib/system/alloc.nim
+++ b/lib/system/alloc.nim
@@ -100,7 +100,8 @@ type
     freeChunksList: PBigChunk # XXX make this a datastructure with O(1) access
     chunkStarts: IntSet
     root, deleted, last, freeAvlNodes: PAvlNode
-    locked: bool # if locked, we cannot free pages.
+    locked, blockChunkSizeIncrease: bool # if locked, we cannot free pages.
+    nextChunkSize: int
 {.deprecated: [TLLChunk: LLChunk, TAvlNode: AvlNode, TMemRegion: MemRegion].}
 
 # shared:
@@ -275,9 +276,25 @@ proc pageAddr(p: pointer): PChunk {.inline.} =
   #sysAssert(Contains(allocator.chunkStarts, pageIndex(result)))
 
 proc requestOsChunks(a: var MemRegion, size: int): PBigChunk =
+  if not a.blockChunkSizeIncrease:
+    a.nextChunkSize =
+      if a.currMem < 64 * 1024: PageSize*4
+      else: a.nextChunkSize*2
+  var size = size
+
+  if size > a.nextChunkSize:
+    result = cast[PBigChunk](osAllocPages(size))
+  else:
+    result = cast[PBigChunk](osTryAllocPages(a.nextChunkSize))
+    if result == nil:
+      result = cast[PBigChunk](osAllocPages(size))
+      a.blockChunkSizeIncrease = true
+    else:
+      size = a.nextChunkSize
+
   incCurrMem(a, size)
   inc(a.freeMem, size)
-  result = cast[PBigChunk](osAllocPages(size))
+
   sysAssert((cast[ByteAddress](result) and PageMask) == 0, "requestOsChunks 1")
   #zeroMem(result, size)
   result.next = nil
@@ -432,6 +449,9 @@ proc getBigChunk(a: var MemRegion, size: int): PBigChunk =
       splitChunk(a, result, size)
     else:
       result = requestOsChunks(a, size)
+      # if we over allocated split the chunk:
+      if result.size > size:
+        splitChunk(a, result, size)
   result.prevSize = 0 # XXX why is this needed?
   result.used = true
   incl(a, a.chunkStarts, pageIndex(result))
diff --git a/tests/errmsgs/tdont_show_system.nim b/tests/errmsgs/tdont_show_system.nim
new file mode 100644
index 000000000..6963a8a3f
--- /dev/null
+++ b/tests/errmsgs/tdont_show_system.nim
@@ -0,0 +1,13 @@
+discard """
+  errormsg: "value of type 'bool' has to be discarded"
+  line: 13
+  file: "tdont_show_system.nim"
+"""
+
+# bug #4308
+
+#proc getGameTile: int =
+#  1 > 0
+
+# bug #4905  subsumes the problem of #4308:
+true notin {false}
diff --git a/tests/errmsgs/tproper_stacktrace.nim b/tests/errmsgs/tproper_stacktrace.nim
new file mode 100644
index 000000000..57e65fa6f
--- /dev/null
+++ b/tests/errmsgs/tproper_stacktrace.nim
@@ -0,0 +1,11 @@
+discard """
+  outputsub: '''tproper_stacktrace.nim(7) tproper_stacktrace'''
+  exitcode: 1
+"""
+
+template fuzzy(x) =
+  echo x[] != 9
+
+var p: ptr int
+fuzzy p
+
diff --git a/tests/misc/tnot.nim b/tests/misc/tnot.nim
index 8c75c6bc0..5c268981e 100644
--- a/tests/misc/tnot.nim
+++ b/tests/misc/tnot.nim
@@ -1,6 +1,6 @@
 discard """
-  tfile: "tnot.nim"
-  tline: 14
+  file: "tnot.nim"
+  line: 14
   errormsg: "type mismatch"
 """
 # BUG: following compiles, but should not:
diff --git a/tests/system/tdeepcopy.nim b/tests/system/tdeepcopy.nim
index 5a582425a..f7a6e87fa 100644
--- a/tests/system/tdeepcopy.nim
+++ b/tests/system/tdeepcopy.nim
@@ -1,6 +1,5 @@
 discard """
   output: "ok"
-  disabled: "true"
 """
 
 import tables, lists
diff --git a/tests/system/trealloc.nim b/tests/system/trealloc.nim
new file mode 100644
index 000000000..dc5f712d6
--- /dev/null
+++ b/tests/system/trealloc.nim
@@ -0,0 +1,21 @@
+discard """
+  output: '''success'''
+"""
+
+# bug #4818
+
+# Test that this completes without OOM.
+
+const BUFFER_SIZE = 5000
+var buffer = cast[ptr uint16](alloc(BUFFER_SIZE))
+
+var total_size: int64 = 0
+for i in 0 .. 4000:
+    let size = BUFFER_SIZE * i
+    #echo "requesting ", size
+    total_size += size.int64
+    buffer = cast[ptr uint16](realloc(buffer, size))
+    #echo totalSize, " total: ", getTotalMem(), " occupied: ", getOccupiedMem(), " free: ", getFreeMem()
+
+dealloc(buffer)
+echo "success"