From ce933c90a48ddf0331016edbc684ba6937412e22 Mon Sep 17 00:00:00 2001 From: Zahary Karadjov Date: Thu, 7 Jun 2012 03:32:40 +0300 Subject: [PATCH] destructor pragma --- compiler/ast.nim | 1 + compiler/pragmas.nim | 7 ++++++- compiler/semstmts.nim | 12 ++++++------ compiler/wordrecg.nim | 4 ++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/compiler/ast.nim b/compiler/ast.nim index 2f94581696..0c25b24a17 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 fe8bff34b5..96ae9d701f 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 ddfc2391f2..27d7d405ba 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 af482966bf..cec76c9988 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",