From 4a50b8da637d7e13242d5258bd0a359fc676853f Mon Sep 17 00:00:00 2001 From: Yuriy Glukhov Date: Wed, 7 Aug 2019 12:23:46 +0300 Subject: [PATCH] Fixed #111 --- nimpy.nim | 15 +++++++++++++++ nimpy/py_lib.nim | 3 +++ tests/tpyfromnim.nim | 4 ++++ 3 files changed, 22 insertions(+) diff --git a/nimpy.nim b/nimpy.nim index 7fd5ed0fe..f318515c7 100644 --- a/nimpy.nim +++ b/nimpy.nim @@ -105,6 +105,13 @@ const Py_MLFLAGS_CLASS = (1 shl 4) Py_MLFLAGS_STATIC = (1 shl 5) + # Rich comparison opcodes + Py_LT = 0 + Py_LE = 1 + Py_EQ = 2 + Py_NE = 3 + Py_GT = 4 + Py_GE = 5 type PyModuleDesc = object @@ -1272,3 +1279,11 @@ proc dir*(v: PyObject): seq[string] = proc pyBuiltinsModule*(): PyObject = initPyLibIfNeeded() pyImport(if pyLib.pythonVersion == 3: "builtins" else: "__builtin__") + +proc `==`*(a, b: PyObject): bool = + if a.isNil and b.isNil: + true + elif (not a.isNil) and (not b.isNil): + pyLib.PyObject_RichCompareBool(a.rawPyObj, b.rawPyObj, Py_EQ) == 1 + else: + false diff --git a/nimpy/py_lib.nim b/nimpy/py_lib.nim index 65ca67426..76828cd07 100644 --- a/nimpy/py_lib.nim +++ b/nimpy/py_lib.nim @@ -31,6 +31,7 @@ type PyObject_GetIter*: proc(o: PPyObject): PPyObject {.cdecl.} PyObject_GetItem*: proc(o, k: PPyObject): PPyObject {.cdecl.} PyObject_SetItem*: proc(o, k, v: PPyObject): cint {.cdecl.} + PyObject_RichCompareBool*: proc(a, b: PPyObject, op: cint): cint {.cdecl.} PyObject_GetBuffer*: proc(o: PPyObject, b: var RawPyBuffer, flags: cint): cint {.cdecl.} PyBuffer_Release*: proc(b: var RawPyBuffer) {.cdecl.} @@ -188,6 +189,8 @@ proc loadPyLibFromModule(m: LibHandle): PyLib = load PyObject_GetIter load PyObject_GetItem load PyObject_SetItem + load PyObject_RichCompareBool + maybeLoad PyObject_GetBuffer maybeLoad PyBuffer_Release diff --git a/tests/tpyfromnim.nim b/tests/tpyfromnim.nim index 94831c527..d5115f893 100644 --- a/tests/tpyfromnim.nim +++ b/tests/tpyfromnim.nim @@ -195,6 +195,10 @@ proc test*() = doAssert(bb == 2) doAssert(cc == "Hello") + block: # Comparison + let py = pyBuiltinsModule() + doAssert(py.None == py.None) + when isMainModule: test() echo "Test complete!"