mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 01:44:37 +00:00
destructor pragma
This commit is contained in:
@@ -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]
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user