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]

Reply via email to