mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 01:14:41 +00:00
60 lines
1.2 KiB
Nim
60 lines
1.2 KiB
Nim
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)
|
|
|
|
|
|
|