diff options
author | Zahary Karadjov <zahary@gmail.com> | 2012-06-07 03:32:40 +0300 |
---|---|---|
committer | Zahary Karadjov <zahary@gmail.com> | 2012-06-07 03:32:40 +0300 |
commit | ce933c90a48ddf0331016edbc684ba6937412e22 (patch) | |
tree | 785d3ffcf2d5a8d169e414473086aec88c02a8a9 | |
parent | 65970efd97483a11a6f63f426ec833098339999f (diff) | |
download | Nim-ce933c90a48ddf0331016edbc684ba6937412e22.tar.gz |
destructor pragma
-rwxr-xr-x | compiler/ast.nim | 1 | ||||
-rwxr-xr-x | compiler/pragmas.nim | 7 | ||||
-rwxr-xr-x | compiler/semstmts.nim | 12 | ||||
-rwxr-xr-x | compiler/wordrecg.nim | 4 |
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", |