[Tinyos-commits] CVS: tinyos-1.x/tos/lib/VM/languages/motlle/mate/runtime SFNarith.nc, NONE, 1.1 SFNarithM.nc, NONE, 1.1 SFNrealM.nc, NONE, 1.1 FNarith.nc, 1.2, 1.3 FNarithM.nc, 1.2, 1.3 FNrealM.nc, 1.3, 1.4 SFNmagic.nc, 1.1, 1.2

David Gay idgay at users.sourceforge.net
Mon Oct 24 17:01:28 PDT 2005


Update of /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/mate/runtime
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18790/runtime

Modified Files:
	FNarith.nc FNarithM.nc FNrealM.nc SFNmagic.nc 
Added Files:
	SFNarith.nc SFNarithM.nc SFNrealM.nc 
Log Message:
more tinyscheme


--- NEW FILE: SFNarith.nc ---
configuration SFNarith {
  provides {
    interface MateBytecode as Nlt;
    interface MateBytecode as Nle;
    interface MateBytecode as Ngt;
    interface MateBytecode as Nge;
    interface MateBytecode as Add;
    interface MateBytecode as Subtract;
    interface MateBytecode as Multiply;
    interface MateBytecode as PositiveP;
    interface MateBytecode as NegativeP;
    interface MateBytecode as OddP;
    interface MateBytecode as EvenP;
    interface MateBytecode as Or;
    interface MateBytecode as And;
    interface MateBytecode as Xor;
    interface MateBytecode as Quotient;
    interface MateBytecode as Remainder;
    interface MateBytecode as Modulo;
  }
}
implementation {
  components SFNarithM, MProxy;

  Nlt = SFNarithM.Nlt;
  Nle = SFNarithM.Nle;
  Ngt = SFNarithM.Ngt;
  Nge = SFNarithM.Nge;
  Add = SFNarithM.Add;
  Subtract = SFNarithM.Subtract;
  Multiply = SFNarithM.Multiply;
  PositiveP = SFNarithM.PositiveP;
  NegativeP = SFNarithM.NegativeP;
  OddP = SFNarithM.OddP;
  EvenP = SFNarithM.EvenP;
  Or = SFNarithM.Or;
  And = SFNarithM.And;
  Xor = SFNarithM.Xor;
  Quotient = SFNarithM.Quotient;
  Remainder = SFNarithM.Remainder;
  Modulo = SFNarithM.Modulo;

  SFNarithM.S -> MProxy;
  SFNarithM.T -> MProxy;
  SFNarithM.E -> MProxy;
}

--- NEW FILE: SFNarithM.nc ---
module SFNarithM {
  provides {
    interface MateBytecode as Nlt;
    interface MateBytecode as Nle;
    interface MateBytecode as Ngt;
    interface MateBytecode as Nge;
    interface MateBytecode as Add;
    interface MateBytecode as Subtract;
    interface MateBytecode as Multiply;
    interface MateBytecode as PositiveP;
    interface MateBytecode as NegativeP;
    interface MateBytecode as OddP;
    interface MateBytecode as EvenP;
    interface MateBytecode as Or;
    interface MateBytecode as And;
    interface MateBytecode as Xor;
    interface MateBytecode as Quotient;
    interface MateBytecode as Remainder;
    interface MateBytecode as Modulo;
  }
  uses {
    interface MotlleStack as S;
    interface MotlleTypes as T;
    interface MateError as E;
  }
}
implementation {
  mvalue pop_number(MateContext *context) {
    mvalue x = call S.pop(context, 1);

    if (call T.numberp(x))
      return x;
    call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    return call T.make_int(1);
  }

  vint ipop_number(MateContext *context) {
    mvalue x = call S.pop(context, 1);

    if (call T.intp(x))
      return call T.intv(x);
    call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    return 1;
  }

  //FN <: n1 n2 -> b. True if n1 < n2
  command result_t Nlt.execute(uint8_t instr, MateContext* context) {
    mvalue y = call S.pop(context, 1);
    mvalue x = call S.pop(context, 1);

    if (call T.int_intp(x, y))
      {
	vint ix = call T.intv(x), iy = call T.intv(y);
	call S.qpush(context, call T.make_bool(ix < iy));
      }
    else if (call T.promotep(x, y))
      {
	vreal rx = call T.number(x), ry = call T.number(y);
	call S.qpush(context, call T.make_bool(rx < ry));
      }
    else
      call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    
    return SUCCESS;
  }

  command uint8_t Nlt.byteLength() {
    return 1;
  }

  //FN >: n1 n2 -> b. True if n1 > n2
  command result_t Ngt.execute(uint8_t instr, MateContext* context) {
    mvalue y = call S.pop(context, 1);
    mvalue x = call S.pop(context, 1);

    if (call T.int_intp(x, y))
      {
	vint ix = call T.intv(x), iy = call T.intv(y);
	call S.qpush(context, call T.make_bool(ix > iy));
      }
    else if (call T.promotep(x, y))
      {
	vreal rx = call T.number(x), ry = call T.number(y);
	call S.qpush(context, call T.make_bool(rx > ry));
      }
    else
      call E.error(context, MOTLLE_ERROR_BAD_TYPE);

    return SUCCESS;
  }

  command uint8_t Ngt.byteLength() {
    return 1;
  }

  //FN <=: n1 n2 -> b. True if n1 <= n2
  command result_t Nle.execute(uint8_t instr, MateContext* context) {
    mvalue y = call S.pop(context, 1);
    mvalue x = call S.pop(context, 1);

    if (call T.int_intp(x, y))
      {
	vint ix = call T.intv(x), iy = call T.intv(y);
	call S.qpush(context, call T.make_bool(ix <= iy));
      }
    else if (call T.promotep(x, y))
      {
	vreal rx = call T.number(x), ry = call T.number(y);
	call S.qpush(context, call T.make_bool(rx <= ry));
      }
    else
      call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    
    return SUCCESS;
  }

  command uint8_t Nle.byteLength() {
    return 1;
  }

  //FN >=: n1 n2 -> b. True if n1 >= n2
  command result_t Nge.execute(uint8_t instr, MateContext* context) {
    mvalue y = call S.pop(context, 1);
    mvalue x = call S.pop(context, 1);

    if (call T.int_intp(x, y))
      {
	vint ix = call T.intv(x), iy = call T.intv(y);
	call S.qpush(context, call T.make_bool(ix >= iy));
      }
    else if (call T.promotep(x, y))
      {
	vreal rx = call T.number(x), ry = call T.number(y);
	call S.qpush(context, call T.make_bool(rx >= ry));
      }
    else
      call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    
    return SUCCESS;
  }

  command uint8_t Nge.byteLength() {
    return 1;
  }

  //FN +: n1 ... -> n. n = n1 + ...
  command result_t Add.execute(uint8_t instr, MateContext* context) {
    mvalue x = call T.make_int(0);

    while (--nargs)
      {
	mvalue y = pop_number(context);

	if (call T.promotep(x, y))
	  x = call T.make_real(call T.number(x) + call T.number(y));
	else
	  x = call T.make_int(call T.intv(x) + call T.intv(y));
      }
    call S.qpush(context, x);

    return SUCCESS;
  }

  command uint8_t Add.byteLength() {
    return 1;
  }

  //FN *: n1 ... -> n. n = n1 * ...
  command result_t Multiply.execute(uint8_t instr, MateContext* context) {
    mvalue x = call T.make_int(1);

    while (--nargs)
      {
	mvalue y = pop_number(context);

	if (call T.promotep(x, y))
	  x = call T.make_real(call T.number(x) * call T.number(y));
	else
	  x = call T.make_int(call T.intv(x) * call T.intv(y));
      }
    call S.qpush(context, x);


    return SUCCESS;
  }

  command uint8_t Multiply.byteLength() {
    return 1;
  }

  //FN -: n1 ... -> n. n = n1 - n2 or n = -n1
  command result_t Subtract.execute(uint8_t nargs, MateContext* context) {
    if (nargs == 1)
      {
	mvalue x = pop_number(context);

	if (call T.realp(x))
	  call S.qpush(context, call T.make_real(-call T.real(x)));
	else
	  call S.qpush(context, call T.make_int(-call T.intv(x)));
      }
    else if (nargs == 2)
      {
	mvalue x = call S.pop(context, 1), y = call S.pop(context, 1);

	if (call T.int_intp(x, y))
	  {
	    vint ix = call T.intv(x), iy = call T.intv(y);
	    call S.qpush(context, call T.make_int(ix - iy));
	  }
	else if (call T.promotep(x, y))
	  {
	    vreal rx = call T.number(x), ry = call T.number(y);
	    call S.qpush(context, call T.make_real(rx - ry));
	  }
	else
	  call E.error(context, MOTLLE_ERROR_BAD_TYPE);
      }
    else
      call E.error(context, MOTLLE_ERROR_WRONG_PARAMETERS);
    return SUCCESS;
  }

  command uint8_t Subtract.byteLength() {
    return 1;
  }

  //FN |: n1 ... -> n. n = n1 | ...
  command result_t Or.execute(uint8_t instr, MateContext* context) {
    if (nargs < 1)
      call E.error(context, MOTLLE_ERROR_WRONG_PARAMETERS);
    else
      {
	vint x = ipop_number(context);

	while (--nargs)
	  x |= ipop_number(context);
	call S.qpush(context, x);
      }

    return SUCCESS;
  }

  command uint8_t Or.byteLength() {
    return 1;
  }

  //FN &: n1 ... -> n. n = n1 & ...
  command result_t And.execute(uint8_t instr, MateContext* context) {
    if (nargs < 1)
      call E.error(context, MOTLLE_ERROR_WRONG_PARAMETERS);
    else
      {
	vint x = ipop_number(context);

	while (--nargs)
	  x &= ipop_number(context);
	call S.qpush(context, x);
      }
    return SUCCESS;
  }

  command uint8_t And.byteLength() {
    return 1;
  }

  //FN ^: n1 ... -> n. n = n1 ^ ...
  command result_t Xor.execute(uint8_t instr, MateContext* context) {
    if (nargs < 1)
      call E.error(context, MOTLLE_ERROR_WRONG_PARAMETERS);
    else
      {
	vint x = ipop_number(context);

	while (--nargs)
	  x ^= ipop_number(context);
	call S.qpush(context, x);
      }
    return SUCCESS;
  }

  command uint8_t Xor.byteLength() {
    return 1;
  }

  //FN odd?: n -> b. True if n is odd
  command result_t OddP.execute(uint8_t instr, MateContext* context) {
    call S.qpush(context, call T.make_bool(ipop_number(context) & 1));
    return SUCCESS;
  }

  command uint8_t OddP.byteLength() {
    return 1;
  }

  //FN even?: n -> b. True if n is even
  command result_t EvenP.execute(uint8_t instr, MateContext* context) {
    call S.qpush(context, call T.make_bool(!(ipop_number(context) & 1)));
    return SUCCESS;
  }

  command uint8_t EvenP.byteLength() {
    return 1;
  }

  //FN zero?: n -> b. True if n is zero
  command result_t ZeroP.execute(uint8_t instr, MateContext* context) {
    mvalue x = call S.pop(context, 1);

    if (call T.intp(x))
      call S.qpush(context, call T.make_bool(call T.intv(x) == 0));
    else if (call T.realp(x))
      call S.qpush(context, call T.make_bool(call T.real(x) == 0));
    else
      call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    return SUCCESS;
  }

  command uint8_t ZeroP.byteLength() {
    return 1;
  }

  //FN positive?: n -> b. True if n is positive
  command result_t PositiveP.execute(uint8_t instr, MateContext* context) {
    mvalue x = call S.pop(context, 1);

    if (call T.intp(x))
      call S.qpush(context, call T.make_bool(call T.intv(x) > 0));
    else if (call T.realp(x))
      call S.qpush(context, call T.make_bool(call T.real(x) > 0));
    else
      call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    return SUCCESS;
  }

  command uint8_t PositiveP.byteLength() {
    return 1;
  }

  //FN negative?: n -> b. True if n is negative
  command result_t NegativeP.execute(uint8_t instr, MateContext* context) {
    mvalue x = call S.pop(context, 1);

    if (call T.intp(x))
      call S.qpush(context, call T.make_bool(call T.intv(x) < 0));
    else if (call T.realp(x))
      call S.qpush(context, call T.make_bool(call T.real(x) < 0));
    else
      call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    return SUCCESS;
  }

  command uint8_t NegativeP.byteLength() {
    return 1;
  }

  // Assuming that /, % round towards zero

  //FN quotient: n1 n2 -> n3. n3 = integer division of n1, n2
  command result_t Quotient.execute(uint8_t instr, MateContext* context) {
    mvalue y = call S.pop(context, 1);
    mvalue x = call S.pop(context, 1);

    if (call T.int_intp(x, y))
      {
	vint ix = call T.intv(x), iy = call T.intv(y);

	if (iy == 0)
	  call E.error(context, MOTLLE_ERROR_DIVIDE_BY_ZERO);
	else
	  call S.qpush(context, call T.make_int(ix / iy));
      }
    else
      call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    
    return SUCCESS;
  }

  command uint8_t Quotient.byteLength() {
    return 1;
  }

  //FN remainder: n1 n2 -> n3. n3 = integer division of n1, n2
  command result_t Remainder.execute(uint8_t instr, MateContext* context) {
    mvalue y = call S.pop(context, 1);
    mvalue x = call S.pop(context, 1);

    if (call T.int_intp(x, y))
      {
	vint ix = call T.intv(x), iy = call T.intv(y);

	if (iy == 0)
	  call E.error(context, MOTLLE_ERROR_DIVIDE_BY_ZERO);
	else
	  call S.qpush(context, call T.make_int(ix % iy));
      }
    else
      call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    
    return SUCCESS;
  }

  command uint8_t Remainder.byteLength() {
    return 1;
  }

  //FN modulo: n1 n2 -> n3. n3 = integer division of n1, n2
  command result_t Modulo.execute(uint8_t instr, MateContext* context) {
    mvalue y = call S.pop(context, 1);
    mvalue x = call S.pop(context, 1);

    if (call T.int_intp(x, y))
      {
	vint ix = call T.intv(x), iy = call T.intv(y);

	if (iy == 0)
	  call E.error(context, MOTLLE_ERROR_DIVIDE_BY_ZERO);
	else
	  {
	    vint r = ix % iy;

	    if (r < 0 && iy > 0 || r > 0 && iy < 0)
	      r += iy;
	    call S.qpush(context, call T.make_int(r));
	  }
      }
    else
      call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    
    return SUCCESS;
  }

  command uint8_t Modulo.byteLength() {
    return 1;
  }

}

--- NEW FILE: SFNrealM.nc ---
module SFNrealM {
  provides interface Divide;
}
implementation {
  vreal fpop_number(MateContext *context) {
    mvalue x = call S.pop(context, 1);

    if (call T.numberp(x))
      return call T.number(x);
    call E.error(context, MOTLLE_ERROR_BAD_TYPE);
    return 1;
  }

  //FN /: n1 n2 -> n. n = n1 / n2
  command result_t Divide.execute(uint8_t instr, MateContext* context) {
    if (nargs == 1)
      {
	vreal x = fpop_number(context);

	if (x == 0)
	  call E.error(context, MOTLLE_ERROR_DIVIDE_BY_ZERO);
	else
	  call S.qpush(context, call T.make_real(1 / x));
      }
    else if (nargs == 2)
      {
	vreal x = fpop_number(context), y = fpop_number(context);
	if (y == 0)
	  call E.error(context, MOTLLE_ERROR_DIVIDE_BY_ZERO);
	else
	  call S.qpush(context, call T.make_real(x / y));
      }
    return SUCCESS;
  }

  command uint8_t Divide.byteLength() {
    return 1;
  }

}

Index: FNarith.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/mate/runtime/FNarith.nc,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** FNarith.nc	30 Nov 2004 18:52:43 -0000	1.2
--- FNarith.nc	25 Oct 2005 00:01:24 -0000	1.3
***************
*** 2,5 ****
--- 2,7 ----
    provides {
      interface MateBytecode as IntegerP;
+     interface MateBytecode as NumberP;
+     interface MateBytecode as RealP;
      interface MateBytecode as Max;
      interface MateBytecode as Min;
***************
*** 11,14 ****
--- 13,18 ----
  
    IntegerP = FNarithM.IntegerP;
+   NumberP = FNarithM.NumberP;
+   RealP = FNarithM.RealP;
    Max = FNarithM.Max;
    Min = FNarithM.Min;

Index: FNarithM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/mate/runtime/FNarithM.nc,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** FNarithM.nc	30 Nov 2004 18:52:43 -0000	1.2
--- FNarithM.nc	25 Oct 2005 00:01:25 -0000	1.3
***************
*** 2,5 ****
--- 2,7 ----
    provides {
      interface MateBytecode as IntegerP;
+     interface MateBytecode as NumberP;
+     interface MateBytecode as RealP;
      interface MateBytecode as Max;
      interface MateBytecode as Min;
***************
*** 13,32 ****
  }
  implementation {
!   //FN max: n1 n2 -> n. n = max(n1, n2)
!   command result_t Max.execute(uint8_t instr, MateContext* context) {
!     mvalue x = call S.pop(context, 1), y = call S.pop(context, 1);
  
!     if (call T.int_intp(x, y))
!       {
! 	vint ix = call T.intv(x), iy = call T.intv(y);
! 	call S.qpush(context, call T.make_int(ix > iy ? ix : iy));
!       }
!     else if (call T.promotep(x, y))
        {
! 	vreal rx = call T.real(x), ry = call T.real(y);
! 	call S.qpush(context, call T.make_real(rx > ry ? rx : ry));
        }
-     else
-       call E.error(context, MOTLLE_ERROR_BAD_TYPE);
      return SUCCESS;
    }
--- 15,52 ----
  }
  implementation {
!   mvalue pop_number(MateContext *context) {
!     mvalue x = call S.pop(context, 1);
  
!     if (call T.numberp(x))
!       return x;
!     call E.error(context, MOTLLE_ERROR_BAD_TYPE);
!     return call T.make_int(1);
!   }
! 
!   //FN max: n1 n2 ... -> n. n = max(n1, n2, ...)
!   command result_t Max.execute(uint8_t nargs, MateContext* context) {
!     if (nargs < 1)
!       call E.error(context, MOTLLE_ERROR_WRONG_PARAMETERS);
!     else
        {
! 	mvalue x = pop_number(context);
! 
! 	while (--nargs)
! 	  {
! 	    mvalue y = pop_number(context);
! 
! 	    if (call T.int_intp(x, y))
! 	      {
! 		if (call T.intv(y) > call T.intv(x))
! 		  x = y;
! 	      }
! 	    else
! 	      {
! 		if (call T.number(y) > call T.number(x))
! 		  x = y;
! 	      }
! 	  }
! 	call S.qpush(context, x);
        }
      return SUCCESS;
    }
***************
*** 36,55 ****
    }
  
!   //FN min: n1 n2 -> n. n = min(n1, n2)
    command result_t Min.execute(uint8_t instr, MateContext* context) {
!     mvalue x = call S.pop(context, 1), y = call S.pop(context, 1);
! 
!     if (call T.int_intp(x, y))
!       {
! 	vint ix = call T.intv(x), iy = call T.intv(y);
! 	call S.qpush(context, call T.make_int(ix < iy ? ix : iy));
!       }
!     else if (call T.promotep(x, y))
        {
! 	vreal rx = call T.real(x), ry = call T.real(y);
! 	call S.qpush(context, call T.make_real(rx < ry ? rx : ry));
        }
-     else
-       call E.error(context, MOTLLE_ERROR_BAD_TYPE);
      return SUCCESS;
    }
--- 56,84 ----
    }
  
!   //FN min: n1 n2 ... -> n. n = min(n1, n2, ...)
    command result_t Min.execute(uint8_t instr, MateContext* context) {
!     if (nargs < 1)
!       call E.error(context, MOTLLE_ERROR_WRONG_PARAMETERS);
!     else
        {
! 	mvalue x = pop_number(context);
! 
! 	while (--nargs)
! 	  {
! 	    mvalue y = pop_number(context);
! 
! 	    if (call T.int_intp(x, y))
! 	      {
! 		if (call T.intv(y) M call T.intv(x))
! 		  x = y;
! 	      }
! 	    else
! 	      {
! 		if (call T.number(y) < call T.number(x))
! 		  x = y;
! 	      }
! 	  }
! 	call S.qpush(context, x);
        }
      return SUCCESS;
    }
***************
*** 82,85 ****
--- 111,125 ----
    }
  
+   //FN number?: x -> b. TRUE if x is a number
+   command result_t NumberP.execute(uint8_t instr, MateContext* context) {
+     mvalue x = call S.pop(context, 1);
+     call S.qpush(context, call T.make_bool(call T.numberp(x)));
+     return SUCCESS;
+   }
+ 
+   command uint8_t NumberP.byteLength() {
+     return 1;
+   }
+ 
    //FN integer?: x -> b. TRUE if x is an integer
    command result_t IntegerP.execute(uint8_t instr, MateContext* context) {
***************
*** 92,94 ****
--- 132,143 ----
      return 1;
    }
+ 
+   //FN real?: x -> b. TRUE if x is a number
+   command result_t RealP.execute(uint8_t instr, MateContext* context) {
+     return call NumberP.execute(instr, context);
+   }
+ 
+   command uint8_t RealP.byteLength() {
+     return 1;
+   }
  }

Index: FNrealM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/mate/runtime/FNrealM.nc,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** FNrealM.nc	23 Oct 2005 22:37:09 -0000	1.3
--- FNrealM.nc	25 Oct 2005 00:01:25 -0000	1.4
***************
*** 2,7 ****
    provides {
      interface MateBytecode as FloatP;
-     interface MateBytecode as NumberP;
-     interface MateBytecode as RealP;
      interface MateBytecode as Floor;
      interface MateBytecode as Ceiling;
--- 2,5 ----
***************
*** 72,95 ****
    }
  
-   //FN number?: x -> b. TRUE if x is a number
-   command result_t NumberP.execute(uint8_t instr, MateContext* context) {
-     mvalue x = call S.pop(context, 1);
-     call S.qpush(context, call T.make_bool(call T.numberp(x)));
-     return SUCCESS;
-   }
- 
-   command uint8_t NumberP.byteLength() {
-     return 1;
-   }
- 
-   //FN real?: x -> b. TRUE if x is a number
-   command result_t RealP.execute(uint8_t instr, MateContext* context) {
-     return call NumberP.execute(instr, context);
-   }
- 
-   command uint8_t RealP.byteLength() {
-     return 1;
-   }
- 
    //FN float?: x -> b. TRUE if x is a float
    command result_t FloatP.execute(uint8_t instr, MateContext* context) {
--- 70,73 ----

Index: SFNmagic.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/tos/lib/VM/languages/motlle/mate/runtime/SFNmagic.nc,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** SFNmagic.nc	23 Oct 2005 17:22:21 -0000	1.1
--- SFNmagic.nc	25 Oct 2005 00:01:25 -0000	1.2
***************
*** 1,4 ****
--- 1,7 ----
  configuration SFNmagic {
    provides {
+     //FN =: x1 x2 -> b. True if x1 and x2 are equal
+     interface MateBytecode as NumeqP;
+ 
      //FN eq?: x1 x2 -> b. True if x1 and x2 are the same object
      interface MateBytecode as EqP;
***************
*** 32,35 ****
--- 35,39 ----
    components OPmeq, OPmref, OPmset, OPmnot;
  
+   NumeqP = OPmeq;
    EqP = OPmeq;
    EqvP = OPmeq;



More information about the Tinyos-commits mailing list