summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2012-06-07 03:32:40 +0300
committerZahary Karadjov <zahary@gmail.com>2012-06-07 03:32:40 +0300
commitce933c90a48ddf0331016edbc684ba6937412e22 (patch)
tree785d3ffcf2d5a8d169e414473086aec88c02a8a9
parent65970efd97483a11a6f63f426ec833098339999f (diff)
downloadNim-ce933c90a48ddf0331016edbc684ba6937412e22.tar.gz
destructor pragma
-rwxr-xr-xcompiler/ast.nim1
-rwxr-xr-xcompiler/pragmas.nim7
-rwxr-xr-xcompiler/semstmts.nim12
-rwxr-xr-xcompiler/wordrecg.nim4
4 files changed, 15 insertions, 9 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index 2f9458169..0c25b24a1 100755
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -237,6 +237,7 @@ type
     sfNamedParamCall, # symbol needs named parameter call syntax in target
                       # language; for interfacing with Objective C
     sfDiscardable     # returned value may be discarded implicitely
+    sfDestructor      # proc is destructor
 
   TSymFlags* = set[TSymFlag]
 
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim
index fe8bff34b..96ae9d701 100755
--- a/compiler/pragmas.nim
+++ b/compiler/pragmas.nim
@@ -23,7 +23,7 @@ const
     wMagic, wNosideEffect, wSideEffect, wNoreturn, wDynLib, wHeader, 
     wCompilerProc, wProcVar, wDeprecated, wVarargs, wCompileTime, wMerge, 
     wBorrow, wExtern, wImportCompilerProc, wThread, wImportCpp, wImportObjC,
-    wNoStackFrame, wError, wDiscardable, wNoInit}
+    wNoStackFrame, wError, wDiscardable, wNoInit, wDestructor}
   converterPragmas* = procPragmas
   methodPragmas* = procPragmas
   templatePragmas* = {wImmediate, wDeprecated, wError}
@@ -508,6 +508,11 @@ proc pragma(c: PContext, sym: PSym, n: PNode, validPragmas: TSpecialWords) =
             incl(sym.loc.Flags, lfNoDecl) 
             # implies nodecl, because otherwise header would not make sense
             if sym.loc.r == nil: sym.loc.r = toRope(sym.name.s)
+          of wDestructor:
+            if sym.typ.sons.len == 2:
+              sym.flags.incl sfDestructor
+            else:
+              invalidPragma(it)
           of wNosideeffect: 
             noVal(it)
             incl(sym.flags, sfNoSideEffect)
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index ddfc2391f..27d7d405b 100755
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -745,7 +745,7 @@ proc semProcAux(c: PContext, n: PNode, kind: TSymKind,
     popOwner()
     pushOwner(s)
   s.options = gOptions
-  if result.sons[namePos].sym.name.id == ord(wDestroy) and s.typ.sons.len == 2:
+  if sfDestructor in s.flags:
     let t = s.typ.sons[1].skipTypes({tyVar})
     t.destructor = s
     # automatically insert calls to base classes' destructors
@@ -885,7 +885,9 @@ new(AnalyzingDestructor)
 new(DestructorIsTrivial)
 
 var
+  destructorName = getIdent"destroy_"
   destructorParam = getIdent"this_"
+  destructorPragma = newIdentNode(getIdent"destructor", UnknownLineInfo())
   rangeDestructorProc: PSym
 
 proc destroyField(c: PContext, field: PSym, holder: PNode): PNode =
@@ -924,9 +926,7 @@ proc destroyCase(c: PContext, n: PNode, holder: PNode): PNode =
   # maybe no fields were destroyed?
   if nonTrivialFields == 0:
     result = nil
-  else:
-    debug result
-
+ 
 proc generateDestructor(c: PContext, t: PType): PNode =
   ## generate a destructor for a user-defined object ot tuple type
   ## returns nil if the destructor turns out to be trivial
@@ -982,7 +982,7 @@ proc instantiateDestructor*(c: PContext, typ: PType): bool =
       internalAssert t.sym != nil
       var i = t.sym.info
       let fullDef = newNode(nkProcDef, i, @[
-        newIdentNode(getIdent"destroy", i),
+        newIdentNode(destructorName, i),
         emptyNode,
         newNode(nkFormalParams, i, @[
           emptyNode,
@@ -991,7 +991,7 @@ proc instantiateDestructor*(c: PContext, typ: PType): bool =
             useSym(t.sym),
             emptyNode]),
           ]),
-        emptyNode,
+        newNode(nkPragma, i, @[destructorPragma]),
         generated
         ])
       discard semProc(c, fullDef)
diff --git a/compiler/wordrecg.nim b/compiler/wordrecg.nim
index af482966b..cec76c998 100755
--- a/compiler/wordrecg.nim
+++ b/compiler/wordrecg.nim
@@ -39,7 +39,7 @@ type
 
     wDestroy,
     
-    wImmediate, wImportCpp, wImportObjC,
+    wImmediate, wDestructor, wImportCpp, wImportObjC,
     wImportCompilerProc,
     wImportc, wExportc, wIncompleteStruct,
     wAlign, wNodecl, wPure, wSideeffect, wHeader,
@@ -117,7 +117,7 @@ const
 
     "destroy",
     
-    "immediate", "importcpp", "importobjc",
+    "immediate", "destructor", "importcpp", "importobjc",
     "importcompilerproc", "importc", "exportc", "incompletestruct",
     "align", "nodecl", "pure", "sideeffect",
     "header", "nosideeffect", "noreturn", "merge", "lib", "dynlib",