destructor pragma

This commit is contained in:
Zahary Karadjov 2012-06-07 03:32:40 +03:00
commit ce933c90a4
4 changed files with 15 additions and 9 deletions

View file

@ -237,6 +237,7 @@ type
sfNamedParamCall, # symbol needs named parameter call syntax in target sfNamedParamCall, # symbol needs named parameter call syntax in target
# language; for interfacing with Objective C # language; for interfacing with Objective C
sfDiscardable # returned value may be discarded implicitely sfDiscardable # returned value may be discarded implicitely
sfDestructor # proc is destructor
TSymFlags* = set[TSymFlag] TSymFlags* = set[TSymFlag]

View file

@ -23,7 +23,7 @@ const
wMagic, wNosideEffect, wSideEffect, wNoreturn, wDynLib, wHeader, wMagic, wNosideEffect, wSideEffect, wNoreturn, wDynLib, wHeader,
wCompilerProc, wProcVar, wDeprecated, wVarargs, wCompileTime, wMerge, wCompilerProc, wProcVar, wDeprecated, wVarargs, wCompileTime, wMerge,
wBorrow, wExtern, wImportCompilerProc, wThread, wImportCpp, wImportObjC, wBorrow, wExtern, wImportCompilerProc, wThread, wImportCpp, wImportObjC,
wNoStackFrame, wError, wDiscardable, wNoInit} wNoStackFrame, wError, wDiscardable, wNoInit, wDestructor}
converterPragmas* = procPragmas converterPragmas* = procPragmas
methodPragmas* = procPragmas methodPragmas* = procPragmas
templatePragmas* = {wImmediate, wDeprecated, wError} templatePragmas* = {wImmediate, wDeprecated, wError}
@ -508,6 +508,11 @@ proc pragma(c: PContext, sym: PSym, n: PNode, validPragmas: TSpecialWords) =
incl(sym.loc.Flags, lfNoDecl) incl(sym.loc.Flags, lfNoDecl)
# implies nodecl, because otherwise header would not make sense # implies nodecl, because otherwise header would not make sense
if sym.loc.r == nil: sym.loc.r = toRope(sym.name.s) 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: of wNosideeffect:
noVal(it) noVal(it)
incl(sym.flags, sfNoSideEffect) incl(sym.flags, sfNoSideEffect)

View file

@ -745,7 +745,7 @@ proc semProcAux(c: PContext, n: PNode, kind: TSymKind,
popOwner() popOwner()
pushOwner(s) pushOwner(s)
s.options = gOptions 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}) let t = s.typ.sons[1].skipTypes({tyVar})
t.destructor = s t.destructor = s
# automatically insert calls to base classes' destructors # automatically insert calls to base classes' destructors
@ -885,7 +885,9 @@ new(AnalyzingDestructor)
new(DestructorIsTrivial) new(DestructorIsTrivial)
var var
destructorName = getIdent"destroy_"
destructorParam = getIdent"this_" destructorParam = getIdent"this_"
destructorPragma = newIdentNode(getIdent"destructor", UnknownLineInfo())
rangeDestructorProc: PSym rangeDestructorProc: PSym
proc destroyField(c: PContext, field: PSym, holder: PNode): PNode = proc destroyField(c: PContext, field: PSym, holder: PNode): PNode =
@ -924,8 +926,6 @@ proc destroyCase(c: PContext, n: PNode, holder: PNode): PNode =
# maybe no fields were destroyed? # maybe no fields were destroyed?
if nonTrivialFields == 0: if nonTrivialFields == 0:
result = nil result = nil
else:
debug result
proc generateDestructor(c: PContext, t: PType): PNode = proc generateDestructor(c: PContext, t: PType): PNode =
## generate a destructor for a user-defined object ot tuple type ## generate a destructor for a user-defined object ot tuple type
@ -982,7 +982,7 @@ proc instantiateDestructor*(c: PContext, typ: PType): bool =
internalAssert t.sym != nil internalAssert t.sym != nil
var i = t.sym.info var i = t.sym.info
let fullDef = newNode(nkProcDef, i, @[ let fullDef = newNode(nkProcDef, i, @[
newIdentNode(getIdent"destroy", i), newIdentNode(destructorName, i),
emptyNode, emptyNode,
newNode(nkFormalParams, i, @[ newNode(nkFormalParams, i, @[
emptyNode, emptyNode,
@ -991,7 +991,7 @@ proc instantiateDestructor*(c: PContext, typ: PType): bool =
useSym(t.sym), useSym(t.sym),
emptyNode]), emptyNode]),
]), ]),
emptyNode, newNode(nkPragma, i, @[destructorPragma]),
generated generated
]) ])
discard semProc(c, fullDef) discard semProc(c, fullDef)

View file

@ -39,7 +39,7 @@ type
wDestroy, wDestroy,
wImmediate, wImportCpp, wImportObjC, wImmediate, wDestructor, wImportCpp, wImportObjC,
wImportCompilerProc, wImportCompilerProc,
wImportc, wExportc, wIncompleteStruct, wImportc, wExportc, wIncompleteStruct,
wAlign, wNodecl, wPure, wSideeffect, wHeader, wAlign, wNodecl, wPure, wSideeffect, wHeader,
@ -117,7 +117,7 @@ const
"destroy", "destroy",
"immediate", "importcpp", "importobjc", "immediate", "destructor", "importcpp", "importobjc",
"importcompilerproc", "importc", "exportc", "incompletestruct", "importcompilerproc", "importc", "exportc", "incompletestruct",
"align", "nodecl", "pure", "sideeffect", "align", "nodecl", "pure", "sideeffect",
"header", "nosideeffect", "noreturn", "merge", "lib", "dynlib", "header", "nosideeffect", "noreturn", "merge", "lib", "dynlib",