diff options
-rw-r--r-- | compiler/ccgexprs.nim | 2 | ||||
-rw-r--r-- | compiler/commands.nim | 49 | ||||
-rw-r--r-- | compiler/liftdestructors.nim | 4 | ||||
-rw-r--r-- | compiler/semtypes.nim | 2 | ||||
-rw-r--r-- | lib/core/strs.nim | 49 | ||||
-rw-r--r-- | lib/system.nim | 2 | ||||
-rw-r--r-- | lib/system/gc_ms.nim | 2 |
7 files changed, 31 insertions, 79 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index ea4cd4aca..0ab592a50 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2028,7 +2028,7 @@ proc genMove(p: BProc; n: PNode; d: var TLoc) = resetLoc(p, a) proc genDestroy(p: BProc; n: PNode) = - if optNimV2 in p.config.globalOptions: + if p.config.selectedGC == gcDestructors: let arg = n[1].skipAddr let t = arg.typ.skipTypes(abstractInst) case t.kind diff --git a/compiler/commands.nim b/compiler/commands.nim index 5b6f3ac0f..1123996c1 100644 --- a/compiler/commands.nim +++ b/compiler/commands.nim @@ -437,30 +437,31 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo; processOnOffSwitchG(conf, {optWholeProject}, arg, pass, info) of "gc": expectArg(conf, switch, arg, pass, info) - case arg.normalize - of "boehm": - conf.selectedGC = gcBoehm - defineSymbol(conf.symbols, "boehmgc") - of "refc": - conf.selectedGC = gcRefc - of "v2": - message(conf, info, warnDeprecated, "--gc:v2 is deprecated; using default gc") - of "markandsweep": - conf.selectedGC = gcMarkAndSweep - defineSymbol(conf.symbols, "gcmarkandsweep") - of "destructors": - conf.selectedGC = gcDestructors - defineSymbol(conf.symbols, "gcdestructors") - of "go": - conf.selectedGC = gcGo - defineSymbol(conf.symbols, "gogc") - of "none": - conf.selectedGC = gcNone - defineSymbol(conf.symbols, "nogc") - of "stack", "regions": - conf.selectedGC= gcRegions - defineSymbol(conf.symbols, "gcregions") - else: localError(conf, info, errNoneBoehmRefcExpectedButXFound % arg) + if pass in {passCmd2, passPP}: + case arg.normalize + of "boehm": + conf.selectedGC = gcBoehm + defineSymbol(conf.symbols, "boehmgc") + of "refc": + conf.selectedGC = gcRefc + of "v2": + message(conf, info, warnDeprecated, "--gc:v2 is deprecated; using default gc") + of "markandsweep": + conf.selectedGC = gcMarkAndSweep + defineSymbol(conf.symbols, "gcmarkandsweep") + of "destructors": + conf.selectedGC = gcDestructors + defineSymbol(conf.symbols, "gcdestructors") + of "go": + conf.selectedGC = gcGo + defineSymbol(conf.symbols, "gogc") + of "none": + conf.selectedGC = gcNone + defineSymbol(conf.symbols, "nogc") + of "stack", "regions": + conf.selectedGC= gcRegions + defineSymbol(conf.symbols, "gcregions") + else: localError(conf, info, errNoneBoehmRefcExpectedButXFound % arg) of "warnings", "w": if processOnOffSwitchOrList(conf, {optWarns}, arg, pass, info): listWarnings(conf) of "warning": processSpecificNote(arg, wWarning, pass, info, switch, conf) diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index 71f0baecf..3574adca0 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -129,7 +129,7 @@ proc newDeepCopyCall(op: PSym; x, y: PNode): PNode = result = newAsgnStmt(x, newOpCall(op, y)) proc useNoGc(c: TLiftCtx; t: PType): bool {.inline.} = - result = optNimV2 in c.g.config.globalOptions and + result = c.g.config.selectedGC == gcDestructors and ({tfHasGCedMem, tfHasOwned} * t.flags != {} or t.isGCedMem) proc instantiateGeneric(c: var TLiftCtx; op: PSym; t, typeInst: PType): PSym = @@ -563,7 +563,7 @@ proc produceSym(g: ModuleGraph; c: PContext; typ: PType; kind: TTypeAttachedOp; typ.attachedOps[kind] = result var tk: TTypeKind - if optNimV2 in g.config.globalOptions: + if g.config.selectedGC == gcDestructors: tk = skipTypes(typ, {tyOrdinal, tyRange, tyInferred, tyGenericInst, tyStatic, tyAlias, tySink}).kind else: tk = tyNone # no special casing for strings and seqs diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 9fec57b15..41d7f0d19 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -1653,7 +1653,7 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType = of mSet: result = semSet(c, n, prev) of mOrdinal: result = semOrdinal(c, n, prev) of mSeq: - if c.config.selectedGC == gcDestructors and optNimV2 notin c.config.globalOptions: + if false: # c.config.selectedGC == gcDestructors and optNimV2 notin c.config.globalOptions: let s = c.graph.sysTypes[tySequence] assert s != nil assert prev == nil diff --git a/lib/core/strs.nim b/lib/core/strs.nim index 92c39331f..3b7a46ff1 100644 --- a/lib/core/strs.nim +++ b/lib/core/strs.nim @@ -9,20 +9,6 @@ ## Default new string implementation used by Nim's core. -when false: - # these are to be implemented or changed in the code generator. - - #proc rawNewStringNoInit(space: int): NimString {.compilerproc.} - # seems to be unused. - proc copyDeepString(src: NimString): NimString {.inline.} - # ----------------- sequences ---------------------------------------------- - - proc incrSeqV3(s: PGenericSeq, typ: PNimType): PGenericSeq {.compilerproc.} - proc setLengthSeqV2(s: PGenericSeq, typ: PNimType, newLen: int): PGenericSeq {. - compilerRtl.} - proc newSeq(typ: PNimType, len: int): pointer {.compilerRtl.} - proc newSeqRC1(typ: PNimType, len: int): pointer {.compilerRtl.} - import allocators type @@ -45,41 +31,6 @@ template frees(s) = if not isLiteral(s): s.p.allocator.dealloc(s.p.allocator, s.p, contentSize(s.p.cap)) -when not defined(nimV2): - proc `=destroy`(s: var string) = - var a = cast[ptr NimStringV2](addr s) - frees(a) - a.len = 0 - a.p = nil - - proc `=sink`(x: var string, y: string) = - var a = cast[ptr NimStringV2](addr x) - var b = cast[ptr NimStringV2](unsafeAddr y) - # we hope this is optimized away for not yet alive objects: - if unlikely(a.p == b.p): return - frees(a) - a.len = b.len - a.p = b.p - - proc `=`(x: var string, y: string) = - var a = cast[ptr NimStringV2](addr x) - var b = cast[ptr NimStringV2](unsafeAddr y) - if unlikely(a.p == b.p): return - frees(a) - a.len = b.len - if isLiteral(b): - # we can shallow copy literals: - a.p = b.p - else: - let allocator = if a.p != nil and a.p.allocator != nil: a.p.allocator else: getLocalAllocator() - # we have to allocate the 'cap' here, consider - # 'let y = newStringOfCap(); var x = y' - # on the other hand... These get turned into moves now. - a.p = cast[ptr NimStrPayload](allocator.alloc(allocator, contentSize(b.len))) - a.p.allocator = allocator - a.p.cap = b.len - copyMem(unsafeAddr a.p.data[0], unsafeAddr b.p.data[0], b.len+1) - proc resize(old: int): int {.inline.} = if old <= 0: result = 4 elif old < 65536: result = old * 2 diff --git a/lib/system.nim b/lib/system.nim index edab33412..6b1421160 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -2093,7 +2093,7 @@ when not defined(JS) and not defined(nimscript) and hostOS != "standalone": when not defined(JS) and not defined(nimscript) and hasAlloc and not defined(gcDestructors): proc addChar(s: NimString, c: char): NimString {.compilerproc, benign.} -when not defined(gcDestructors): +when not defined(gcDestructors) or defined(nimscript): proc add*[T](x: var seq[T], y: T) {.magic: "AppendSeqElem", noSideEffect.} ## Generic proc for adding a data item `y` to a container `x`. ## diff --git a/lib/system/gc_ms.nim b/lib/system/gc_ms.nim index 87d803485..3ce428930 100644 --- a/lib/system/gc_ms.nim +++ b/lib/system/gc_ms.nim @@ -511,7 +511,7 @@ when not defined(useNimRtl): gch.tracing = true proc GC_fullCollect() = - var oldThreshold = gch.cycleThreshold + let oldThreshold = gch.cycleThreshold gch.cycleThreshold = 0 # forces cycle collection collectCT(gch, 0) gch.cycleThreshold = oldThreshold |