diff options
-rwxr-xr-x | compiler/ccgexprs.nim | 5 | ||||
-rwxr-xr-x | compiler/ccgtypes.nim | 7 | ||||
-rwxr-xr-x | compiler/semtypes.nim | 5 | ||||
-rwxr-xr-x | lib/system.nim | 4 | ||||
-rwxr-xr-x | lib/system/alloc.nim | 6 | ||||
-rwxr-xr-x | lib/system/assign.nim | 34 | ||||
-rwxr-xr-x | lib/system/debugger.nim | 16 | ||||
-rwxr-xr-x | lib/system/excpt.nim | 21 | ||||
-rwxr-xr-x | lib/system/repr.nim | 4 | ||||
-rwxr-xr-x | lib/wrappers/openssl.nim | 2 | ||||
-rwxr-xr-x | packages/docutils/rst.nim | 19 | ||||
-rwxr-xr-x | tests/run/trepr.nim | 11 |
12 files changed, 101 insertions, 33 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index d6666d88b..72d95c4c7 100755 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1036,6 +1036,9 @@ proc genOf(p: BProc, x: PNode, typ: PType, d: var TLoc) = while (t.kind == tyObject) and (t.sons[0] != nil): app(r, ".Sup") t = skipTypes(t.sons[0], typedescInst) + if isObjLackingTypeField(t): + GlobalError(x.info, errGenerated, + "no 'of' operator available for pure objects") if nilCheck != nil: r = ropecg(p.module, "(($1) && #isObj($2.m_type, $3))", [nilCheck, r, genTypeInfo(p.module, dest)]) @@ -1597,7 +1600,7 @@ proc upConv(p: BProc, n: PNode, d: var TLoc) = var a: TLoc initLocExpr(p, n.sons[0], a) var dest = skipTypes(n.typ, abstractPtrs) - if optObjCheck in p.options and not isPureObject(dest): + if optObjCheck in p.options and not isObjLackingTypeField(dest): var r = rdLoc(a) var nilCheck: PRope = nil var t = skipTypes(a.t, abstractInst) diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 0ab4ff200..0495c33fb 100755 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -694,11 +694,14 @@ when false: var tmp = getNimType(m) appf(m.s[cfsTypeInit2], "$2 = &$1;$n", [tmp, name]) +proc isObjLackingTypeField(typ: PType): bool {.inline.} = + result = (typ.kind == tyObject) and ((tfFinal in typ.flags) and + (typ.sons[0] == nil) or isPureObject(typ)) + proc genTypeInfoAuxBase(m: BModule, typ: PType, name, base: PRope) = var nimtypeKind: int #allocMemTI(m, typ, name) - if (typ.kind == tyObject) and (tfFinal in typ.flags) and - (typ.sons[0] == nil): + if isObjLackingTypeField(typ): nimtypeKind = ord(tyPureObject) else: nimtypeKind = ord(typ.kind) diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index c41727b10..f3a76913d 100755 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -856,7 +856,10 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType = result = s.typ else: assignType(prev, s.typ) - prev.id = s.typ.id + # bugfix: keep the fresh id for aliases to integral types: + if s.typ.kind notin {tyBool, tyChar, tyInt..tyInt64, tyFloat..tyFloat128, + tyUInt..tyUInt64}: + prev.id = s.typ.id result = prev of nkSym: if n.sym.kind == skType and n.sym.typ != nil: diff --git a/lib/system.nim b/lib/system.nim index e35d2914f..4a1bde56a 100755 --- a/lib/system.nim +++ b/lib/system.nim @@ -1961,11 +1961,11 @@ when not defined(EcmaScript) and not defined(NimrodVM): ## for debug builds. when hostOS != "standalone": proc getStackTrace*(): string - ## gets the current stack trace. This is only works for debug builds. + ## gets the current stack trace. This only works for debug builds. proc getStackTrace*(e: ref E_Base): string ## gets the stack trace associated with `e`, which is the stack that - ## lead to the ``raise`` statement. This is only works for debug builds. + ## lead to the ``raise`` statement. This only works for debug builds. {.push stack_trace: off, profiler:off.} when hostOS == "standalone": diff --git a/lib/system/alloc.nim b/lib/system/alloc.nim index bcc70b853..127df755e 100755 --- a/lib/system/alloc.nim +++ b/lib/system/alloc.nim @@ -553,7 +553,7 @@ proc rawAlloc(a: var TMemRegion, requestedSize: int): pointer = sysAssert(allocInv(a), "rawAlloc: before listRemove test") ListRemove(a.freeSmallChunks[s], c) sysAssert(allocInv(a), "rawAlloc: end listRemove test") - sysAssert(((cast[TAddress](result) and PageMask) -% smallChunkOverhead()) %% + sysAssert(((cast[TAddress](result) and PageMask) - smallChunkOverhead()) %% size == 0, "rawAlloc 21") sysAssert(allocInv(a), "rawAlloc: end small size") else: @@ -582,7 +582,7 @@ proc rawDealloc(a: var TMemRegion, p: pointer) = # `p` is within a small chunk: var c = cast[PSmallChunk](c) var s = c.size - sysAssert(((cast[TAddress](p) and PageMask) -% smallChunkOverhead()) %% + sysAssert(((cast[TAddress](p) and PageMask) - smallChunkOverhead()) %% s == 0, "rawDealloc 3") var f = cast[ptr TFreeCell](p) #echo("setting to nil: ", $cast[TAddress](addr(f.zeroField))) @@ -605,7 +605,7 @@ proc rawDealloc(a: var TMemRegion, p: pointer) = ListRemove(a.freeSmallChunks[s div memAlign], c) c.size = SmallChunkSize freeBigChunk(a, cast[PBigChunk](c)) - sysAssert(((cast[TAddress](p) and PageMask) -% smallChunkOverhead()) %% + sysAssert(((cast[TAddress](p) and PageMask) - smallChunkOverhead()) %% s == 0, "rawDealloc 2") else: # set to 0xff to check for usage after free bugs: diff --git a/lib/system/assign.nim b/lib/system/assign.nim index cd4a34f6c..4b8d2033d 100755 --- a/lib/system/assign.nim +++ b/lib/system/assign.nim @@ -60,7 +60,7 @@ proc genericAssignAux(dest, src: Pointer, mt: PNimType, shallow: bool) = unsureAsgnRef(x, s2) return sysAssert(dest != nil, "genericAssignAux 3") - unsureAsgnRef(x, newObj(mt, seq.len * mt.base.size + GenericSeqSize)) + unsureAsgnRef(x, newSeq(mt, seq.len)) var dst = cast[taddress](cast[ppointer](dest)[]) for i in 0..seq.len-1: genericAssignAux( @@ -68,9 +68,6 @@ proc genericAssignAux(dest, src: Pointer, mt: PNimType, shallow: bool) = cast[pointer](cast[taddress](s2) +% i *% mt.base.size +% GenericSeqSize), mt.Base, shallow) - var dstseq = cast[PGenericSeq](dst) - dstseq.len = seq.len - dstseq.reserved = seq.len of tyObject: # we need to copy m_type field for tyObject, as it could be empty for # sequence reallocations: @@ -98,6 +95,35 @@ proc genericShallowAssign(dest, src: Pointer, mt: PNimType) {.compilerProc.} = genericAssignAux(dest, src, mt, true) GC_enable() +when false: + proc debugNimType(t: PNimType) = + if t.isNil: + cprintf("nil!") + return + var k: cstring + case t.kind + of tyBool: k = "bool" + of tyChar: k = "char" + of tyEnum: k = "enum" + of tyArray: k = "array" + of tyObject: k = "object" + of tyTuple: k = "tuple" + of tyRange: k = "range" + of tyPtr: k = "ptr" + of tyRef: k = "ref" + of tyVar: k = "var" + of tySequence: k = "seq" + of tyProc: k = "proc" + of tyPointer: k = "range" + of tyOpenArray: k = "openarray" + of tyString: k = "string" + of tyCString: k = "cstring" + of tyInt: k = "int" + of tyInt32: k = "int32" + else: k = "other" + cprintf("%s %ld\n", k, t.size) + debugNimType(t.base) + proc genericSeqAssign(dest, src: Pointer, mt: PNimType) {.compilerProc.} = var src = src # ugly, but I like to stress the parser sometimes :-) genericAssign(dest, addr(src), mt) diff --git a/lib/system/debugger.nim b/lib/system/debugger.nim index 37995d919..2add37740 100755 --- a/lib/system/debugger.nim +++ b/lib/system/debugger.nim @@ -664,6 +664,9 @@ proc dbgRegisterWatchpoint(address: pointer, name: cstring, Watchpoints[L].oldValue = genericHash(address, typ) inc WatchpointsLen +proc dbgUnregisterWatchpoints*() = + WatchpointsLen = 0 + proc dbgWriteStackTrace(f: PFrame) = const firstCalls = 32 @@ -706,15 +709,22 @@ proc dbgWriteStackTrace(f: PFrame) = write(stdout, tempFrames[j].procname) write(stdout, "\n") +proc strstr(s1, s2: cstring): cstring {.importc, header: "<string.h>".} + +proc interestingFilename(filename: cstring): bool = + #result = strstr(filename, "/rst.nim") == nil + result = true + proc checkWatchpoints = let L = WatchpointsLen for i in 0.. <L: let newHash = genericHash(Watchpoints[i].address, Watchpoints[i].typ) if newHash != Watchpoints[i].oldValue: - dbgWriteStackTrace(framePtr) - debugOut(Watchpoints[i].name) + if interestingFilename(framePtr.filename): + dbgWriteStackTrace(framePtr) + debugOut(Watchpoints[i].name) Watchpoints[i].oldValue = newHash - + proc endb(line: int) {.compilerproc.} = # This proc is called before every Nimrod code line! # Thus, it must have as few parameters as possible to keep the diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim index 204fba376..aedb0ef4b 100755 --- a/lib/system/excpt.nim +++ b/lib/system/excpt.nim @@ -192,11 +192,7 @@ proc quitOrDebug() {.inline.} = else: endbStep() # call the debugger -proc raiseException(e: ref E_Base, ename: CString) {.compilerRtl.} = - e.name = ename - when hasSomeStackTrace: - e.trace = "" - rawWriteStackTrace(e.trace) +proc raiseExceptionAux(e: ref E_Base) = if localRaiseHook != nil: if not localRaiseHook(e): return if globalRaiseHook != nil: @@ -205,7 +201,7 @@ proc raiseException(e: ref E_Base, ename: CString) {.compilerRtl.} = pushCurrentException(e) c_longjmp(excHandler.context, 1) elif e[] of EOutOfMemory: - writeToStdErr(ename) + writeToStdErr(e.name) quitOrDebug() else: when hasSomeStackTrace: @@ -214,7 +210,7 @@ proc raiseException(e: ref E_Base, ename: CString) {.compilerRtl.} = add(buf, "Error: unhandled exception: ") if not isNil(e.msg): add(buf, e.msg) add(buf, " [") - add(buf, $ename) + add(buf, $e.name) add(buf, "]\n") writeToStdErr(buf) else: @@ -230,16 +226,23 @@ proc raiseException(e: ref E_Base, ename: CString) {.compilerRtl.} = add(buf, "Error: unhandled exception: ") if not isNil(e.msg): add(buf, e.msg) add(buf, " [") - xadd(buf, ename, c_strlen(ename)) + xadd(buf, e.name, c_strlen(e.name)) add(buf, "]\n") writeToStdErr(buf) quitOrDebug() +proc raiseException(e: ref E_Base, ename: CString) {.compilerRtl.} = + e.name = ename + when hasSomeStackTrace: + e.trace = "" + rawWriteStackTrace(e.trace) + raiseExceptionAux(e) + proc reraiseException() {.compilerRtl.} = if currException == nil: raise newException(ENoExceptionToReraise, "no exception to reraise") else: - raiseException(currException, currException.name) + raiseExceptionAux(currException) proc WriteStackTrace() = when hasSomeStackTrace: diff --git a/lib/system/repr.nim b/lib/system/repr.nim index 028887b4c..3c9ce73ac 100755 --- a/lib/system/repr.nim +++ b/lib/system/repr.nim @@ -185,7 +185,11 @@ when not defined(useNimRtl): proc reprRecord(result: var string, p: pointer, typ: PNimType, cl: var TReprClosure) = add result, "[" + let oldLen = result.len reprRecordAux(result, p, typ.node, cl) + if typ.base != nil: + if oldLen != result.len: add result, ",\n" + reprRecordAux(result, p, typ.base.node, cl) add result, "]" proc reprRef(result: var string, p: pointer, typ: PNimType, diff --git a/lib/wrappers/openssl.nim b/lib/wrappers/openssl.nim index 5e541cc6b..1063f401d 100755 --- a/lib/wrappers/openssl.nim +++ b/lib/wrappers/openssl.nim @@ -45,7 +45,7 @@ when defined(WINDOWS): DLLUtilName = "libeay32.dll" else: const - versions = "(|.0.9.9|.0.9.8|.0.9.7|.0.9.6|.0.9.5|.0.9.4|.0.9.3|.0.9.2)" + versions = "(|.1.0.0|.0.9.9|.0.9.8|.0.9.7|.0.9.6|.0.9.5|.0.9.4)" when defined(posix): const DLLSSLName = "libssl.so" & versions diff --git a/packages/docutils/rst.nim b/packages/docutils/rst.nim index debbd2520..7507e1596 100755 --- a/packages/docutils/rst.nim +++ b/packages/docutils/rst.nim @@ -318,13 +318,18 @@ proc rstMessage(p: TRstParser, msgKind: TMsgKind) = p.col + p.tok[p.idx].col, msgKind, p.tok[p.idx].symbol) +when false: + proc corrupt(p: TRstParser) = + assert p.indentStack[0] == 0 + for i in 1 .. high(p.indentStack): assert p.indentStack[i] < 1_000 + proc currInd(p: TRstParser): int = result = p.indentStack[high(p.indentStack)] proc pushInd(p: var TRstParser, ind: int) = add(p.indentStack, ind) -proc popInd(p: var TRstParser) = +proc popInd(p: var TRstParser) = if len(p.indentStack) > 1: setlen(p.indentStack, len(p.indentStack) - 1) proc initParser(p: var TRstParser, sharedState: PSharedState) = @@ -616,8 +621,8 @@ when false: proc isURL(p: TRstParser, i: int): bool = result = (p.tok[i+1].symbol == ":") and (p.tok[i+2].symbol == "//") and - (p.tok[i+3].kind == tkWord) and - (p.tok[i].symbol in ["http", "ftp", "gopher", "telnet", "file"]) + (p.tok[i+3].kind == tkWord) and + (p.tok[i].symbol in ["http", "https", "ftp", "telnet", "file"]) proc parseURL(p: var TRstParser, father: PRstNode) = #if p.tok[p.idx].symbol[strStart] == '<': @@ -1062,7 +1067,7 @@ proc parseParagraph(p: var TRstParser, result: PRstNode) = parseInline(p, result) of tkWhite, tkWord, tkAdornment, tkOther: parseInline(p, result) - else: break + else: break proc parseHeadline(p: var TRstParser): PRstNode = result = newRstNode(rnHeadline) @@ -1308,9 +1313,8 @@ proc parseSection(p: var TRstParser, result: PRstNode) = popInd(p) else: leave = true - break - if leave: break - if p.tok[p.idx].kind == tkEof: break + break + if leave or p.tok[p.idx].kind == tkEof: break var a: PRstNode = nil var k = whichSection(p) case k @@ -1361,6 +1365,7 @@ proc parseDoc(p: var TRstParser): PRstNode = isAllocatedPtr(cast[pointer](p.tok[i].symbol)) echo "index: ", p.idx, " length: ", high(p.tok), "##", p.tok[p.idx-1], p.tok[p.idx], p.tok[p.idx+1] + #assert isAllocatedPtr(cast[pointer](p.indentStack)) rstMessage(p, meGeneralParseError) type diff --git a/tests/run/trepr.nim b/tests/run/trepr.nim index 622c9c78a..41c830621 100755 --- a/tests/run/trepr.nim +++ b/tests/run/trepr.nim @@ -11,6 +11,17 @@ var val = {a, b} stdout.write(repr(val)) stdout.writeln(repr({'a'..'z', 'A'..'Z'})) +type + TObj {.pure, inheritable.} = object + data: int + TFoo = ref object of TObj + d2: float +var foo: TFoo +new(foo) + +when false: + # cannot capture this output as it contains a memory address :-/ + echo foo.repr #var testseq: seq[string] = @[ # "a", "b", "c", "d", "e" #] |