diff options
author | Araq <rumpf_a@web.de> | 2013-08-31 02:07:52 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2013-08-31 02:07:52 +0200 |
commit | 6cc06cd35dc3aab58eb78757e76d5b72e5646c52 (patch) | |
tree | 11d4f8986208af2a0b7a225ac1ba85b29828ead3 | |
parent | 4d9b2f671ad1c8109c8478c9a78e05e25def5f78 (diff) | |
download | Nim-6cc06cd35dc3aab58eb78757e76d5b72e5646c52.tar.gz |
fixes #569; C++ codegen works again
-rw-r--r-- | compiler/ccgexprs.nim | 19 | ||||
-rw-r--r-- | lib/system/ansi_c.nim | 2 | ||||
-rw-r--r-- | lib/system/gc.nim | 2 | ||||
-rw-r--r-- | lib/system/gc_ms.nim | 2 | ||||
-rw-r--r-- | tests/run/tvarious1.nim | 17 |
5 files changed, 26 insertions, 16 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 3475093cb..6b3906226 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -303,10 +303,11 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) = linefmt(p, cpsStmts, "$1 = $2;$n", rdLoc(dest), rdLoc(src)) of tyObject: # XXX: check for subtyping? - if needsComplexAssignment(dest.t): - if asgnComplexity(dest.t.n) <= 4: - discard getTypeDesc(p.module, dest.t) - genOptAsgnObject(p, dest, src, flags, dest.t.n) + if needsComplexAssignment(ty): + if asgnComplexity(ty.n) <= 4: + discard getTypeDesc(p.module, ty) + internalAssert ty.n != nil + genOptAsgnObject(p, dest, src, flags, ty.n) else: genGenericAsgn(p, dest, src, flags) else: @@ -642,14 +643,7 @@ proc genTupleElem(p: BProc, e: PNode, d: var TLoc) = case e.sons[1].kind of nkIntLit..nkUInt64Lit: i = int(e.sons[1].intVal) else: internalError(e.info, "genTupleElem") - when false: - if ty.n != nil: - var field = ty.n.sons[i].sym - if field == nil: InternalError(e.info, "genTupleElem") - if field.loc.r == nil: InternalError(e.info, "genTupleElem") - appf(r, ".$1", [field.loc.r]) - else: - appf(r, ".Field$1", [toRope(i)]) + appf(r, ".Field$1", [toRope(i)]) putIntoDest(p, d, ty.sons[i], r) proc genRecordField(p: BProc, e: PNode, d: var TLoc) = @@ -840,6 +834,7 @@ proc genAndOr(p: BProc, e: PNode, d: var TLoc, m: TMagic) = proc genEcho(p: BProc, n: PNode) = # this unusal way of implementing it ensures that e.g. ``echo("hallo", 45)`` # is threadsafe. + discard lists.IncludeStr(p.module.headerFiles, "<stdio.h>") var args: PRope = nil var a: TLoc for i in countup(1, n.len-1): diff --git a/lib/system/ansi_c.nim b/lib/system/ansi_c.nim index 06da34926..13e8496d2 100644 --- a/lib/system/ansi_c.nim +++ b/lib/system/ansi_c.nim @@ -58,7 +58,7 @@ else: proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {. header: "<setjmp.h>", importc: "longjmp".} -proc c_setjmp(jmpb: var C_JmpBuf): cint {. +proc c_setjmp(jmpb: C_JmpBuf): cint {. header: "<setjmp.h>", importc: "setjmp".} proc c_signal(sig: cint, handler: proc (a: cint) {.noconv.}) {. diff --git a/lib/system/gc.nim b/lib/system/gc.nim index 36c008bef..f5b68b9db 100644 --- a/lib/system/gc.nim +++ b/lib/system/gc.nim @@ -759,7 +759,7 @@ else: # Used to traverse the stack and registers assuming # that 'setjmp' will save registers in the C stack. type PStackSlice = ptr array [0..7, pointer] - var registers: C_JmpBuf + var registers {.noinit.}: C_JmpBuf if c_setjmp(registers) == 0'i32: # To fill the C stack with registers. var max = cast[TAddress](gch.stackBottom) var sp = cast[TAddress](addr(registers)) diff --git a/lib/system/gc_ms.nim b/lib/system/gc_ms.nim index 9ebc27a9f..2e3596985 100644 --- a/lib/system/gc_ms.nim +++ b/lib/system/gc_ms.nim @@ -449,7 +449,7 @@ else: # Used to traverse the stack and registers assuming # that 'setjmp' will save registers in the C stack. type PStackSlice = ptr array [0..7, pointer] - var registers: C_JmpBuf + var registers {.noinit.}: C_JmpBuf if c_setjmp(registers) == 0'i32: # To fill the C stack with registers. var max = cast[TAddress](gch.stackBottom) var sp = cast[TAddress](addr(registers)) diff --git a/tests/run/tvarious1.nim b/tests/run/tvarious1.nim index d30d91234..9dd4af606 100644 --- a/tests/run/tvarious1.nim +++ b/tests/run/tvarious1.nim @@ -1,7 +1,8 @@ discard """ file: "tlenopenarray.nim" output: '''1 -0''' +0 +Whopie''' """ echo len([1_000_000]) #OUT 1 @@ -12,3 +13,17 @@ type proc `[]`(v: TVector; idx: int): int = TArray(v)[idx] var v: TVector echo v[2] + +# bug #569 + +import queues + +type + TWidget = object + names: TQueue[string] + +var w = TWidget(names: initQueue[string]()) + +add(w.names, "Whopie") + +for n in w.names: echo(n) |