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: 01-Aug-2009 22:47:15 Branch: HEAD Handle: 2009080120471401 Modified files: rpm/js rpmmpw-js.c rpm/js/tscripts Mpw.js Log: - js: add mpw unary operations, haul out the trash. Summary: Revision Changes Path 1.9 +52 -112 rpm/js/rpmmpw-js.c 1.9 +14 -20 rpm/js/tscripts/Mpw.js ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/js/rpmmpw-js.c ============================================================================ $ cvs diff -u -r1.8 -r1.9 rpmmpw-js.c --- rpm/js/rpmmpw-js.c 1 Aug 2009 19:24:04 -0000 1.8 +++ rpm/js/rpmmpw-js.c 1 Aug 2009 20:47:14 -0000 1.9 @@ -899,18 +899,6 @@ } static mpwObject * -mpw_Copy(mpwObject *a) - /*...@*/ -{ - mpwObject * z; - - z = mpw_FromMPW(MPW_SIZE(a), MPW_DATA(a), 1); - if (z != NULL) - z->ob_size = a->ob_size; - return z; -} - -static mpwObject * mpw_FromLong(long ival) /*...@*/ { @@ -1114,6 +1102,50 @@ /* ---------- */ +/** Compute 1 argument operations. */ +static mpwObject * +mpw_ops1(char op, mpwObject *x) + /*...@*/ +{ + mpwObject * z = NULL; + + if (x == NULL) + goto exit; + +if (_debug < 0) { +prtmpw("a", x); +} + + z = mpw_FromMPW(MPW_SIZE(x), MPW_DATA(x), 0); + z->ob_size = x->ob_size; + + switch (op) { + default: + goto exit; + /*...@notreached@*/ break; + case 'N': + z->ob_size = -z->ob_size; + break; + case 'A': + if (z->ob_size < 0) + z->ob_size = -z->ob_size; + break; + case '~': /* Implement ~z as -(z+1) */ + { mpw val = 1; + int carry = mpaddx(MPW_SIZE(z), MPW_DATA(z), 1, &val); + carry = carry; /* XXX gcc warning */ + if (x->ob_size > 0) + z->ob_size = -z->ob_size; + } break; + } + +if (_debug < 0) +fprintf(stderr, "<== %s(%c) %p[%d]\t", __FUNCTION__, op, MPW_DATA(z), MPW_SIZE(z)), mpfprintln(stderr, MPW_SIZE(z), MPW_DATA(z)); + +exit: + return z; +} + /** Compute 2 argument operations. */ static mpwObject * mpw_ops2(char op, mpwObject *x, mpwObject *m) @@ -1564,108 +1596,8 @@ } #endif -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), - - 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 }; @@ -1870,6 +1802,9 @@ if (!strcmp(s, "**")) c = (int)'P'; if (!strcmp(s, "<<")) c = (int)'<'; if (!strcmp(s, ">>")) c = (int)'>'; + if (!strcmp(s, "abs")) c = (int)'A'; + if (!strcmp(s, "not")) c = (int)'~'; + if (!strcmp(s, "negate")) c = (int)'N'; if (!strcmp(s, "gcd")) c = (int)'G'; /* gcd(x, y). */ if (!strcmp(s, "invm")) c = (int)'I'; /* inverse of x (modulo m). */ if (!strcmp(s, "sqrm")) c = (int)'S'; /* x*x (modulo m). */ @@ -1878,6 +1813,11 @@ #endif switch (c) { + case 'A': + case 'N': + case '~': + stack[ix] = mpw_ops1(c, stack[ix]); + break; case '%': case '/': /* XXX divide-by-zero check. */ @@ . patch -p0 <<'@@ .' Index: rpm/js/tscripts/Mpw.js ============================================================================ $ cvs diff -u -r1.8 -r1.9 Mpw.js --- rpm/js/tscripts/Mpw.js 1 Aug 2009 19:24:04 -0000 1.8 +++ rpm/js/tscripts/Mpw.js 1 Aug 2009 20:47:15 -0000 1.9 @@ -43,9 +43,9 @@ var y = mpw(13); ack('y.toString(10)', '13'); -ack('mpw(x, m, "invm").toString(10)', '4'); - +ack('mpw(x, m, "invm").toString(10)', '13'); ack('mpw(x, m, "sqrm").toString(10)', '4'); + ack('mpw(x, y, m, "addm").toString(10)', '5'); ack('mpw(x, y, m, "subm").toString(10)', '9'); ack('mpw(x, y, m, "mulm").toString(10)', '1'); @@ -55,31 +55,25 @@ var zy = 7*11*13*19; ack('mpw(mpw(zx), mpw(zy), "gcd").toString(10)', '19'); -// y = mpw(0); -// 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)); +x = mpw(zx, "neg"); +zx = -zx; +ack('x.toString(10)', zx.toString(10)); +x = mpw(zx, "abs"); +zx = Math.abs(zx); +ack('x.toString(10)', zx.toString(10)); +x = mpw(zx, "~"); +zx = ~zx; +ack('x.toString(10)', zx.toString(10)); // ===== Carry/borrow tests var a = 0x7fffffff; -wa = mpw(mpw(-a), mpw(-a), "+"); +wa = mpw(-a, -a, "+"); var za = (-a) + (-a); wb = mpw(-1); var zb = -1; wc = mpw(1); var zc = 1; -wd = mpw(mpw(a), mpw(a), "+"); +wd = mpw(a, a, "+"); var zd = a + a; ack('mpw(wa, wa, "+").toString(10)', (za + za).toString(10)); @@ -93,7 +87,7 @@ // ===== Signs var wpa = mpw(13); var wma = mpw(-13); -var wpb = mpw(wpa, mpw(3), "-"); // FIXME: coerce args +var wpb = mpw(wpa, 3, "-"); var wmb = mpw(-10); var zpa = 13; var zma = -zpa; @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository [email protected]
