diff options
-rw-r--r-- | compiler/ccgexprs.nim | 3 | ||||
-rw-r--r-- | compiler/jsgen.nim | 4 | ||||
-rw-r--r-- | compiler/vmgen.nim | 4 | ||||
-rw-r--r-- | lib/std/isolation.nim | 3 | ||||
-rw-r--r-- | tests/stdlib/isolation.nim | 16 |
5 files changed, 25 insertions, 5 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 86e0ed8c0..9babb4c76 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2296,7 +2296,8 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) = of mCharToStr: genDollar(p, e, d, "#nimCharToStr($1)") of mFloatToStr: genDollar(p, e, d, "#nimFloatToStr($1)") of mCStrToStr: genDollar(p, e, d, "#cstrToNimstr($1)") - of mStrToStr, mUnown, mIsolate: expr(p, e[1], d) + of mStrToStr, mUnown: expr(p, e[1], d) + of mIsolate: genCall(p, e, d) of mEnumToStr: if optTinyRtti in p.config.globalOptions: genEnumToStr(p, e, d) diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index aabb59eb5..0e71162d7 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -1435,7 +1435,7 @@ proc genSym(p: PProc, n: PNode, r: var TCompRes) = s.name.s) discard mangleName(p.module, s) r.res = s.loc.r - if lfNoDecl in s.loc.flags or s.magic != mNone or + if lfNoDecl in s.loc.flags or s.magic notin {mNone, mIsolate} or {sfImportc, sfInfixCall} * s.flags != {}: discard elif s.kind == skMethod and getBody(p.module.graph, s).kind == nkEmpty: @@ -2589,7 +2589,7 @@ proc gen(p: PProc, n: PNode, r: var TCompRes) = let s = n[namePos].sym discard mangleName(p.module, s) r.res = s.loc.r - if lfNoDecl in s.loc.flags or s.magic != mNone: discard + if lfNoDecl in s.loc.flags or s.magic notin {mNone, mIsolate}: discard elif not p.g.generatedSyms.containsOrIncl(s.id): p.locals.add(genProc(p, s)) of nkType: r.res = genTypeInfo(p, n.typ) diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index d74bd44d8..a1fcf5a8a 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -1013,7 +1013,9 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) = c.genNarrow(n[1], d) c.genAsgnPatch(n[1], d) c.freeTemp(d) - of mOrd, mChr, mArrToSeq, mUnown, mIsolate: c.gen(n[1], dest) + of mOrd, mChr, mArrToSeq, mUnown: c.gen(n[1], dest) + of mIsolate: + genCall(c, n, dest) of mNew, mNewFinalize: unused(c, n, dest) c.genNew(n) diff --git a/lib/std/isolation.nim b/lib/std/isolation.nim index 7ca5f0080..7c44f47fb 100644 --- a/lib/std/isolation.nim +++ b/lib/std/isolation.nim @@ -25,7 +25,8 @@ proc `=destroy`*[T](dest: var Isolated[T]) {.inline.} = # delegate to value's destroy operation `=destroy`(dest.value) -func isolate*[T](value: sink T): Isolated[T] {.magic: "Isolate".} +func isolate*[T](value: sink T): Isolated[T] {.magic: "Isolate".} = ## Create an isolated subgraph from the expression `value`. ## Please read https://github.com/nim-lang/RFCs/issues/244 ## for more details. + Isolated[T](value: value) diff --git a/tests/stdlib/isolation.nim b/tests/stdlib/isolation.nim new file mode 100644 index 000000000..6fbadda75 --- /dev/null +++ b/tests/stdlib/isolation.nim @@ -0,0 +1,16 @@ +discard """ + targets: "c cpp js" +""" + +import std/[json, isolation] + + +proc main() = + var x: seq[Isolated[JsonNode]] + x.add isolate(newJString("1234")) + + doAssert $x == """@[(value: "1234")]""" + + +static: main() +main() |