diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 73e92ab75..9e3e5e076 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1522,7 +1522,7 @@ proc asgnToResultVar(c: PContext, n, le, ri: PNode) {.inline.} = proc asgnToResult(c: PContext, n, le, ri: PNode) = # Special typing rule: do not allow to pass 'owned T' to 'T' in 'result = x': if ri.typ != nil and ri.typ.skipTypes(abstractInst).kind == tyOwned and - le.typ != nil and le.typ.skipTypes(abstractInst).kind != tyOwned: + le.typ != nil and le.typ.skipTypes(abstractInst).kind != tyOwned and ri.kind in nkCallKinds: localError(c.config, n.info, "cannot return an owned pointer as an unowned pointer; " & "use 'owned(" & typeToString(le.typ) & ")' as the return type") diff --git a/lib/pure/osproc.nim b/lib/pure/osproc.nim index 88df65aa9..0cdc3583d 100644 --- a/lib/pure/osproc.nim +++ b/lib/pure/osproc.nim @@ -57,8 +57,8 @@ type id: Handle else: inHandle, outHandle, errHandle: FileHandle - inStream, outStream, errStream: Stream id: Pid + inStream, outStream, errStream: owned(Stream) exitStatus: cint exitFlag: bool options: set[ProcessOption] @@ -724,15 +724,21 @@ when defined(Windows) and not defined(useNimRtl): proc inputStream(p: Process): Stream = streamAccess(p) - result = newFileHandleStream(p.inHandle) + if p.inStream == nil: + p.inStream = newFileHandleStream(p.inHandle) + result = p.inStream proc outputStream(p: Process): Stream = streamAccess(p) - result = newFileHandleStream(p.outHandle) + if p.outStream == nil: + p.outStream = newFileHandleStream(p.outHandle) + result = p.outStream proc errorStream(p: Process): Stream = streamAccess(p) - result = newFileHandleStream(p.errHandle) + if p.errStream == nil: + p.errStream = newFileHandleStream(p.errHandle) + result = p.errStream proc execCmd(command: string): int = var diff --git a/lib/pure/strtabs.nim b/lib/pure/strtabs.nim index 269fe11f7..0726eb15d 100644 --- a/lib/pure/strtabs.nim +++ b/lib/pure/strtabs.nim @@ -276,7 +276,7 @@ proc newStringTable*(keyValuePairs: varargs[string], inc(i, 2) proc newStringTable*(keyValuePairs: varargs[tuple[key, val: string]], - mode: StringTableMode = modeCaseSensitive): StringTableRef {. + mode: StringTableMode = modeCaseSensitive): owned(StringTableRef) {. rtlFunc, extern: "nst$1WithTableConstr".} = ## Creates a new string table with given `(key, value)` tuple pairs. ##