fixes #569; C++ codegen works again
This commit is contained in:
parent
4d9b2f671a
commit
6cc06cd35d
5 changed files with 26 additions and 16 deletions
|
|
@ -303,10 +303,11 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) =
|
||||||
linefmt(p, cpsStmts, "$1 = $2;$n", rdLoc(dest), rdLoc(src))
|
linefmt(p, cpsStmts, "$1 = $2;$n", rdLoc(dest), rdLoc(src))
|
||||||
of tyObject:
|
of tyObject:
|
||||||
# XXX: check for subtyping?
|
# XXX: check for subtyping?
|
||||||
if needsComplexAssignment(dest.t):
|
if needsComplexAssignment(ty):
|
||||||
if asgnComplexity(dest.t.n) <= 4:
|
if asgnComplexity(ty.n) <= 4:
|
||||||
discard getTypeDesc(p.module, dest.t)
|
discard getTypeDesc(p.module, ty)
|
||||||
genOptAsgnObject(p, dest, src, flags, dest.t.n)
|
internalAssert ty.n != nil
|
||||||
|
genOptAsgnObject(p, dest, src, flags, ty.n)
|
||||||
else:
|
else:
|
||||||
genGenericAsgn(p, dest, src, flags)
|
genGenericAsgn(p, dest, src, flags)
|
||||||
else:
|
else:
|
||||||
|
|
@ -642,13 +643,6 @@ proc genTupleElem(p: BProc, e: PNode, d: var TLoc) =
|
||||||
case e.sons[1].kind
|
case e.sons[1].kind
|
||||||
of nkIntLit..nkUInt64Lit: i = int(e.sons[1].intVal)
|
of nkIntLit..nkUInt64Lit: i = int(e.sons[1].intVal)
|
||||||
else: internalError(e.info, "genTupleElem")
|
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)
|
putIntoDest(p, d, ty.sons[i], r)
|
||||||
|
|
||||||
|
|
@ -840,6 +834,7 @@ proc genAndOr(p: BProc, e: PNode, d: var TLoc, m: TMagic) =
|
||||||
proc genEcho(p: BProc, n: PNode) =
|
proc genEcho(p: BProc, n: PNode) =
|
||||||
# this unusal way of implementing it ensures that e.g. ``echo("hallo", 45)``
|
# this unusal way of implementing it ensures that e.g. ``echo("hallo", 45)``
|
||||||
# is threadsafe.
|
# is threadsafe.
|
||||||
|
discard lists.IncludeStr(p.module.headerFiles, "<stdio.h>")
|
||||||
var args: PRope = nil
|
var args: PRope = nil
|
||||||
var a: TLoc
|
var a: TLoc
|
||||||
for i in countup(1, n.len-1):
|
for i in countup(1, n.len-1):
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ else:
|
||||||
|
|
||||||
proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
|
proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
|
||||||
header: "<setjmp.h>", importc: "longjmp".}
|
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".}
|
header: "<setjmp.h>", importc: "setjmp".}
|
||||||
|
|
||||||
proc c_signal(sig: cint, handler: proc (a: cint) {.noconv.}) {.
|
proc c_signal(sig: cint, handler: proc (a: cint) {.noconv.}) {.
|
||||||
|
|
|
||||||
|
|
@ -759,7 +759,7 @@ else:
|
||||||
# Used to traverse the stack and registers assuming
|
# Used to traverse the stack and registers assuming
|
||||||
# that 'setjmp' will save registers in the C stack.
|
# that 'setjmp' will save registers in the C stack.
|
||||||
type PStackSlice = ptr array [0..7, pointer]
|
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.
|
if c_setjmp(registers) == 0'i32: # To fill the C stack with registers.
|
||||||
var max = cast[TAddress](gch.stackBottom)
|
var max = cast[TAddress](gch.stackBottom)
|
||||||
var sp = cast[TAddress](addr(registers))
|
var sp = cast[TAddress](addr(registers))
|
||||||
|
|
|
||||||
|
|
@ -449,7 +449,7 @@ else:
|
||||||
# Used to traverse the stack and registers assuming
|
# Used to traverse the stack and registers assuming
|
||||||
# that 'setjmp' will save registers in the C stack.
|
# that 'setjmp' will save registers in the C stack.
|
||||||
type PStackSlice = ptr array [0..7, pointer]
|
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.
|
if c_setjmp(registers) == 0'i32: # To fill the C stack with registers.
|
||||||
var max = cast[TAddress](gch.stackBottom)
|
var max = cast[TAddress](gch.stackBottom)
|
||||||
var sp = cast[TAddress](addr(registers))
|
var sp = cast[TAddress](addr(registers))
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
discard """
|
discard """
|
||||||
file: "tlenopenarray.nim"
|
file: "tlenopenarray.nim"
|
||||||
output: '''1
|
output: '''1
|
||||||
0'''
|
0
|
||||||
|
Whopie'''
|
||||||
"""
|
"""
|
||||||
|
|
||||||
echo len([1_000_000]) #OUT 1
|
echo len([1_000_000]) #OUT 1
|
||||||
|
|
@ -12,3 +13,17 @@ type
|
||||||
proc `[]`(v: TVector; idx: int): int = TArray(v)[idx]
|
proc `[]`(v: TVector; idx: int): int = TArray(v)[idx]
|
||||||
var v: TVector
|
var v: TVector
|
||||||
echo v[2]
|
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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue