summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/ccgexprs.nim3
-rw-r--r--compiler/jsgen.nim4
-rw-r--r--compiler/vmgen.nim4
-rw-r--r--lib/std/isolation.nim3
-rw-r--r--tests/stdlib/isolation.nim16
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()