Merge pull request #4960 from krux02/comparison-fix

fixed `==` and cmp to work on nimvm
This commit is contained in:
Andreas Rumpf 2016-10-27 00:57:31 +02:00 • committed by GitHub
commit 38ad7400fa

View file

@ -2176,25 +2176,34 @@ proc `&` *[T](x: T, y: seq[T]): seq[T] {.noSideEffect.} =
for i in 0..y.len-1: for i in 0..y.len-1:
result[i+1] = y[i] result[i+1] = y[i]
when not defined(nimscript): proc `==` *[T](x, y: seq[T]): bool {.noSideEffect.} =
when not defined(JS) or defined(nimphp): ## Generic equals operator for sequences: relies on a equals operator for
proc seqToPtr[T](x: seq[T]): pointer {.inline, nosideeffect.} = ## the element type `T`.
result = cast[pointer](x) when nimvm:
if x.isNil and y.isNil:
return true
else: else:
proc seqToPtr[T](x: seq[T]): pointer {.asmNoStackFrame, nosideeffect.} = when not defined(JS) or defined(nimphp):
asm """return `x`""" proc seqToPtr[T](x: seq[T]): pointer {.inline, nosideeffect.} =
result = cast[pointer](x)
proc `==` *[T](x, y: seq[T]): bool {.noSideEffect.} = else:
## Generic equals operator for sequences: relies on a equals operator for proc seqToPtr[T](x: seq[T]): pointer {.asmNoStackFrame, nosideeffect.} =
## the element type `T`. asm """return `x`"""
if seqToPtr(x) == seqToPtr(y): if seqToPtr(x) == seqToPtr(y):
result = true return true
elif seqToPtr(x) == nil or seqToPtr(y) == nil:
result = false if x.isNil or y.isNil:
elif x.len == y.len: return false
for i in 0..x.len-1:
if x[i] != y[i]: return false if x.len != y.len:
result = true return false
for i in 0..x.len-1:
if x[i] != y[i]:
return false
return true
proc find*[T, S](a: T, item: S): int {.inline.}= proc find*[T, S](a: T, item: S): int {.inline.}=
## Returns the first index of `item` in `a` or -1 if not found. This requires ## Returns the first index of `item` in `a` or -1 if not found. This requires
@ -2632,10 +2641,15 @@ when not defined(JS): #and not defined(nimscript):
include "system/ansi_c" include "system/ansi_c"
when not defined(nimscript): proc cmp(x, y: string): int =
proc cmp(x, y: string): int = when nimvm:
if x < y: result = -1
elif x > y: result = 1
else: result = 0
else:
result = int(c_strcmp(x, y)) result = int(c_strcmp(x, y))
when not defined(nimscript):
proc zeroMem(p: pointer, size: Natural) = proc zeroMem(p: pointer, size: Natural) =
c_memset(p, 0, size) c_memset(p, 0, size)
proc copyMem(dest, source: pointer, size: Natural) = proc copyMem(dest, source: pointer, size: Natural) =
@ -2645,12 +2659,6 @@ when not defined(JS): #and not defined(nimscript):
proc equalMem(a, b: pointer, size: Natural): bool = proc equalMem(a, b: pointer, size: Natural): bool =
c_memcmp(a, b, size) == 0 c_memcmp(a, b, size) == 0
else:
proc cmp(x, y: string): int =
if x < y: result = -1
elif x > y: result = 1
else: result = 0
when defined(nimscript): when defined(nimscript):
proc readFile*(filename: string): string {.tags: [ReadIOEffect], benign.} proc readFile*(filename: string): string {.tags: [ReadIOEffect], benign.}
## Opens a file named `filename` for reading, calls `readAll ## Opens a file named `filename` for reading, calls `readAll