summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorStefan Talpalaru <stefantalpalaru@yahoo.com>2015-06-15 08:36:55 +0200
committerStefan Talpalaru <stefantalpalaru@yahoo.com>2015-06-15 08:36:55 +0200
commit657d6f9de2d8fc8960fb703f927db2ff2070d5a4 (patch)
treecdd4a6acb90c08318e93a07a825acd7f81862c7d /lib
parent02ddbae8f659b2c3bf3f05a924bccbc3c15c3137 (diff)
downloadNim-657d6f9de2d8fc8960fb703f927db2ff2070d5a4.tar.gz
finalizer support
Diffstat (limited to 'lib')
-rw-r--r--lib/system/mmdisp.nim6
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/system/mmdisp.nim b/lib/system/mmdisp.nim
index 377408f78..ef7b32001 100644
--- a/lib/system/mmdisp.nim
+++ b/lib/system/mmdisp.nim
@@ -341,11 +341,17 @@ elif defined(gogc):
   proc goRuntimeMallocGC(size: uint, typ: uint, flag: uint32): pointer {.importc: "runtime_mallocgc", dynlib: goLib.}
   proc goFree(v: pointer) {.importc: "__go_free", dynlib: goLib.}
 
+  proc goSetFinalizer(obj: pointer, f: pointer) {.importc: "set_finalizer", codegenDecl:"$1 $2$3 __asm__ (\"main.Set_finalizer\");\n$1 $2$3", dynlib: goLib.}
+
   proc newObj(typ: PNimType, size: int): pointer {.compilerproc.} =
     result = goRuntimeMallocGC(roundup(size, sizeof(pointer)).uint, 0.uint, 0.uint32)
+    if typ.finalizer != nil:
+      goSetFinalizer(result, typ.finalizer)
 
   proc newObjNoInit(typ: PNimType, size: int): pointer =
     result = goRuntimeMallocGC(roundup(size, sizeof(pointer)).uint, 0.uint, goFlagNoZero)
+    if typ.finalizer != nil:
+      goSetFinalizer(result, typ.finalizer)
 
   proc newSeq(typ: PNimType, len: int): pointer {.compilerproc.} =
     result = newObj(typ, len * typ.base.size + GenericSeqSize)