diff options
author | Araq <rumpf_a@web.de> | 2014-01-18 00:58:59 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-01-18 00:58:59 +0100 |
commit | 5073914b8697a9fd1dc38bebef434b50850f2861 (patch) | |
tree | 13fb2aaae8491773a0d0c04f3989b72e3efbecf5 | |
parent | 383fbca27ef4f4e0b5eae0e0e02029fe644248ac (diff) | |
download | Nim-5073914b8697a9fd1dc38bebef434b50850f2861.tar.gz |
unittest module works again
-rw-r--r-- | compiler/vmgen.nim | 13 | ||||
-rw-r--r-- | lib/pure/unittest.nim | 11 | ||||
-rw-r--r-- | lib/windows/windows.nim | 19 | ||||
-rw-r--r-- | tests/assert/tunittests.nim | 2 | ||||
-rw-r--r-- | tests/template/utemplates.nim | 2 | ||||
-rw-r--r-- | todo.txt | 1 |
6 files changed, 20 insertions, 28 deletions
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index af1991bad..aea05bb2c 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -204,10 +204,13 @@ proc gen(c: PCtx; n: PNode) = proc genx(c: PCtx; n: PNode): TRegister = var tmp: TDest = -1 gen(c, n, tmp) + internalAssert tmp >= 0 result = TRegister(tmp) proc clearDest(n: PNode; dest: var TDest) {.inline.} = - if isEmptyType(n.typ): dest = -1 + # stmt is different from 'void' in meta programming contexts. + # So we only set dest to -1 if 'void': + if n.typ.isNil or n.typ.kind == tyEmpty: dest = -1 proc isNotOpr(n: PNode): bool = n.kind in nkCallKinds and n.sons[0].kind == nkSym and @@ -442,7 +445,6 @@ proc genCall(c: PCtx; n: PNode; dest: var TDest) = else: c.gABC(n, opcIndCallAsgn, dest, x, n.len) c.freeTempRange(x, n.len) - clearDest(n, dest) proc needsAsgnPatch(n: PNode): bool = n.kind in {nkBracketExpr, nkDotExpr, nkCheckedFieldExpr} @@ -590,6 +592,7 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) = unused(n, dest) var d = c.genx(n.sons[1]).TDest c.genAddSubInt(n, d, if m == mInc: opcAddInt else: opcSubInt) + c.genAsgnPatch(n.sons[1], d) c.freeTemp(d.TRegister) of mOrd, mChr, mArrToSeq: c.gen(n.sons[1], dest) of mNew, mNewFinalize: @@ -685,6 +688,7 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) = var d = c.genx(n.sons[1]) var tmp = c.genx(n.sons[2]) c.gABC(n, if m == mSetLengthStr: opcSetLenStr else: opcSetLenSeq, d, tmp) + c.genAsgnPatch(n.sons[1], d) c.freeTemp(tmp) of mSwap: unused(n, dest) @@ -838,6 +842,7 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) = of mNGenSym: genBinaryABC(c, n, dest, opcGenSym) of mMinI, mMaxI, mMinI64, mMaxI64, mAbsF64, mMinF64, mMaxF64, mAbsI, mAbsI64: c.genCall(n, dest) + clearDest(n, dest) of mExpandToAst: if n.len != 2: globalError(n.info, errGenerated, "expandToAst requires 1 argument") @@ -845,7 +850,10 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) = if arg.kind in nkCallKinds: #if arg[0].kind != nkSym or arg[0].sym.kind notin {skTemplate, skMacro}: # "ExpandToAst: expanded symbol is no macro or template" + if dest < 0: dest = c.getTemp(n.typ) c.genCall(arg, dest) + # do not call clearDest(n, dest) here as getAst has a meta-type as such + # produces a value else: globalError(n.info, "expandToAst requires a call expression") else: @@ -1248,6 +1256,7 @@ proc gen(c: PCtx; n: PNode; dest: var TDest) = genMagic(c, n, dest) else: genCall(c, n, dest) + clearDest(n, dest) of nkCharLit..nkInt64Lit: if isInt16Lit(n): if dest < 0: dest = c.getTemp(n.typ) diff --git a/lib/pure/unittest.nim b/lib/pure/unittest.nim index f847d24f4..f5640a1b4 100644 --- a/lib/pure/unittest.nim +++ b/lib/pure/unittest.nim @@ -37,8 +37,8 @@ var checkpoints: seq[string] = @[] -template TestSetupIMPL*: stmt {.immediate, dirty.} = nil -template TestTeardownIMPL*: stmt {.immediate, dirty.} = nil +template TestSetupIMPL*: stmt {.immediate, dirty.} = discard +template TestTeardownIMPL*: stmt {.immediate, dirty.} = discard proc shouldRun(testName: string): bool = result = true @@ -126,7 +126,7 @@ macro check*(conditions: stmt): stmt {.immediate.} = for i in 1 .. <exp.len: if exp[i].kind notin nnkLiterals: inc counter - var arg = newIdentNode(":p" & ($counter)) + var arg = newIdentNode(":p" & $counter) var argStr = exp[i].toStrLit if exp[i].kind in nnkCallKinds: inspectArgs(exp[i]) argsAsgns.add getAst(asgn(arg, exp[i])) @@ -146,7 +146,8 @@ macro check*(conditions: stmt): stmt {.immediate.} = var checkedStr = checked.toStrLit inspectArgs(checked) - result = getAst(rewrite(checked, checked.lineinfo, checkedStr, argsAsgns, argsPrintOuts)) + result = getAst(rewrite(checked, checked.lineinfo, checkedStr, + argsAsgns, argsPrintOuts)) of nnkStmtList: result = newNimNode(nnkStmtList) @@ -176,7 +177,7 @@ macro expect*(exceptions: varargs[expr], body: stmt): stmt {.immediate.} = checkpoint(lineInfoLit & ": Expect Failed, no exception was thrown.") fail() except errorTypes: - nil + discard var body = exp[exp.len - 1] diff --git a/lib/windows/windows.nim b/lib/windows/windows.nim index 9b55b47b9..dd743ffa4 100644 --- a/lib/windows/windows.nim +++ b/lib/windows/windows.nim @@ -21856,15 +21856,9 @@ proc InflateRect*(lprc: var TRect, dx, dy: int): WINBOOL{.stdcall, dynlib: "user32", importc: "InflateRect".} proc InitializeAcl*(pAcl: var TACL, nAclLength, dwAclRevision: DWORD): WINBOOL{. stdcall, dynlib: "advapi32", importc: "InitializeAcl".} -proc InitializeCriticalSectionAndSpinCount*( - lpCriticalSection: var TRTLCriticalSection, dwSpinCount: DWORD): WINBOOL{. - stdcall, dynlib: "kernel32", - importc: "InitializeCriticalSectionAndSpinCount".} proc InitializeSid*(Sid: Pointer, pIdentifierAuthority: TSIDIdentifierAuthority, nSubAuthorityCount: int8): WINBOOL{.stdcall, dynlib: "advapi32", importc: "InitializeSid".} -proc InsertMenuItem*(p1: HMENU, p2: UINT, p3: WINBOOL, p4: TMenuItemInfo): WINBOOL{. - stdcall, dynlib: "user32", importc: "InsertMenuItemA".} proc InsertMenuItemA*(p1: HMENU, p2: UINT, p3: WINBOOL, p4: TMenuItemInfoA): WINBOOL{. stdcall, dynlib: "user32", importc: "InsertMenuItemA".} #function InsertMenuItemW(p1: HMENU; p2: UINT; p3: WINBOOL; const p4: TMenuItemInfoW): WINBOOL; stdcall; external 'user32' name 'InsertMenuItemW'; @@ -22362,11 +22356,6 @@ proc SetConsoleCursorInfo*(hConsoleOutput: THandle, lpConsoleCursorInfo: TConsoleCursorInfo): WINBOOL{. stdcall, dynlib: "kernel32", importc: "SetConsoleCursorInfo".} #function SetConsoleWindowInfo(hConsoleOutput: THandle; bAbsolute: WINBOOL; const lpConsoleWindow: TSmallRect): WINBOOL; stdcall; external 'kernel32' name 'SetConsoleWindowInfo'; -proc SetCriticalSectionSpinCount*(lpCriticalSection: var TRTLCriticalSection, - dwSpinCount: DWORD): DWORD{.stdcall, - dynlib: "kernel32", importc: "SetCriticalSectionSpinCount".} -proc SetDeviceGammaRamp*(DC: HDC, Ramp: pointer): WINBOOL{.stdcall, - dynlib: "gdi32", importc: "SetDeviceGammaRamp".} proc SetDIBColorTable*(DC: HDC, p2, p3: UINT, RGBQuadSTructs: pointer): UINT{. stdcall, dynlib: "gdi32", importc: "SetDIBColorTable".} proc SetDIBits*(DC: HDC, Bitmap: HBITMAP, StartScan, NumScans: UINT, @@ -22476,8 +22465,6 @@ proc TranslateMDISysAccel*(hWndClient: HWND, lpMsg: TMsg): WINBOOL{.stdcall, proc TranslateMessage*(lpMsg: TMsg): WINBOOL{.stdcall, dynlib: "user32", importc: "TranslateMessage".} #function TransparentDIBits(DC: HDC; p2, p3, p4, p5: Integer; const p6: Pointer; const p7: PBitmapInfo; p8: UINT; p9, p10, p11, p12: Integer; p13: UINT): WINBOOL;stdcall; external 'gdi32' name 'TransparentDIBits'; -proc TryEnterCriticalSection*(lpCriticalSection: var TRTLCriticalSection): WINBOOL{. - stdcall, dynlib: "kernel32", importc: "TryEnterCriticalSection".} proc UnhandledExceptionFilter*(ExceptionInfo: TExceptionPointers): int32{. stdcall, dynlib: "kernel32", importc: "UnhandledExceptionFilter".} proc UnionRect*(lprcDst: var TRect, lprcSrc1, lprcSrc2: TRect): WINBOOL{. @@ -22847,12 +22834,6 @@ proc SUBLANGID*(lgid: int32): int32 = # return type might be wrong result = toU16(lgid) shr 10'i16 -proc LANGIDFROMLCID*(lcid: int32): int16 = - result = toU16(lcid) - -proc SORTIDFROMLCID*(lcid: int32): int16 = - result = toU16((lcid and 0x000FFFFF'i32) shr 16'i32) - proc MAKELCID*(lgid, srtid: int32): DWORD = result = toU32(srtid shl 16'i32 or lgid and 0xffff'i32) diff --git a/tests/assert/tunittests.nim b/tests/assert/tunittests.nim index c77f691d9..cbbfe63c6 100644 --- a/tests/assert/tunittests.nim +++ b/tests/assert/tunittests.nim @@ -1 +1 @@ -import utemplates, uclosures +import "../template/utemplates", "../closure/uclosures" diff --git a/tests/template/utemplates.nim b/tests/template/utemplates.nim index 68fbb23a6..38ad4f515 100644 --- a/tests/template/utemplates.nim +++ b/tests/template/utemplates.nim @@ -18,7 +18,7 @@ test "previous definitions can be further overloaded or hidden in local scopes": check t("test") == "string" test "templates can be redefined multiple times": - template customAssert(cond: bool, msg: string): stmt = + template customAssert(cond: bool, msg: string): stmt {.immediate, dirty.} = if not cond: fail(msg) template assertion_failed(body: stmt) {.immediate.} = diff --git a/todo.txt b/todo.txt index 88bd070ac..c29638e29 100644 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,7 @@ version 0.9.4 ============= +- ``--gc:none`` should complain about when you use the GC - ensure (ref T)(a, b) works as a type conversion and type constructor - Aporia doesn't compile under devel - document new templating symbol binding rules |