From 2cfe5e0745cf33ed5698378dd16e01ce542f05e5 Mon Sep 17 00:00:00 2001 From: flywind <43030857+xflywind@users.noreply.github.com> Date: Fri, 30 Oct 2020 22:34:07 +0800 Subject: [PATCH] [closes #11625 and closes #2488]add global and threadvar(with `--threads:off` mode ) pragmas supports for JS backend (#15772) * add global pragma support for js backend * globalThis * add support for threadvar * more tests * Update compiler/jsgen.nim Co-authored-by: Andreas Rumpf --- compiler/jsgen.nim | 7 ++++++- tests/js/tglobal.nim | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/js/tglobal.nim diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 8b91ada8a0..766e6a80d4 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -1736,6 +1736,7 @@ proc genVarInit(p: PProc, v: PSym, n: PNode) = varCode: string varName = mangleName(p.module, v) useReloadingGuard = sfGlobal in v.flags and p.config.hcrOn + useGlobalPragmas = sfGlobal in v.flags and ({sfPure, sfThread} * v.flags != {}) if v.constraint.isNil: if useReloadingGuard: @@ -1743,6 +1744,10 @@ proc genVarInit(p: PProc, v: PSym, n: PNode) = lineF(p, "if ($1 === undefined) {$n", varName) varCode = $varName inc p.extraIndent + elif useGlobalPragmas: + lineF(p, "if (globalThis.$1 === undefined) {$n", varName) + varCode = $varName + inc p.extraIndent else: varCode = "var $2" else: @@ -1795,7 +1800,7 @@ proc genVarInit(p: PProc, v: PSym, n: PNode) = else: line(p, runtimeFormat(varCode & " = $3;$n", [returnType, v.loc.r, s])) - if useReloadingGuard: + if useReloadingGuard or useGlobalPragmas: dec p.extraIndent lineF(p, "}$n") diff --git a/tests/js/tglobal.nim b/tests/js/tglobal.nim new file mode 100644 index 0000000000..38f5eec34f --- /dev/null +++ b/tests/js/tglobal.nim @@ -0,0 +1,30 @@ +block global: + proc getState(): int = + var state0 {.global.}: int + inc state0 + result = state0 + + for i in 0 ..< 3: + doAssert getState() == i + 1 + + for i in 0 ..< 3: + once: + doAssert i == 0 + + +block threadvar: + proc getThreadState0(): int = + var state0 {.threadvar.}: int + inc state0 + result = state0 + + for i in 0 ..< 3: + doAssert getThreadState0() == i + 1 + + proc getThreadState1(): int = + var state1 {.threadvar.}: int + inc state1 + result = state1 + + for i in 0 ..< 3: + doAssert getThreadState1() == i + 1