summary refs log blame commit diff stats
path: root/tests/gc/gcemscripten.nim
blob: cc12b230f1cbcd7ef4ec65743685fcc6d7e261f7 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
















                                         
                                       








































                                                                                                    
discard """
  outputsub: "77\n77"
"""

## Check how GC/Alloc works in Emscripten
import strutils

type
  X = ref XObj
  XObj = object
    name: string
    value: int
when defined(allow_print):
  const print = true
else:
  const print = false

proc myResult3*(i:int): X {.exportc.} =
  if print: echo "3"
  new(result)
  if print: echo "3-2"
  result.value = i

proc myResult5*(i:int, x:X):X {.exportc.} =
  if print: echo "5"
  system.GC_fullCollect()
  new(result)
  if print: echo "5-2"
  result.value = i
  x.value = i+1
  if result.value == x.value:
    echo "This should not happen. Just allocated variable points to parameter"

proc myResult2*(val: string, i: int): X {.exportc.} =
  if print: echo "2-1"
  result = myResult3(i)
  if print: echo "2-2"
  system.GC_fullCollect()
  if print: echo "2-3"
  var t = new(X)
  if print: echo "2-4"
  result.name = val
  if t.name == "qwe":
    echo "This should not happen. Variable is GC collected and new one on same place are allocated."
  if print: echo "2-5"

proc myResult4*(val: string, i: int): X {.exportc.} =
  if print: echo "4-1"
  result = myResult5(i, X())
  if print: echo "4-2"

var x = myResult2("qwe", 77)
echo intToStr(x.value)

var x2 = myResult4("qwe", 77)
echo intToStr(x2.value)