diff --git a/compiler/btrees.nim b/compiler/btrees.nim index 3b737b1bc9..1e5538d820 100644 --- a/compiler/btrees.nim +++ b/compiler/btrees.nim @@ -69,7 +69,7 @@ proc copyHalf[Key, Val](h, result: Node[Key, Val]) = result.links[j] = h.links[Mhalf + j] else: for j in 0..= 0 - when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc): + when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc) or defined(gcYrc): conf.m.fileInfos[fileIdx.int32].hash = hash else: shallowCopy(conf.m.fileInfos[fileIdx.int32].hash, hash) @@ -248,7 +248,7 @@ proc setHash*(conf: ConfigRef; fileIdx: FileIndex; hash: string) = proc getHash*(conf: ConfigRef; fileIdx: FileIndex): string = assert fileIdx.int32 >= 0 - when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc): + when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc) or defined(gcYrc): result = conf.m.fileInfos[fileIdx.int32].hash else: shallowCopy(result, conf.m.fileInfos[fileIdx.int32].hash) diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index 53d928140b..0f1f244c03 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -567,7 +567,7 @@ proc processCompile(c: PContext, n: PNode) = n[i] = c.semConstExpr(c, n[i]) case n[i].kind of nkStrLit, nkRStrLit, nkTripleStrLit: - when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc): + when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc) or defined(gcYrc): result = n[i].strVal else: shallowCopy(result, n[i].strVal) diff --git a/compiler/sem.nim b/compiler/sem.nim index 0e9653f231..cdda93223a 100644 --- a/compiler/sem.nim +++ b/compiler/sem.nim @@ -855,7 +855,7 @@ proc semStmtAndGenerateGenerics(c: PContext, n: PNode): PNode = appendToModule(c.module, result) trackStmt(c, c.module, result, isTopLevel = true) if optMultiMethods notin c.config.globalOptions and - c.config.selectedGC in {gcArc, gcOrc, gcAtomicArc} and + c.config.selectedGC in {gcArc, gcOrc, gcAtomicArc, gcYrc} and Feature.vtables in c.config.features: sortVTableDispatchers(c.graph) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 38c904f439..2763adc074 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -333,7 +333,7 @@ proc isCastable(c: PContext; dst, src: PType, info: TLineInfo): bool = if skipTypes(dst, abstractInst).kind == tyBuiltInTypeClass: return false let conf = c.config - if conf.selectedGC in {gcArc, gcOrc, gcAtomicArc}: + if conf.selectedGC in {gcArc, gcOrc, gcAtomicArc, gcYrc}: let d = skipTypes(dst, abstractInst) let s = skipTypes(src, abstractInst) if d.kind == tyRef and s.kind == tyRef and s[0].isFinal != d[0].isFinal: diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index f93db9e2a1..c6ed5e77dc 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -1149,7 +1149,7 @@ proc semAnyRef(c: PContext; n: PNode; kind: TTypeKind; prev: PType): PType = result = t else: discard if result.kind == tyRef and - c.config.selectedGC in {gcArc, gcOrc, gcAtomicArc} and + c.config.selectedGC in {gcArc, gcOrc, gcAtomicArc, gcYrc} and tfTriggersCompileTime notin result.flags: result.incl tfHasAsgn @@ -2390,7 +2390,7 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType = if n.kind == nkIteratorTy and result.kind == tyProc: result.incl(tfIterator) - if result.callConv == ccClosure and c.config.selectedGC in {gcArc, gcOrc, gcAtomicArc}: + if result.callConv == ccClosure and c.config.selectedGC in {gcArc, gcOrc, gcAtomicArc, gcYrc}: result.incl tfHasAsgn of nkEnumTy: result = semEnum(c, n, prev) of nkType: result = n.typ diff --git a/compiler/spawn.nim b/compiler/spawn.nim index cd5d8031cc..1318ad4b76 100644 --- a/compiler/spawn.nim +++ b/compiler/spawn.nim @@ -37,7 +37,7 @@ proc spawnResult*(t: PType; inParallel: bool): TSpawnResult = else: srFlowVar proc flowVarKind(c: ConfigRef, t: PType): TFlowVarKind = - if c.selectedGC in {gcArc, gcOrc, gcAtomicArc}: fvBlob + if c.selectedGC in {gcArc, gcOrc, gcAtomicArc, gcYrc}: fvBlob elif t.skipTypes(abstractInst).kind in {tyRef, tyString, tySequence}: fvGC elif containsGarbageCollectedRef(t): fvInvalid else: fvBlob @@ -66,7 +66,7 @@ proc addLocalVar(g: ModuleGraph; varSection, varInit: PNode; idgen: IdGenerator; vpart[2] = if varInit.isNil: v else: vpart[1] varSection.add vpart if varInit != nil: - if g.config.selectedGC in {gcArc, gcOrc, gcAtomicArc}: + if g.config.selectedGC in {gcArc, gcOrc, gcAtomicArc, gcYrc}: # inject destructors pass will do its own analysis varInit.add newFastMoveStmt(g, newSymNode(result), v) else: diff --git a/compiler/vm.nim b/compiler/vm.nim index 5e0c76fecb..f6b7cb90c0 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -120,7 +120,7 @@ template decodeBx(k: untyped) {.dirty.} = ensureKind(k) template move(a, b: untyped) {.dirty.} = - when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc): + when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc) or defined(gcYrc): a = move b else: system.shallowCopy(a, b) @@ -557,7 +557,7 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = # Used to keep track of where the execution is resumed. var savedPC = -1 var savedFrame: PStackFrame = nil - when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc): + when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc) or defined(gcYrc): template updateRegsAlias = discard template regs: untyped = tos.slots else: diff --git a/lib/pure/asynchttpserver.nim b/lib/pure/asynchttpserver.nim index b01c24a7eb..a88a2d2e43 100644 --- a/lib/pure/asynchttpserver.nim +++ b/lib/pure/asynchttpserver.nim @@ -188,7 +188,7 @@ proc processRequest( # \n request.headers.clear() request.body = "" - when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc): + when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc) or defined(gcYrc): request.hostname = address else: request.hostname.shallowCopy(address) diff --git a/lib/pure/coro.nim b/lib/pure/coro.nim index 24836e3164..b10edc6e24 100644 --- a/lib/pure/coro.nim +++ b/lib/pure/coro.nim @@ -36,7 +36,7 @@ when defined(nimPreviewSlimSystem): import std/assertions const defaultStackSize = 512 * 1024 -const useOrcArc = defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc) +const useOrcArc = defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc) or defined(gcYrc) when useOrcArc: proc nimGC_setStackBottom*(theStackBottom: pointer) = discard diff --git a/lib/pure/json.nim b/lib/pure/json.nim index 5b7fe9621e..d0f2741230 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -866,7 +866,7 @@ proc parseJson(p: var JsonParser; rawIntegers, rawFloats: bool, depth = 0): Json case p.tok of tkString: # we capture 'p.a' here, so we need to give it a fresh buffer afterwards: - when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc): + when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc) or defined(gcYrc): result = JsonNode(kind: JString, str: move p.a) else: result = JsonNode(kind: JString) diff --git a/lib/pure/marshal.nim b/lib/pure/marshal.nim index e53766fe31..40beeb13b3 100644 --- a/lib/pure/marshal.nim +++ b/lib/pure/marshal.nim @@ -305,7 +305,7 @@ proc store*[T](s: Stream, data: sink T) = var stored = initIntSet() var d: T - when defined(gcArc) or defined(gcOrc)or defined(gcAtomicArc): + when defined(gcArc) or defined(gcOrc)or defined(gcAtomicArc) or defined(gcYrc): d = data else: shallowCopy(d, data) @@ -334,7 +334,7 @@ proc `$$`*[T](x: sink T): string = else: var stored = initIntSet() var d: T - when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc): + when defined(gcArc) or defined(gcOrc) or defined(gcAtomicArc) or defined(gcYrc): d = x else: shallowCopy(d, x) diff --git a/lib/std/tasks.nim b/lib/std/tasks.nim index 6082e9b43d..9cb56a8f2f 100644 --- a/lib/std/tasks.nim +++ b/lib/std/tasks.nim @@ -68,7 +68,7 @@ type proc `=copy`*(x: var Task, y: Task) {.error.} -const arcLike = defined(gcArc) or defined(gcAtomicArc) or defined(gcOrc) +const arcLike = defined(gcArc) or defined(gcAtomicArc) or defined(gcOrc) or defined(gcYrc) when defined(nimAllowNonVarDestructor) and arcLike: proc `=destroy`*(t: Task) {.inline, gcsafe.} = ## Frees the resources allocated for a `Task`. diff --git a/lib/std/typedthreads.nim b/lib/std/typedthreads.nim index 494baa8abf..998d95c100 100644 --- a/lib/std/typedthreads.nim +++ b/lib/std/typedthreads.nim @@ -9,13 +9,13 @@ ##[ Thread support for Nim. Threads allow multiple functions to execute concurrently. - + In Nim, threads are a low-level construct and using a library like `malebolgia`, `taskpools` or `weave` is recommended. - + When creating a thread, you can pass arguments to it. As Nim's garbage collector does not use atomic references, sharing `ref` and other variables managed by the garbage collector between threads is not supported. Use global variables to do so, or pointers. - + Memory allocated using [`sharedAlloc`](./system.html#allocShared.t%2CNatural) can be used and shared between threads. To communicate between threads, consider using [channels](./system.html#Channel) @@ -44,7 +44,7 @@ joinThreads(thr) deinitLock(L) ``` - + When using a memory management strategy that supports shared heaps like `arc` or `boehm`, you can pass pointer to threads and share memory between them, but the memory must outlive the thread. The default memory management strategy, `orc`, supports this. @@ -52,14 +52,14 @@ The example below is **not valid** for memory management strategies that use loc ```Nim import locks - + var l: Lock - + proc threadFunc(obj: ptr seq[int]) {.thread.} = withLock l: for i in 0..<100: obj[].add(obj[].len * obj[].len) - + proc threadHandler() = var thr: array[0..4, Thread[ptr seq[int]]] var s = newSeq[int]() @@ -68,7 +68,7 @@ proc threadHandler() = createThread(thr[i], threadFunc, s.addr) joinThreads(thr) echo s - + initLock(l) threadHandler() deinitLock(l) @@ -303,5 +303,5 @@ else: proc createThread*(t: var Thread[void], tp: proc () {.thread, nimcall.}) = createThread[void](t, tp) -when not defined(gcOrc): +when not defined(gcOrc) and not defined(gcYrc): include system/threadids diff --git a/lib/std/widestrs.nim b/lib/std/widestrs.nim index ad91f97016..7cc905cb49 100644 --- a/lib/std/widestrs.nim +++ b/lib/std/widestrs.nim @@ -25,7 +25,7 @@ when not (defined(cpu16) or defined(cpu8)): bytes: int data: WideCString - const arcLike = defined(gcArc) or defined(gcAtomicArc) or defined(gcOrc) + const arcLike = defined(gcArc) or defined(gcAtomicArc) or defined(gcOrc) or defined(gcYrc) when defined(nimAllowNonVarDestructor) and arcLike: proc `=destroy`(a: WideCStringObj) = if a.data != nil: diff --git a/lib/system/cellsets.nim b/lib/system/cellsets.nim index 1fed45b7b5..f8b757b460 100644 --- a/lib/system/cellsets.nim +++ b/lib/system/cellsets.nim @@ -42,7 +42,7 @@ Complete traversal is done in this way:: ]# -when defined(gcOrc) or defined(gcArc) or defined(gcAtomicArc): +when defined(gcOrc) or defined(gcArc) or defined(gcAtomicArc) or defined(gcYrc): type PCell = Cell @@ -78,7 +78,7 @@ type head: PPageDesc data: PPageDescArray -when defined(gcOrc) or defined(gcArc) or defined(gcAtomicArc): +when defined(gcOrc) or defined(gcArc) or defined(gcAtomicArc) or defined(gcYrc): discard else: include cellseqs_v1 diff --git a/lib/system/orc.nim b/lib/system/orc.nim index cb84a9ade1..a5a6b514d3 100644 --- a/lib/system/orc.nim +++ b/lib/system/orc.nim @@ -465,13 +465,13 @@ proc GC_runOrc* = proc GC_enableOrc*() = ## Enables the cycle collector subsystem of `--mm:orc`. This is a `--mm:orc` - ## specific API. Check with `when defined(gcOrc)` for its existence. + ## specific API. Check with `when defined(gcOrc) or defined(gcYrc)` for its existence. when not defined(nimStressOrc): rootsThreshold = 0 proc GC_disableOrc*() = ## Disables the cycle collector subsystem of `--mm:orc`. This is a `--mm:orc` - ## specific API. Check with `when defined(gcOrc)` for its existence. + ## specific API. Check with `when defined(gcOrc) or defined(gcYrc)` for its existence. when not defined(nimStressOrc): rootsThreshold = high(int) diff --git a/lib/system/osalloc.nim b/lib/system/osalloc.nim index 5b6a191dfc..4177b47b1f 100644 --- a/lib/system/osalloc.nim +++ b/lib/system/osalloc.nim @@ -31,8 +31,8 @@ const doNotUnmap = not (defined(amd64) or defined(i386)) or when defined(nimAllocPagesViaMalloc): - when not defined(gcArc) and not defined(gcOrc) and not defined(gcAtomicArc): - {.error: "-d:nimAllocPagesViaMalloc is only supported with --mm:arc or --mm:atomicArc or --mm:orc".} + when not defined(gcArc) and not defined(gcOrc) and not defined(gcAtomicArc) and not defined(gcYrc): + {.error: "-d:nimAllocPagesViaMalloc is only supported with --mm:arc or --mm:atomicArc or --mm:orc or --mm:yrc".} proc osTryAllocPages(size: int): pointer {.inline.} = let base = c_malloc(csize_t size + PageSize - 1 + sizeof(uint32)) diff --git a/lib/system/yrc.nim b/lib/system/yrc.nim index 2ce6cf1111..6d55ffa04f 100644 --- a/lib/system/yrc.nim +++ b/lib/system/yrc.nim @@ -159,8 +159,9 @@ proc GC_setPreventThreadFromCollectProc*(cb: PreventThreadFromCollectProc) = GC_setPreventThreadFromCollectProc(proc(): bool {.nimcall.} = if hardRealTimeThread == getThreadId(): writeStackTrace() - echo "Realtime thread involved in inpredictable cycle collector activity!" + echo "Realtime thread involved in unpredictable cycle collector activity!" result = false + ) ``` ]## gPreventThreadFromCollectProc = cb diff --git a/tests/gc/cyclecollector.nim b/tests/gc/cyclecollector.nim index 9cc1bbcee1..2e1be02ae2 100644 --- a/tests/gc/cyclecollector.nim +++ b/tests/gc/cyclecollector.nim @@ -12,7 +12,7 @@ type proc createCycle(leaf: string): Node = new result result.a = result - when defined(gcArc) or defined(gcOrc): + when defined(gcArc) or defined(gcOrc) or defined(gcYrc): result.leaf = leaf else: shallowCopy result.leaf, leaf diff --git a/tests/gc/thavlak.nim b/tests/gc/thavlak.nim index f697a9eba9..fd7f948f3f 100644 --- a/tests/gc/thavlak.nim +++ b/tests/gc/thavlak.nim @@ -437,6 +437,6 @@ proc main = let mem = getOccupiedMem() main() -when defined(gcOrc): +when defined(gcOrc) or defined(gcYrc): GC_fullCollect() doAssert getOccupiedMem() == mem diff --git a/tests/misc/taddr.nim b/tests/misc/taddr.nim index 64f95c7e3d..b3ce92f2fb 100644 --- a/tests/misc/taddr.nim +++ b/tests/misc/taddr.nim @@ -32,7 +32,7 @@ doAssert objDeref.x == 42 # String tests obj.s = "lorem ipsum dolor sit amet" -when defined(gcArc) or defined(gcOrc): +when defined(gcArc) or defined(gcOrc) or defined(gcYrc): prepareMutation(obj.s) @@ -237,7 +237,7 @@ block: # bug #15939 doAssert bar == "foo" template prepareMutationForOrc(x: string) = - when defined(gcArc) or defined(gcOrc): + when defined(gcArc) or defined(gcOrc) or defined(gcYrc): when nimvm: discard else: diff --git a/tests/objects/tobject_default_value.nim b/tests/objects/tobject_default_value.nim index 1d86dd1550..5b0a5cd8e6 100644 --- a/tests/objects/tobject_default_value.nim +++ b/tests/objects/tobject_default_value.nim @@ -239,7 +239,7 @@ template main {.dirty.} = # todo discard "fixme" else: - when defined(gcArc) or defined(gcOrc): + when defined(gcArc) or defined(gcOrc) or defined(gcYrc): block: #seq var x = newSeq[Object](10) let y = x[0] @@ -375,7 +375,7 @@ template main {.dirty.} = type Color = enum Red, Blue, Yellow - + type ObjectVarint3 = object case kind: Color = Blue @@ -663,7 +663,7 @@ template main {.dirty.} = when not(T is void): v.vResultPrivate - + type R = Result[int, string] proc testAssignResult() = diff --git a/tests/stdlib/mgenast.nim b/tests/stdlib/mgenast.nim index b0904847ef..119c6c9b1b 100644 --- a/tests/stdlib/mgenast.nim +++ b/tests/stdlib/mgenast.nim @@ -31,7 +31,7 @@ macro bindme6UseExpose*(): untyped = genAst: var tst = "sometext" var ss = newStringStream("anothertext") - when defined(gcArc) or defined(gcOrc): + when defined(gcArc) or defined(gcOrc) or defined(gcYrc): prepareMutation(tst) writeData(ss, tst[0].addr, 2) discard readData(ss, tst[0].addr, 2) @@ -42,7 +42,7 @@ macro bindme6UseExposeFalse*(): untyped = genAstOpt({kDirtyTemplate}, newStringStream, writeData, readData): var tst = "sometext" var ss = newStringStream("anothertext") - when defined(gcArc) or defined(gcOrc): + when defined(gcArc) or defined(gcOrc) or defined(gcYrc): prepareMutation(tst) writeData(ss, tst[0].addr, 2) discard readData(ss, tst[0].addr, 2)