From 7804d6920846be7f538c2e6ad29bdd1771db994d Mon Sep 17 00:00:00 2001 From: jbj Date: Sat, 17 May 2003 02:34:45 +0000 Subject: [PATCH] Finish signed magnitude tests. CVS patchset: 6851 CVS date: 2003/05/17 02:34:45 --- python/mpw/test/test_methods.py | 92 +++++++++++++++++++++++++++++++++++------ python/rpmmpw-py.c | 48 ++++++++++++++++++--- python/sub.py | 57 ++++++++++++++++++------- 3 files changed, 164 insertions(+), 33 deletions(-) diff --git a/python/mpw/test/test_methods.py b/python/mpw/test/test_methods.py index 04ef234..7ac4c5b 100644 --- a/python/mpw/test/test_methods.py +++ b/python/mpw/test/test_methods.py @@ -3,22 +3,45 @@ Basic TestCases for BTree and hash DBs, with and without a DBEnv, with various DB flags, etc. """ -import os -import sys -import errno -import shutil -import string -import tempfile -from pprint import pprint import unittest import rpm -import mpz from test_all import verbose DASH = '-' +Methods = ( '__add__', '__sub__', '__mul__', '__div__', '__mod__', '__lshift__', '__rshift__', '__and__', '__xor__', '__or__') + +class Factory(object): + def __init__(self, false_self, method_name): + self.false_self = false_self + self.method_name = method_name + + def __call__(self, val): + xself = long(self.false_self) + yself = int(self.false_self) + xm = long.__getattribute__(xself, self.method_name) + ym = rpm.mpw.__getattribute__(yself, self.method_name) + xa = xm(long(val)) + ya = ym(int(val)) + print " Comparing", xa, ya + assert xa == ya + return xa + +class Long(long): + def __getattribute__(self, name): + print "__getattribute__ ~%s~" % name + if name not in ('__add__', '__sub__'): + return long.getattr(self, name) + return Factory(self, name) + +#a1 = Bar(1) +#a2 = Bar(2) +#print a1.__add__(a2) +#print "Done" +#print a1 + a2 + #---------------------------------------------------------------------- class BasicTestCase(unittest.TestCase): @@ -51,6 +74,9 @@ class BasicTestCase(unittest.TestCase): wa = rpm.mpw(self.a) wb = rpm.mpw(self.b) wc = rpm.mpw(self.c) +# xa - Long(self.a) +# xb = Long(self.b) +# xc = Long(self.c) za = long(self.a) zb = long(self.b) zc = long(self.c) @@ -135,10 +161,52 @@ class BasicTestCase(unittest.TestCase): print '\n', '-=' * 30 print "Running %s.test03_Signs..." % \ self.__class__.__name__ - a = 9876543210 - wa = -rpm.mpw(a); - za = -long(a); - print "-9876543210:\t", wa, "\t", za + wp = rpm.mpw(10) + wm = -wp + wpp = wp + 1 + wmm = -wpp + zp = long(10) + zm = -zp + zpp = zp + 1 + zmm = -zpp + print "add --:\t", (wm+wm), "\t", (zm+zm) + print "add -+:\t", (wm+wp), "\t", (zm+zp) + print "add +-:\t", (wp+wm), "\t", (zp+zm) + print "add ++:\t", (wp+wp), "\t", (zp+zp) + print "sub --:\t", (wm-wm), "\t", (zm-zm) + print "sub -+:\t", (wm-wp), "\t", (zm-zp) + print "sub +-:\t", (wp-wm), "\t", (zp-zm) + print "sub ++:\t", (wp-wp), "\t", (zp-zp) + print "mul --:\t", (wm*wm), "\t", (zm*zm) + print "mul -+:\t", (wm*wp), "\t", (zm*zp) + print "mul +-:\t", (wp*wm), "\t", (zp*zm) + print "mul ++:\t", (wp*wp), "\t", (zp*zp) + print "div --:\t", (wm/wm), "\t", (zm/zm) + print "div -+:\t", (wm/wp), "\t", (zm/zp) + print "div +-:\t", (wp/wm), "\t", (zp/zm) + print "div ++:\t", (wp/wp), "\t", (zp/zp) + print "pow --:\t", (wm**wm), "\t", (zm**zm) + print "pow -+:\t", (wm**wp), "\t", (zm**zp) + print "pow +-:\t", (wp**wm), "\t", (zp**zm) + print "pow ++:\t", (wp**wp), "\t", (zp**zp) + + wpa = rpm.mpw(13) + wma = -wpa + wpb = wpa - 3 + wmb = -wpb + zpa = long(13) + zma = -zpa + zpb = zpa - 3 + zmb = -zpb + print "mod --:\t", (wma%wmb), "\t", (zma%zmb) + print "mod -+:\t", (wma%wpb), "\t", (zma%zpb) + print "mod +-:\t", (wpa%wmb), "\t", (zpa%zmb) + print "mod ++:\t", (wpa%wpb), "\t", (zpa%zpb) + + print "rem --:\t", divmod(wma, wmb), "\t", divmod(zma, zmb) + print "rem -+:\t", divmod(wma, wpb), "\t", divmod(zma, zpb) + print "rem +-:\t", divmod(wpa, wmb), "\t", divmod(zpa, zmb) + print "rem ++:\t", divmod(wpa, wpb), "\t", divmod(zpa, zpb) pass #---------------------------------------- diff --git a/python/rpmmpw-py.c b/python/rpmmpw-py.c index f389985..4be45db 100644 --- a/python/rpmmpw-py.c +++ b/python/rpmmpw-py.c @@ -1422,9 +1422,10 @@ fprintf(stderr, "sub ++: borrow\n"); case '*': zsize = xsize + msize; zdata = alloca(zsize * sizeof(*zdata)); + zsign = x->ob_size * m->ob_size; mpmul(zdata, xsize, xdata, msize, mdata); z = mpw_FromMPW(zsize, zdata, 1); - if (zsign) + if (zsign < 0) z->ob_size = -z->ob_size; break; case '/': @@ -1437,6 +1438,7 @@ fprintf(stderr, "sub ++: borrow\n"); zsize = asize + 1; zdata = alloca(zsize * sizeof(*zdata)); + zsign = x->ob_size * m->ob_size; wksp = alloca((bsize+1) * sizeof(*wksp)); shift = mpnorm(bsize, bdata); @@ -1446,7 +1448,7 @@ fprintf(stderr, "sub ++: borrow\n"); zsize -= bsize; z = mpw_FromMPW(zsize, zdata, 1); - if (zsign) + if (zsign < 0) z->ob_size = -z->ob_size; break; case '%': @@ -1458,13 +1460,28 @@ fprintf(stderr, "sub ++: borrow\n"); zsize = asize; zdata = alloca(zsize * sizeof(*zdata)); + zsign = x->ob_size * m->ob_size; wksp = alloca((bsize+1) * sizeof(*wksp)); mpnmod(zdata, asize, adata, bsize, bdata, wksp); + if (zsign < 0) { + if (m->ob_size < 0) { + (void) mpsubx(zsize, zdata, bsize, bdata); + mpneg(zsize, zdata); + } else { + zsign = 0; + mpneg(zsize, zdata); + (void) mpaddx(zsize, zdata, bsize, bdata); + } + } z = mpw_FromMPW(zsize, zdata, 1); - if (zsign) + if (zsign < 0) { z->ob_size = -z->ob_size; + } else if (zsign > 0) { + if (x->ob_size < 0) + z->ob_size = -z->ob_size; + } break; case '<': /* XXX FIXME: enlarge? negative count? sign?. */ @@ -1520,10 +1537,15 @@ fprintf(stderr, "sub ++: borrow\n"); { mpnumber zn; mpnzero(&zn); - mpnpow_w(&zn, xsize, xdata, msize, mdata); + if (msize == 0 || (msize == 1 && *mdata == 0)) + mpnsetw(&zn, 1); + else if (m->ob_size < 0) + mpnsetw(&zn, 0); + else + mpnpow_w(&zn, xsize, xdata, msize, mdata); z = mpw_FromMPW(zn.size, zn.data, 1); mpnfree(&zn); - if (zsign) + if (zsign < 0) z->ob_size = -z->ob_size; } break; case 'G': @@ -1884,6 +1906,7 @@ mpw_divmod(PyObject * v, PyObject * w) size_t zsize; mpw* zdata; mpw* wksp; + int qsign = 0; if (a == NULL || b == NULL) goto exit; @@ -1910,6 +1933,7 @@ mpw_divmod(PyObject * v, PyObject * w) bsize -= bnorm; bdata += bnorm; } + qsign = a->ob_size * b->ob_size; wksp = alloca((bsize+1) * sizeof(*wksp)); mpndivmod(zdata, asize, adata, bsize, bdata, wksp); @@ -1924,12 +1948,26 @@ fprintf(stderr, " z %p[%d]:\t", zdata, zsize), mpfprintln(stderr, zsize, zdat r = mpw_FromMPW(bsize, zdata+zsize, 1); if (r == NULL) goto exit; + if (qsign < 0) { + if (b->ob_size < 0) { + (void) mpsubx(MPW_SIZE(r), MPW_DATA(r), bsize, bdata); + mpneg(MPW_SIZE(r), MPW_DATA(r)); + } else { + mpneg(MPW_SIZE(r), MPW_DATA(r)); + (void) mpaddx(MPW_SIZE(r), MPW_DATA(r), bsize, bdata); + } + (void) mpaddw(zsize, zdata, (mpw)1); + } + if (b->ob_size < 0) + r->ob_size = -r->ob_size; q = mpw_FromMPW(zsize, zdata, 1); if (q == NULL) { Py_DECREF(r); goto exit; } + if (qsign < 0) + q->ob_size = -q->ob_size; if (_mpw_debug) { prtmpw("q", q); diff --git a/python/sub.py b/python/sub.py index 6ad57a7..e4230cb 100644 --- a/python/sub.py +++ b/python/sub.py @@ -1,28 +1,53 @@ +import rpm + +rpm.mpw().Debug(1) + +Methods = ( '__neg__', '__pos__', '__abs__', '__invert__', '__add__', '__sub__', '__mul__', '__div__', '__mod__', '__divmod__', '__pow__', '__lshift__', '__rshift__', '__and__', '__xor__', '__or__') + class Factory(object): def __init__(self, false_self, method_name): self.false_self = false_self self.method_name = method_name def __call__(self, val): - lself = long(self.false_self) - iself = int(self.false_self) - lm = long.__getattribute__(lself, self.method_name) - im = int.__getattribute__(iself, self.method_name) - la = lm(long(val)) - ia = im(int(val)) - print " Comparing", la, ia - assert la == ia - return la - -class Bar(long): + xself = long(self.false_self) + yself = rpm.mpw(self.false_self) + xm = long.__getattribute__(xself, self.method_name) + ym = rpm.mpw.__getattribute__(yself, self.method_name) + xa = xm(long(val)) + ya = ym(rpm.mpw(val)) + print " Comparing", self.method_name, type(xa), xa, type(ya), ya + assert xa == ya + return xa + +class Long(long): def __getattribute__(self, name): print "__getattribute__ ~%s~" % name - if name not in ('__add__', '__sub__', ): + if name not in Methods: return long.getattr(self, name) return Factory(self, name) -a1 = Bar(1) -a2 = Bar(2) +a1 = Long(0x987654321) +a2 = Long(0x10) +a3 = Long(0x0fedcba000000000) + +#print a1.__neg__() +#print a1.__pos__() +#print a1.__abs__() +#print a1.__invert__() + print a1.__add__(a2) -print "Done" -print a1 + a2 +print a1.__sub__(a2) +print a1.__mul__(a2) +print a1.__div__(a2) +print a1.__mod__(a2) + +#print a1.__divmod(a2) + +print a1.__pow__(a2) + +print a1.__lshift__(a2) +print a1.__rshift__(a2) +print a1.__and__(a3) +print a1.__xor__(a3) +print a1.__or__(a3) -- 2.7.4