RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [email protected] Module: rpm Date: 29-Jul-2009 18:28:39 Branch: HEAD Handle: 2009072916283801 Modified files: rpm/js rpmmpw-js.c rpm/js/tscripts Mpw.js Log: - js: add unary operations and better mpw test cases. Summary: Revision Changes Path 1.3 +106 -6 rpm/js/rpmmpw-js.c 1.3 +219 -0 rpm/js/tscripts/Mpw.js ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/js/rpmmpw-js.c ============================================================================ $ cvs diff -u -r1.2 -r1.3 rpmmpw-js.c --- rpm/js/rpmmpw-js.c 28 Jul 2009 16:11:49 -0000 1.2 +++ rpm/js/rpmmpw-js.c 29 Jul 2009 16:28:38 -0000 1.3 @@ -1,4 +1,4 @@ -/** \ingroup js_c +/** * \file js/rpmmpw-js.c */ @@ -540,7 +540,7 @@ i += 2; /* space to hold e.g. '6#' */ } - s = xcalloc(1, i); + s = xcalloc(1, i+1); /* get the beginning of the string memory and start copying things */ te = s; @@ -1503,6 +1503,7 @@ JSObject *o; JSBool ok = JS_FALSE; +assert(z != NULL); if ((o = JS_NewObject(cx, &rpmmpwClass, NULL, NULL)) != NULL && JS_SetPrivate(cx, o, (void *)z)) { @@ -1569,10 +1570,9 @@ JSBool ok; _METHOD_DEBUG_ENTRY(_debug); - if ((ok = JS_ConvertArguments(cx, argc, argv, "oo", &xo, &yo))) { - void * z = mpw_ops2("Gcd", 'G', mpw_i2mpw(cx, xo), mpw_i2mpw(cx, yo)); - ok = mpw_wrap(cx, rval, z); - } + if ((ok = JS_ConvertArguments(cx, argc, argv, "oo", &xo, &yo))) + ok = mpw_wrap(cx, rval, + mpw_ops2("Gcd", 'G', mpw_i2mpw(cx, xo), mpw_i2mpw(cx, yo))); return ok; } @@ -1879,6 +1879,99 @@ return ok; } +static JSBool +mpw_neg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmpwClass, NULL); + mpwObject * a = ptr; + mpwObject * z = mpw_Copy(a); + JSBool ok = JSVAL_TRUE; + +_METHOD_DEBUG_ENTRY(_debug); + if (z != NULL) + z->ob_size = -(a->ob_size); + + ok = mpw_wrap(cx, rval, z); + +if (z != NULL && _debug) +fprintf(stderr, "<== mpw_neg %p[%d]\t", MPW_DATA(z), MPW_SIZE(z)), mpfprintln(stderr, MPW_SIZE(z), MPW_DATA(z)); + + return ok; +} + +static JSBool +mpw_pos(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmpwClass, NULL); + mpwObject * a = ptr; + mpwObject * z = mpw_Copy(a); + JSBool ok = JSVAL_TRUE; + +_METHOD_DEBUG_ENTRY(_debug); + + ok = mpw_wrap(cx, rval, z); + +if (z != NULL && _debug) +fprintf(stderr, "<== mpw_pos %p[%d]\t", MPW_DATA(z), MPW_SIZE(z)), mpfprintln(stderr, MPW_SIZE(z), MPW_DATA(z)); + + return ok; +} + +static JSBool +mpw_abs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmpwClass, NULL); + mpwObject * a = ptr; + JSBool ok = JSVAL_TRUE; + +_METHOD_DEBUG_ENTRY(_debug); + if (a->ob_size < 0) + ok = mpw_neg(cx, obj, argc, argv, rval); + else + ok = mpw_pos(cx, obj, argc, argv, rval); + + return ok; +} + +static JSBool +mpw_nonzero(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmpwClass, NULL); + mpwObject * a = ptr; + JSBool ok = JSVAL_TRUE; + int i = ABS(a->ob_size); + +_METHOD_DEBUG_ENTRY(_debug); + while (--i >= 0) { + if (a->data[i] != 0) + break; + } + *rval = i >= 0 ? JSVAL_TRUE : JSVAL_FALSE; + return ok; +} + +static JSBool +mpw_invert(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmpwClass, NULL); + mpwObject * a = ptr; + mpwObject * z = mpw_Copy(a); + JSBool ok = JSVAL_TRUE; + +_METHOD_DEBUG_ENTRY(_debug); + /* Implement ~z as -(z+1) */ + if (z != NULL) { + mpw val = 1; + int carry = mpaddx(MPW_SIZE(z), MPW_DATA(z), 1, &val); + carry = carry; /* XXX gcc warning */ + z->ob_size = -(a->ob_size); + } + + ok = mpw_wrap(cx, rval, z); + + return ok; +} + static JSFunctionSpec rpmmpw_funcs[] = { JS_FS("toString", mpw_toString, 0,0,0), @@ -1901,6 +1994,13 @@ JS_FS("__and__", mpw_and, 0,0,0), JS_FS("__xor__", mpw_xor, 0,0,0), JS_FS("__or__", mpw_or, 0,0,0), + + JS_FS("__neg__", mpw_neg, 0,0,0), + JS_FS("__pos__", mpw_pos, 0,0,0), + JS_FS("__abs__", mpw_abs, 0,0,0), + JS_FS("__nonzero__",mpw_nonzero, 0,0,0), + JS_FS("__invert__", mpw_invert, 0,0,0), + JS_FS("__not__", mpw_invert, 0,0,0), JS_FS_END }; @@ . patch -p0 <<'@@ .' Index: rpm/js/tscripts/Mpw.js ============================================================================ $ cvs diff -u -r1.2 -r1.3 Mpw.js --- rpm/js/tscripts/Mpw.js 28 Jul 2009 16:11:49 -0000 1.2 +++ rpm/js/tscripts/Mpw.js 29 Jul 2009 16:28:39 -0000 1.3 @@ -6,6 +6,7 @@ // ack("mpw.debug = 1;", 1); // ack("mpw.debug = 0;", 0); +// ===== Basic tests var wa = mpw('0000000987654321'); ack('wa.toString(16)', '0x987654321'); ack('wa.toString(10)', '40926266145') @@ -70,4 +71,222 @@ ack('mpw.gcd(x, y).toString(10)', '19'); +y = mpw(); +ack('x.__nonzero__()', true); +ack('y.__nonzero__()', false); +x = x.__neg__(); +zx = -zx; +ack('x.toString(10)', zx.toString(10)); +x = x.__abs__(); +zx = Math.abs(zx); +ack('x.toString(10)', zx.toString(10)); +x = x.__pos__(); +zx = +zx; +ack('x.toString(10)', zx.toString(10)); +x = x.__invert__(); +zx = ~zx; +ack('x.toString(10)', zx.toString(10)); + +// ===== Carry/borrow tests +var a = 0x7fffffff; +wa = mpw(za); wa = mpw.__add__(wa, wa); +var za = -a; za = za + za; +wb = mpw(1); +wb = wb.__neg__(); +var zb = -1; +wc = mpw(1); +var zc = 1; +wd = mpw(a); wd = mpw.__add__(wd, wd); +var zd = a; zd = zd + zd; + +x = mpw.__add__(wa, wa); +zx = za + za; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__add__(wb, wd); +zx = zb + zd; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__add__(wc, wa); +zx = zc + za; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__add__(wd, wd); +zx = zd + zd; +ack('x.toString(10)', zx.toString(10)); + +x = mpw.__add__(wb, wa); +zx = zb - za; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__add__(wc, wd); +zx = zc - zd; +ack('x.toString(10)', zx.toString(10)); + +// ===== Signs +var wpa = mpw(13); +var wma = wpa.__neg__(); +var wpb = mpw.__sub__(wpa, mpw(3)); // FIXME: coerce args +var wmb = wpb.__neg__(); +var zpa = 13; +var zma = -zpa; +var zpb = zpa - 3; +var zmb = -zpb; + +x = mpw.__add__(wma, wmb); +zx = zma + zmb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__add__(wma, wpb); +zx = zma + zpb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__add__(wpa, wmb); +zx = zpa + zmb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__add__(wpa, wpb); +zx = zpa + zpb; +ack('x.toString(10)', zx.toString(10)); + +x = mpw.__sub__(wma, wmb); +zx = zma - zmb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__sub__(wma, wpb); +zx = zma - zpb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__sub__(wpa, wmb); +zx = zpa - zmb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__sub__(wpa, wpb); +zx = zpa - zpb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__sub__(wmb, wma); +zx = zmb - zma; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__sub__(wmb, wpa); +zx = zmb - zpa; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__sub__(wpb, wma); +zx = zpb - zma; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__sub__(wpb, wpa); +zx = zpb - zpa; +ack('x.toString(10)', zx.toString(10)); + +x = mpw.__mul__(wma, wmb); +zx = zma * zmb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__mul__(wma, wpb); +zx = zma * zpb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__mul__(wpa, wmb); +zx = zpa * zmb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__mul__(wpa, wpb); +zx = zpa * zpb; +ack('x.toString(10)', zx.toString(10)); + +x = mpw.__div__(wma, wmb); +zx = zma / zmb; +ack('x.toString(10)', Math.floor(zx).toString(10)); +x = mpw.__div__(wma, wpb); +zx = zma / zpb; +ack('x.toString(10)', Math.floor(zx).toString(10)); +x = mpw.__div__(wpa, wmb); +zx = zpa / zmb; +ack('x.toString(10)', Math.floor(zx).toString(10)); +x = mpw.__div__(wpa, wpb); +zx = zpa / zpb; +ack('x.toString(10)', Math.floor(zx).toString(10)); +x = mpw.__div__(wmb, wma); +zx = zmb / zma; +ack('x.toString(10)', Math.floor(zx).toString(10)); +x = mpw.__div__(wmb, wpa); +zx = zmb / zpa; +ack('x.toString(10)', Math.floor(zx).toString(10)); +x = mpw.__div__(wpb, wma); +zx = zpb / zma; +ack('x.toString(10)', Math.floor(zx).toString(10)); +x = mpw.__div__(wpb, wpa); +zx = zpb / zpa; +ack('x.toString(10)', Math.floor(zx).toString(10)); + +x = mpw.__pow__(wma, wmb); +zx = Math.pow(zma, zmb); +ack('x.toString(10)', zx.toString(10)); +x = mpw.__pow__(wma, wpb); +zx = Math.pow(zma, zpb); +ack('x.toString(10)', zx.toString(10)); +x = mpw.__pow__(wpa, wmb); +zx = Math.pow(zpa, zmb); +ack('x.toString(10)', zx.toString(10)); +x = mpw.__pow__(wpa, wpb); +zx = Math.pow(zpa, zpb); +ack('x.toString(10)', zx.toString(10)); +x = mpw.__pow__(wmb, wma); +zx = Math.pow(zmb, zma); +ack('x.toString(10)', zx.toString(10)); +x = mpw.__pow__(wmb, wpa); +zx = Math.pow(zmb, zpa); +ack('x.toString(10)', zx.toString(10)); +x = mpw.__pow__(wpb, wma); +zx = Math.pow(zpb, zma); +ack('x.toString(10)', zx.toString(10)); +x = mpw.__pow__(wpb, wpa); +zx = Math.pow(zpb, zpa); +ack('x.toString(10)', zx.toString(10)); + +x = mpw.__mod__(wma, wmb); +zx = zma % zmb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__mod__(wma, wpb); +zx = zma % zpb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__mod__(wpa, wmb); +zx = zpa % zmb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__mod__(wpa, wpb); +zx = zpa % zpb; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__mod__(wmb, wma); +zx = zmb % zma; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__mod__(wmb, wpa); +zx = zmb % zpa; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__mod__(wpb, wma); +zx = zpb % zma; +ack('x.toString(10)', zx.toString(10)); +x = mpw.__mod__(wpb, wpa); +zx = zpb % zpa; +ack('x.toString(10)', zx.toString(10)); + +// ===== Knuth poly +var w1 = mpw(1); +var lo = 2; +var wm = mpw(lo); +var hi = 15; +var wn = mpw(hi); + +// var bases = [3, 5, 7, 8, 10, 11, 13, 16]; +var bases = [13]; + +for (var i in bases) { + var t = bases[i]; + var wt = mpw(t); + var tm1 = (t - 1); + var tm2 = (t - 2); + print("=====\t("+t+"**m - 1) * ("+t+"**n - 1), m,n in ["+lo+","+hi+")"); + for (var m = lo; m < hi; m++) { + wm = mpw(m); + wb = mpw.__pow__(wt, wm); + wb = mpw.__sub__(wb, w1); + for (var n = m+1; n < hi+1; n++) { + wn = mpw(n); + wc = mpw.__pow__(wt, wn); + wc = mpw.__sub__(wc, w1); + wa = mpw.__mul__(wb, wc); + print(wa.toString(t)); +// zs = tm1 * (m - 1) + tm2 + tm1 * (n - m) + "0" * (m - 1) + "1" +// if ws != zs: +// print "(%d**%d - 1) * (%d**%d - 1)\t%s" % (self.t,m,self.t,n,ws) +// assert ws == zs + } + } +} + if (loglvl) print("<-- Mpw.js"); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository [email protected]
