diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ccgexprs.nim | 10 | ||||
-rw-r--r-- | compiler/ccgstmts.nim | 31 | ||||
-rw-r--r-- | compiler/packagehandling.nim | 4 | ||||
-rw-r--r-- | compiler/types.nim | 17 |
4 files changed, 31 insertions, 31 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 97ce5a485..ec32f5975 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -718,14 +718,10 @@ proc isCppRef(p: BProc; typ: PType): bool {.inline.} = tfVarIsPtr notin skipTypes(typ, abstractInstOwned).flags proc genDeref(p: BProc, e: PNode, d: var TLoc) = - let - enforceDeref = lfEnforceDeref in d.flags - mt = mapType(p.config, e.sons[0].typ) - if mt in {ctArray, ctPtrToArray} and not enforceDeref: + let mt = mapType(p.config, e.sons[0].typ) + if mt in {ctArray, ctPtrToArray} and lfEnforceDeref notin d.flags: # XXX the amount of hacks for C's arrays is incredible, maybe we should # simply wrap them in a struct? --> Losing auto vectorization then? - #if e[0].kind != nkBracketExpr: - # message(e.info, warnUser, "CAME HERE " & renderTree(e)) expr(p, e.sons[0], d) if e.sons[0].typ.skipTypes(abstractInstOwned).kind == tyRef: d.storage = OnHeap @@ -762,7 +758,7 @@ proc genDeref(p: BProc, e: PNode, d: var TLoc) = e.kind == nkHiddenDeref: putIntoDest(p, d, e, rdLoc(a), a.storage) return - if enforceDeref and mt == ctPtrToArray: + if mt == ctPtrToArray and lfEnforceDeref in d.flags: # we lie about the type for better C interop: 'ptr array[3,T]' is # translated to 'ptr T', but for deref'ing this produces wrong code. # See tmissingderef. So we get rid of the deref instead. The codegen diff --git a/compiler/ccgstmts.nim b/compiler/ccgstmts.nim index 3be31503a..7552f0c63 100644 --- a/compiler/ccgstmts.nim +++ b/compiler/ccgstmts.nim @@ -83,18 +83,6 @@ proc genVarTuple(p: BProc, n: PNode) = # check with the boolean if the initializing code for the tuple should be ran lineCg(p, cpsStmts, "if ($1)$n", [hcrCond]) startBlock(p) - defer: - if forHcr: - # end the block where the tuple gets initialized - endBlock(p) - if forHcr or isGlobalInBlock: - # insert the registration of the globals for the different parts of the tuple at the - # start of the current scope (after they have been iterated) and init a boolean to - # check if any of them is newly introduced and the initializing code has to be ran - lineCg(p, cpsLocals, "NIM_BOOL $1 = NIM_FALSE;$n", [hcrCond]) - for curr in hcrGlobals: - lineCg(p, cpsLocals, "$1 |= hcrRegisterGlobal($4, \"$2\", sizeof($3), $5, (void**)&$2);$N", - [hcrCond, curr.loc.r, rdLoc(curr.loc), getModuleDllPath(p.module, n.sons[0].sym), curr.tp]) genLineDir(p, n) initLocExpr(p, n.sons[L-1], tup) @@ -123,7 +111,18 @@ proc genVarTuple(p: BProc, n: PNode) = if forHcr or isGlobalInBlock: hcrGlobals.add((loc: v.loc, tp: if traverseProc == nil: ~"NULL" else: traverseProc)) -proc genDeref(p: BProc, e: PNode, d: var TLoc) + if forHcr: + # end the block where the tuple gets initialized + endBlock(p) + if forHcr or isGlobalInBlock: + # insert the registration of the globals for the different parts of the tuple at the + # start of the current scope (after they have been iterated) and init a boolean to + # check if any of them is newly introduced and the initializing code has to be ran + lineCg(p, cpsLocals, "NIM_BOOL $1 = NIM_FALSE;$n", [hcrCond]) + for curr in hcrGlobals: + lineCg(p, cpsLocals, "$1 |= hcrRegisterGlobal($4, \"$2\", sizeof($3), $5, (void**)&$2);$N", + [hcrCond, curr.loc.r, rdLoc(curr.loc), getModuleDllPath(p.module, n.sons[0].sym), curr.tp]) + proc loadInto(p: BProc, le, ri: PNode, a: var TLoc) {.inline.} = if ri.kind in nkCallKinds and (ri.sons[0].kind != nkSym or @@ -364,13 +363,11 @@ proc genSingleVar(p: BProc, a: PNode) = lineCg(targetProc, cpsStmts, "if (hcrRegisterGlobal($3, \"$1\", sizeof($2), $4, (void**)&$1))$N", [v.loc.r, rdLoc(v.loc), getModuleDllPath(p.module, v), traverseProc]) startBlock(targetProc) - defer: - if forHcr: - endBlock(targetProc) - if a.sons[2].kind != nkEmpty: genLineDir(targetProc, a) loadInto(targetProc, a.sons[0], a.sons[2], v.loc) + if forHcr: + endBlock(targetProc) proc genClosureVar(p: BProc, a: PNode) = var immediateAsgn = a.sons[2].kind != nkEmpty diff --git a/compiler/packagehandling.nim b/compiler/packagehandling.nim index 0e9331128..548668824 100644 --- a/compiler/packagehandling.nim +++ b/compiler/packagehandling.nim @@ -41,11 +41,11 @@ proc getPackageName*(conf: ConfigRef; path: string): string = proc fakePackageName*(conf: ConfigRef; path: AbsoluteFile): string = # foo/../bar becomes foo7_7bar result = relativeTo(path, conf.projectPath, '/').string.multiReplace( - {"/": "7", "..": "_", "7": "77", "_": "__"}) + {"/": "7", "..": "_", "7": "77", "_": "__", ":": "8", "8": "88"}) proc demaglePackageName*(path: string): string = result = path.multiReplace( - {"77": "7", "__": "_", "_7": "../", "7": "/"}) + {"88": "8", "8": ":", "77": "7", "__": "_", "_7": "../", "7": "/"}) proc withPackageName*(conf: ConfigRef; path: AbsoluteFile): AbsoluteFile = let x = getPackageName(conf, path.string) diff --git a/compiler/types.nim b/compiler/types.nim index b0a6a4c17..d56794d2d 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -1199,9 +1199,9 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind, case t2.kind of tyVar, tyLent: if taHeap notin flags: result = t2 # ``var var`` is illegal on the heap - of tyOpenArray: + of tyOpenArray, tyUncheckedArray: if kind != skParam: result = t - else: result = typeAllowedAux(marker, t2, kind, flags) + else: result = typeAllowedAux(marker, t2.sons[0], skParam, flags) else: if kind notin {skParam, skResult}: result = t else: result = typeAllowedAux(marker, t2, kind, flags) @@ -1235,14 +1235,21 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind, result = nil of tyOrdinal: if kind != skParam: result = t - of tyGenericInst, tyDistinct, tyAlias, tyInferred, tyUncheckedArray: + of tyGenericInst, tyDistinct, tyAlias, tyInferred: result = typeAllowedAux(marker, lastSon(t), kind, flags) of tyRange: if skipTypes(t.sons[0], abstractInst-{tyTypeDesc}).kind notin {tyChar, tyEnum, tyInt..tyFloat128, tyUInt8..tyUInt32}: result = t of tyOpenArray, tyVarargs, tySink: - if kind != skParam: result = t - else: result = typeAllowedAux(marker, t.sons[0], skVar, flags) + if kind != skParam: + result = t + else: + result = typeAllowedAux(marker, t.sons[0], skVar, flags) + of tyUncheckedArray: + if kind != skParam and taHeap notin flags: + result = t + else: + result = typeAllowedAux(marker, lastSon(t), kind, flags) of tySequence, tyOpt: if t.sons[0].kind != tyEmpty: result = typeAllowedAux(marker, t.sons[0], skVar, flags+{taHeap}) |