fix js stacktraces, unify all file,line,col formatting into a single function (#14230)

* fix https://github.com/timotheecour/Nim/issues/135 ; unify all file,line,col formatting into a single function
This commit is contained in:
Timothee Cour 2020-05-05 05:56:15 -07:00 • committed by GitHub
commit c28a057a6b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 68 additions and 46 deletions

View file

@ -1,17 +1,17 @@
when not declared(sysFatal):
include "system/fatal"
import std/private/miscdollars
# ---------------------------------------------------------------------------
# helpers
type InstantiationInfo = tuple[filename: string, line: int, column: int]
proc `$`(x: int): string {.magic: "IntToStr", noSideEffect.}
proc `$`(info: InstantiationInfo): string =
# The +1 is needed here
# instead of overriding `$` (and changing its meaning), consider explicit name.
info.filename & "(" & $info.line & ", " & $(info.column+1) & ")"
result.toLocation(info.filename, info.line, info.column+1)
# ---------------------------------------------------------------------------

View file

@ -10,6 +10,8 @@
# Exception handling code. Carefully coded so that tiny programs which do not
# use the heap (and nor exceptions) do not include the GC or memory allocator.
import std/private/miscdollars
var
errorMessageWriter*: (proc(msg: string) {.tags: [WriteIOEffect], benign,
nimcall.})
@ -240,11 +242,7 @@ proc auxWriteStackTrace(f: PFrame; s: var seq[StackTraceEntry]) =
template addFrameEntry(s: var string, f: StackTraceEntry|PFrame) =
var oldLen = s.len
add(s, f.filename)
if f.line > 0:
add(s, '(')
add(s, $f.line)
add(s, ')')
s.toLocation(f.filename, f.line, 0)
for k in 1..max(1, 25-(s.len-oldLen)): add(s, ' ')
add(s, f.procname)
when NimStackTraceMsgs:

View file

@ -8,6 +8,7 @@
#
include system/indexerrors
import std/private/miscdollars
proc log*(s: cstring) {.importc: "console.log", varargs, nodecl.}
@ -70,7 +71,7 @@ proc getCurrentExceptionMsg*(): string =
proc auxWriteStackTrace(f: PCallFrame): string =
type
TempFrame = tuple[procname: cstring, line: int]
TempFrame = tuple[procname: cstring, line: int, filename: cstring]
var
it = f
i = 0
@ -79,6 +80,7 @@ proc auxWriteStackTrace(f: PCallFrame): string =
while it != nil and i <= high(tempFrames):
tempFrames[i].procname = it.procname
tempFrames[i].line = it.line
tempFrames[i].filename = it.filename
inc(i)
inc(total)
it = it.prev
@ -92,10 +94,9 @@ proc auxWriteStackTrace(f: PCallFrame): string =
add(result, $(total-i))
add(result, " calls omitted) ...\n")
for j in countdown(i-1, 0):
result.toLocation($tempFrames[j].filename, tempFrames[j].line, 0)
add(result, " at ")
add(result, tempFrames[j].procname)
if tempFrames[j].line > 0:
add(result, ", line: ")
add(result, $tempFrames[j].line)
add(result, "\n")
proc rawWriteStackTrace(): string =