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]

Reply via email to