destructor pragma
This commit is contained in:
parent
65970efd97
commit
ce933c90a4
4 changed files with 15 additions and 9 deletions
|
|
@ -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]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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,9 +926,7 @@ 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
|
||||||
## returns nil if the destructor turns out to be trivial
|
## 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
|
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)
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue