diff options
author | Araq <rumpf_a@web.de> | 2014-08-20 02:14:39 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-08-20 02:14:39 +0200 |
commit | e5fd84c5591f5ed0a1e53c1509b25fd2a3f00cd5 (patch) | |
tree | 998b2d426970b16b84f3236a4416ca35ead1d9fd | |
parent | 15b2d6d351ab96eb2f84e466d1cebd04f70448c8 (diff) | |
parent | daa8b559b6bb7ab05e3922a210c1ae5ade1848de (diff) | |
download | Nim-e5fd84c5591f5ed0a1e53c1509b25fd2a3f00cd5.tar.gz |
Merge branch 'devel' of https://github.com/Araq/Nimrod into devel
-rw-r--r-- | lib/pure/asyncdispatch.nim | 21 | ||||
-rw-r--r-- | lib/system/arithm.nim | 28 |
2 files changed, 38 insertions, 11 deletions
diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim index 5597acf6f..5dfcf4656 100644 --- a/lib/pure/asyncdispatch.nim +++ b/lib/pure/asyncdispatch.nim @@ -180,6 +180,27 @@ proc asyncCheck*[T](future: PFuture[T]) = echoOriginalStackTrace(future) raise future.error +proc `and`*[T, Y](fut1: PFuture[T], fut2: PFuture[Y]): PFuture[void] = + ## Returns a future which will complete once both ``fut1`` and ``fut2`` + ## complete. + var retFuture = newFuture[void]() + fut1.callback = + proc () = + if fut2.finished: retFuture.complete() + fut2.callback = + proc () = + if fut1.finished: retFuture.complete() + return retFuture + +proc `or`*[T, Y](fut1: PFuture[T], fut2: PFuture[Y]): PFuture[void] = + ## Returns a future which will complete once either ``fut1`` or ``fut2`` + ## complete. + var retFuture = newFuture[void]() + proc cb() = + if not retFuture.finished: retFuture.complete() + fut1.callback = cb + fut2.callback = cb + type PDispatcherBase = ref object of PObject timers: seq[tuple[finishAt: float, fut: PFuture[void]]] diff --git a/lib/system/arithm.nim b/lib/system/arithm.nim index bb15360fd..7672947cd 100644 --- a/lib/system/arithm.nim +++ b/lib/system/arithm.nim @@ -114,63 +114,69 @@ when asmVersion and not defined(gcc) and not defined(llvm_gcc): proc addInt(a, b: int): int {.compilerProc, asmNoStackFrame.} = # a in eax, and b in edx asm """ - mov eax, `a` - add eax, `b` + mov eax, ecx + add eax, edx jno theEnd call `raiseOverflow` theEnd: + ret """ proc subInt(a, b: int): int {.compilerProc, asmNoStackFrame.} = asm """ - mov eax, `a` - sub eax, `b` + mov eax, ecx + sub eax, edx jno theEnd call `raiseOverflow` theEnd: + ret """ proc negInt(a: int): int {.compilerProc, asmNoStackFrame.} = asm """ - mov eax, `a` + mov eax, ecx neg eax jno theEnd call `raiseOverflow` theEnd: + ret """ proc divInt(a, b: int): int {.compilerProc, asmNoStackFrame.} = asm """ - mov eax, `a` - mov ecx, `b` + mov eax, ecx + mov ecx, edx xor edx, edx idiv ecx jno theEnd call `raiseOverflow` theEnd: + ret """ proc modInt(a, b: int): int {.compilerProc, asmNoStackFrame.} = asm """ - mov eax, `a` - mov ecx, `b` + mov eax, ecx + mov ecx, edx xor edx, edx idiv ecx jno theEnd call `raiseOverflow` theEnd: mov eax, edx + ret """ proc mulInt(a, b: int): int {.compilerProc, asmNoStackFrame.} = asm """ - mov eax, `a` - mov ecx, `b` + mov eax, ecx + mov ecx, edx xor edx, edx imul ecx jno theEnd call `raiseOverflow` theEnd: + ret """ elif false: # asmVersion and (defined(gcc) or defined(llvm_gcc)): |