diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2021-05-12 07:15:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-12 07:15:05 +0200 |
commit | 39ad9a69a9473aa88d4457039393f6ed15fafcfa (patch) | |
tree | 44922aeb7d99f8f2b1df47b70468b8e3ac3d595b /compiler | |
parent | 1e080eb9b4e0759b8b3f87406cd58bb7a615902f (diff) | |
download | Nim-39ad9a69a9473aa88d4457039393f6ed15fafcfa.tar.gz |
ORC: improvements (#17993)
* ORC: improvements * ORC: fix .acyclic annotation for ref objects
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ast.nim | 4 | ||||
-rw-r--r-- | compiler/liftdestructors.nim | 9 | ||||
-rw-r--r-- | compiler/modulegraphs.nim | 2 | ||||
-rw-r--r-- | compiler/options.nim | 2 | ||||
-rw-r--r-- | compiler/semtypes.nim | 11 | ||||
-rw-r--r-- | compiler/semtypinst.nim | 2 |
6 files changed, 18 insertions, 12 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index d87e42dde..96adb8c1f 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -742,7 +742,7 @@ proc hash*(x: ItemId): Hash = type - TIdObj* = object of RootObj + TIdObj* {.acyclic.} = object of RootObj itemId*: ItemId PIdObj* = ref TIdObj @@ -841,7 +841,7 @@ type PInstantiation* = ref TInstantiation - TScope* = object + TScope* {.acyclic.} = object depthLevel*: int symbols*: TStrTable parent*: PScope diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index 1dc711bd6..de45beb52 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -480,13 +480,17 @@ proc setLenSeqCall(c: var TLiftCtx; t: PType; x, y: PNode): PNode = result = newTree(nkCall, newSymNode(op, x.info), x, lenCall) proc forallElements(c: var TLiftCtx; t: PType; body, x, y: PNode) = + let counterIdx = body.len let i = declareCounter(c, body, toInt64(firstOrd(c.g.config, t))) let whileLoop = genWhileLoop(c, i, x) let elemType = t.lastSon let b = if c.kind == attachedTrace: y else: y.at(i, elemType) fillBody(c, elemType, whileLoop[1], x.at(i, elemType), b) - addIncStmt(c, whileLoop[1], i) - body.add whileLoop + if whileLoop[1].len > 0: + addIncStmt(c, whileLoop[1], i) + body.add whileLoop + else: + body.sons.setLen counterIdx proc fillSeqOp(c: var TLiftCtx; t: PType; body, x, y: PNode) = case c.kind @@ -660,6 +664,7 @@ proc atomicRefOp(c: var TLiftCtx; t: PType; body, x, y: PNode) = else: # If the ref is polymorphic we have to account for this body.add callCodegenProc(c.g, "nimTraceRefDyn", c.info, genAddrOf(x, c.idgen), y) + #echo "can follow ", elemType, " static ", isFinal(elemType) of attachedDispose: # this is crucial! dispose is like =destroy but we don't follow refs # as that is dealt within the cycle collector. diff --git a/compiler/modulegraphs.nim b/compiler/modulegraphs.nim index c268308d2..0d8d4f867 100644 --- a/compiler/modulegraphs.nim +++ b/compiler/modulegraphs.nim @@ -50,7 +50,7 @@ type concreteTypes*: seq[FullId] inst*: PInstantiation - ModuleGraph* = ref object + ModuleGraph* {.acyclic.} = ref object ifaces*: seq[Iface] ## indexed by int32 fileIdx packed*: PackedModuleGraph encoders*: seq[PackedEncoder] diff --git a/compiler/options.nim b/compiler/options.nim index 10d8f5c32..09eae49e6 100644 --- a/compiler/options.nim +++ b/compiler/options.nim @@ -268,7 +268,7 @@ type foName # lastPathPart, e.g.: foo.nim foStacktrace # if optExcessiveStackTrace: foAbs else: foName - ConfigRef* = ref object ## every global configuration + ConfigRef* {.acyclic.} = ref object ## every global configuration ## fields marked with '*' are subject to ## the incremental compilation mechanisms ## (+) means "part of the dependency" diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 6a59624cd..97e37f8b7 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -854,7 +854,7 @@ proc addInheritedFields(c: PContext, check: var IntSet, pos: var int, addInheritedFields(c, check, pos, obj[0].skipGenericInvocation) addInheritedFieldsAux(c, check, pos, obj.n) -proc semObjectNode(c: PContext, n: PNode, prev: PType; isInheritable: bool): PType = +proc semObjectNode(c: PContext, n: PNode, prev: PType; flags: TTypeFlags): PType = if n.len == 0: return newConstraint(c, tyObject) var check = initIntSet() @@ -890,8 +890,9 @@ proc semObjectNode(c: PContext, n: PNode, prev: PType; isInheritable: bool): PTy if n.kind != nkObjectTy: internalError(c.config, n.info, "semObjectNode") result = newOrPrevType(tyObject, prev, c) rawAddSon(result, realBase) - if realBase == nil and isInheritable: + if realBase == nil and tfInheritable in flags: result.flags.incl tfInheritable + if tfAcyclic in flags: result.flags.incl tfAcyclic if result.n.isNil: result.n = newNodeI(nkRecList, n.info) else: @@ -916,8 +917,8 @@ proc semAnyRef(c: PContext; n: PNode; kind: TTypeKind; prev: PType): PType = let n = if n[0].kind == nkBracket: n[0] else: n checkMinSonsLen(n, 1, c.config) let body = n.lastSon - var t = if prev != nil and body.kind == nkObjectTy and tfInheritable in prev.flags: - semObjectNode(c, body, nil, isInheritable=true) + var t = if prev != nil and body.kind == nkObjectTy: + semObjectNode(c, body, nil, prev.flags) else: semTypeNode(c, body, nil) if t.kind == tyTypeDesc and tfUnresolved notin t.flags: @@ -1957,7 +1958,7 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType = localError(c.config, n.info, "type expected, but got symbol '$1' of kind '$2'" % [s.name.s, s.kind.toHumanStr]) result = newOrPrevType(tyError, prev, c) - of nkObjectTy: result = semObjectNode(c, n, prev, isInheritable=false) + of nkObjectTy: result = semObjectNode(c, n, prev, {}) of nkTupleTy: result = semTuple(c, n, prev) of nkTupleClassTy: result = newConstraint(c, tyTuple) of nkTypeClassTy: result = semTypeClass(c, n, prev) diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim index c9b9e39ea..18febb52e 100644 --- a/compiler/semtypinst.nim +++ b/compiler/semtypinst.nim @@ -64,7 +64,7 @@ proc cacheTypeInst(c: PContext; inst: PType) = addToGenericCache(c, gt.sym, inst) type - LayeredIdTable* = ref object + LayeredIdTable* {.acyclic.} = ref object topLayer*: TIdTable nextLayer*: LayeredIdTable |