cvsuser     04/05/10 03:19:02

  Modified:    classes  mmd_default.pmc
               include/parrot mmd.h
               ops      bit.ops
               src      mmd.c mmd_fallback.c
               t/pmc    mmd.t
               .        vtable.tbl
  Log:
  mmd_vtables 8 - MMD_BXOR_INT
  
  * add missing cmp vtables and MMD fallbacks
  * add MMD constants for _int, _str, _float, _bignum variants
  * change prototype of dispatch functions, so that they match the signature
  * add dispatch for INTVAL value argument
  * remove dispatch for string and floatval return
  * MMDify bxor_int
  
  Please re-Configure && make ...
  
  Revision  Changes    Path
  1.13      +24 -25    parrot/classes/mmd_default.pmc
  
  Index: mmd_default.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/mmd_default.pmc,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -w -r1.12 -r1.13
  --- mmd_default.pmc   30 Apr 2004 07:25:46 -0000      1.12
  +++ mmd_default.pmc   10 May 2004 10:18:38 -0000      1.13
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2003 The Perl Foundation.  All Rights Reserved.
  -$Id: mmd_default.pmc,v 1.12 2004/04/30 07:25:46 leo Exp $
  +$Id: mmd_default.pmc,v 1.13 2004/05/10 10:18:38 leo Exp $
   
   =head1 NAME
   
  @@ -48,7 +48,7 @@
   */
   
       void add(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_ADD);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_ADD);
       }
   
   /*
  @@ -62,7 +62,7 @@
   */
   
       void subtract(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_SUBTRACT);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_SUBTRACT);
       }
   
   /*
  @@ -76,7 +76,7 @@
   */
   
       void multiply(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_MULTIPLY);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_MULTIPLY);
       }
   
   /*
  @@ -90,7 +90,7 @@
   */
   
       void divide(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_DIVIDE);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_DIVIDE);
       }
   
   /*
  @@ -104,7 +104,7 @@
   */
   
       void modulus(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_MOD);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_MOD);
       }
   
   /*
  @@ -118,7 +118,7 @@
   */
   
       void cmodulus(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_CMOD);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_CMOD);
       }
   
   /*
  @@ -133,7 +133,7 @@
   */
   
       void bitwise_and(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_BAND);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_BAND);
       }
   
   /*
  @@ -148,7 +148,7 @@
   */
   
       void bitwise_or(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_BOR);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_BOR);
       }
   
   /*
  @@ -163,7 +163,7 @@
   */
   
       void bitwise_xor(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_BXOR);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_BXOR);
       }
   
   /*
  @@ -178,7 +178,7 @@
   */
   
       void bitwise_shl(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_BSL);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_BSL);
       }
   
   /*
  @@ -193,7 +193,7 @@
   */
   
       void bitwise_shr(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_BSR);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_BSR);
       }
   
   /*
  @@ -207,7 +207,7 @@
   */
   
       void concatenate(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_CONCAT);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_CONCAT);
       }
   
   /*
  @@ -222,7 +222,7 @@
   */
   
       void logical_and(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_LAND);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_LAND);
       }
   
   /*
  @@ -237,7 +237,7 @@
   */
   
       void logical_or(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_LOR);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_LOR);
       }
   
   /*
  @@ -252,7 +252,7 @@
   */
   
       void logical_xor(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_LXOR);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_LXOR);
       }
   
   /*
  @@ -266,7 +266,7 @@
   */
   
       void repeat(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_REPEAT);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_REPEAT);
       }
   
   /*
  @@ -280,7 +280,7 @@
   */
   
       INTVAL is_equal(PMC* value) {
  -        return mmd_dispatch_intval(INTERP, SELF, value, MMD_NUMEQ);
  +        return mmd_dispatch_i_pp(INTERP, SELF, value, MMD_NUMEQ);
       }
   
   /*
  @@ -297,16 +297,15 @@
   */
   
       INTVAL cmp(PMC* value) {
  -        /* XXX */
  -        return mmd_dispatch_intval(INTERP, SELF, value, MMD_NUMCMP);
  +        return mmd_dispatch_i_pp(INTERP, SELF, value, MMD_CMP);
       }
   
       INTVAL cmp_num(PMC* value) {
  -        return mmd_dispatch_intval(INTERP, SELF, value, MMD_NUMCMP);
  +        return mmd_dispatch_i_pp(INTERP, SELF, value, MMD_NUMCMP);
       }
   
       INTVAL cmp_string(PMC* value) {
  -        return mmd_dispatch_intval(INTERP, SELF, value, MMD_STRCMP);
  +        return mmd_dispatch_i_pp(INTERP, SELF, value, MMD_STRCMP);
       }
   
   /*
  @@ -321,7 +320,7 @@
   */
   
       void bitwise_ors(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_SOR);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_SOR);
       }
   
   /*
  @@ -336,7 +335,7 @@
   */
   
       void bitwise_ands(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_SAND);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_SAND);
       }
   
   /*
  @@ -351,7 +350,7 @@
   */
   
       void bitwise_xors(PMC* value, PMC* dest) {
  -        mmd_dispatch_pmc(INTERP, SELF, value, dest, MMD_SXOR);
  +        mmd_dispatch_v_ppp(INTERP, SELF, value, dest, MMD_SXOR);
       }
   }
   
  
  
  
  1.16      +64 -36    parrot/include/parrot/mmd.h
  
  Index: mmd.h
  ===================================================================
  RCS file: /cvs/public/parrot/include/parrot/mmd.h,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -w -r1.15 -r1.16
  --- mmd.h     2 May 2004 14:34:41 -0000       1.15
  +++ mmd.h     10 May 2004 10:18:42 -0000      1.16
  @@ -1,7 +1,7 @@
   /* mmd.h
    *  Copyright: 2003 The Perl Foundation.  All Rights Reserved.
    *  CVS Info
  - *     $Id: mmd.h,v 1.15 2004/05/02 14:34:41 leo Exp $
  + *     $Id: mmd.h,v 1.16 2004/05/10 10:18:42 leo Exp $
    *  Overview:
    *     This is the api header for the mmd subsystem
    *  Data Structure and Algorithms:
  @@ -13,16 +13,15 @@
   #if !defined(PARROT_MMD_H_GUARD)
   #define PARROT_MMD_H_GUARD
   
  -void mmd_dispatch_pmc(struct Parrot_Interp *, PMC *, PMC *, PMC *, INTVAL);
  -STRING *mmd_dispatch_string(struct Parrot_Interp *, PMC *, PMC *, INTVAL);
  -INTVAL mmd_dispatch_intval(struct Parrot_Interp *, PMC *, PMC *, INTVAL);
  -FLOATVAL mmd_dispatch_floatval(struct Parrot_Interp *, PMC *, PMC *, INTVAL);
  -
  -void mmd_add_by_class(struct Parrot_Interp *, INTVAL, STRING *, STRING *, 
funcptr_t);
  -void mmd_register(struct Parrot_Interp *, INTVAL, INTVAL, INTVAL, funcptr_t);
  -void mmd_register_sub(struct Parrot_Interp *, INTVAL, INTVAL, INTVAL, PMC*);
  -void mmd_add_function(struct Parrot_Interp *, INTVAL, funcptr_t);
  -void mmd_add_function_sub(struct Parrot_Interp *, INTVAL, PMC*);
  +void mmd_dispatch_v_ppp(Parrot_Interp, PMC *, PMC *, PMC *, INTVAL);
  +void mmd_dispatch_v_pip(Parrot_Interp, PMC *, INTVAL, PMC *, INTVAL);
  +INTVAL mmd_dispatch_i_pp(Parrot_Interp, PMC *, PMC *, INTVAL);
  +
  +void mmd_add_by_class(Parrot_Interp, INTVAL, STRING *, STRING *, funcptr_t);
  +void mmd_register(Parrot_Interp, INTVAL, INTVAL, INTVAL, funcptr_t);
  +void mmd_register_sub(Parrot_Interp, INTVAL, INTVAL, INTVAL, PMC*);
  +void mmd_add_function(Parrot_Interp, INTVAL, funcptr_t);
  +void mmd_add_function_sub(Parrot_Interp, INTVAL, PMC*);
   void mmd_destroy(Parrot_Interp);
   PMC *mmd_vtfind(Parrot_Interp, INTVAL, INTVAL, INTVAL);
   
  @@ -40,33 +39,62 @@
      (and, or, xor, lshift, rshift), concat, logical (and, or, xor),
      repeat, eq, cmp */
   
  -/* &gen_from_def(mmd.pasm) */
  +/* &gen_from_enum(mmd.pasm) */
   
  -#define MMD_ADD 0
  -#define MMD_SUBTRACT 1
  -#define MMD_MULTIPLY 2
  -#define MMD_DIVIDE 3
  -#define MMD_MOD 4
  -#define MMD_CMOD 5
  -#define MMD_BAND 6
  -#define MMD_BOR 7
  -#define MMD_BXOR 8
  -#define MMD_BSL 9
  -#define MMD_BSR 10
  -#define MMD_CONCAT 11
  -#define MMD_LAND 12
  -#define MMD_LOR 13
  -#define MMD_LXOR 14
  -#define MMD_REPEAT 15
  -#define MMD_NUMEQ 16
  -#define MMD_STREQ 17
  -#define MMD_NUMCMP 18
  -#define MMD_STRCMP 19
  -#define MMD_SOR 20
  -#define MMD_SAND 21
  -#define MMD_SXOR 22
  +typedef enum {
  +        MMD_ADD,
  +        MMD_ADD_INT,
  +        MMD_ADD_FLOAT,
  +        MMD_ADD_BIGNUM,
  +        MMD_SUBTRACT,
  +        MMD_SUBTRACT_INT,
  +        MMD_SUBTRACT_FLOAT,
  +        MMD_SUBTRACT_BIGNUM,
  +        MMD_MULTIPLY,
  +        MMD_MULTIPLY_INT,
  +        MMD_MULTIPLY_FLOAT,
  +        MMD_MULTIPLY_BIGNUM,
  +        MMD_DIVIDE,
  +        MMD_DIVIDE_INT,
  +        MMD_DIVIDE_FLOAT,
  +        MMD_DIVIDE_BIGNUM,
  +        MMD_MOD,
  +        MMD_MOD_INT,
  +        MMD_MOD_FLOAT,
  +        MMD_MOD_BIGNUM,
  +        MMD_CMOD,
  +        MMD_CMOD_INT,
  +        MMD_CMOD_FLOAT,
  +        MMD_CMOD_BLIGNUM,
  +        MMD_BAND,
  +        MMD_BAND_INT,
  +        MMD_BOR,
  +        MMD_BOR_INT,
  +        MMD_BXOR,
  +        MMD_BXOR_INT,
  +        MMD_BSL,
  +        MMD_BSL_INT,
  +        MMD_BSR,
  +        MMD_BSR_INT,
  +        MMD_CONCAT,
  +        MMD_CONCAT_STR,
  +        MMD_LAND,
  +        MMD_LOR,
  +        MMD_LXOR,
  +        MMD_REPEAT,
  +        MMD_REPEAT_INT,
  +        MMD_EQ,
  +        MMD_NUMEQ,
  +        MMD_STREQ,
  +        MMD_CMP,
  +        MMD_NUMCMP,
  +        MMD_STRCMP,
  +        MMD_SOR,
  +        MMD_SAND,
  +        MMD_SXOR,
   
  -#define MMD_USER_FIRST 23
  +        MMD_USER_FIRST
  +} parrot_mmd_func_enum;
   
   /* &end_gen */
   #endif /* PARROT_MMD_H_GUARD */
  
  
  
  1.10      +6 -4      parrot/ops/bit.ops
  
  Index: bit.ops
  ===================================================================
  RCS file: /cvs/public/parrot/ops/bit.ops,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -w -r1.9 -r1.10
  --- bit.ops   30 Apr 2004 15:34:27 -0000      1.9
  +++ bit.ops   10 May 2004 10:18:46 -0000      1.10
  @@ -399,12 +399,13 @@
   }
   
   inline op bxor(in PMC, in INT) :base_core {
  -  $1->vtable->bitwise_xor_int(interpreter, $1, $2, $1);
  +  mmd_dispatch_v_pip(interpreter, $1, $2, $1, MMD_BXOR_INT);
  +  /* $1->vtable->bitwise_xor_int(interpreter, $1, $2, $1); */
     goto NEXT();
   }
   
   inline op bxor(in PMC, in PMC) :base_core {
  -  mmd_dispatch_pmc(interpreter, $1, $2, $1, MMD_BXOR);
  +  mmd_dispatch_v_ppp(interpreter, $1, $2, $1, MMD_BXOR);
     /* $1->vtable->bitwise_xor(interpreter, $1, $2, $1); */
     goto NEXT();
   }
  @@ -415,12 +416,13 @@
   }
   
   inline op bxor(in PMC, in PMC, in INT) :base_core {
  -  $2->vtable->bitwise_xor_int(interpreter, $2, $3, $1);
  +  mmd_dispatch_v_pip(interpreter, $2, $3, $1, MMD_BXOR_INT);
  +  /* $2->vtable->bitwise_xor_int(interpreter, $2, $3, $1); */
     goto NEXT();
   }
   
   inline op bxor(in PMC, in PMC, in PMC) :base_core {
  -  mmd_dispatch_pmc(interpreter, $2, $3, $1, MMD_BXOR);
  +  mmd_dispatch_v_ppp(interpreter, $2, $3, $1, MMD_BXOR);
     /* $2->vtable->bitwise_xor(interpreter, $2, $3, $1); */
     goto NEXT();
   }
  
  
  
  1.37      +30 -85    parrot/src/mmd.c
  
  Index: mmd.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/mmd.c,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -w -r1.36 -r1.37
  --- mmd.c     1 May 2004 16:39:46 -0000       1.36
  +++ mmd.c     10 May 2004 10:18:54 -0000      1.37
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2003 The Perl Foundation.  All Rights Reserved.
  -$Id: mmd.c,v 1.36 2004/05/01 16:39:46 leo Exp $
  +$Id: mmd.c,v 1.37 2004/05/10 10:18:54 leo Exp $
   
   =head1 NAME
   
  @@ -43,10 +43,9 @@
   #include "parrot/parrot.h"
   #include <assert.h>
   
  -typedef void (*pmc_mmd_f)(Interp *, PMC *, PMC *, PMC *);
  -typedef STRING *(*string_mmd_f)(Interp *, PMC *, PMC *);
  -typedef INTVAL (*intval_mmd_f)(Interp *, PMC *, PMC *);
  -typedef FLOATVAL (*floatval_mmd_f)(Interp *, PMC *, PMC *);
  +typedef void    (*mmd_f_v_ppp)(Interp *, PMC *, PMC *, PMC *);
  +typedef void    (*mmd_f_v_pip)(Interp *, PMC *, INTVAL, PMC *);
  +typedef INTVAL  (*mmd_f_i_pp) (Interp *, PMC *, PMC *);
   
   #ifndef NDEBUG
   static void
  @@ -160,7 +159,7 @@
   /*
   
   =item C<void
  -mmd_dispatch_pmc(Interp *interpreter,
  +mmd_dispatch_v_ppp(Interp *interpreter,
                 PMC *left, PMC *right, PMC *dest, INTVAL function)>
   
   Dispatch to a multimethod that "returns" a PMC. C<left>, C<right>, and
  @@ -174,19 +173,25 @@
   This function has a C<void> return type, like all the "take two PMCs,
   return a PMC" vtable functions do.
   
  +=item C<void
  +mmd_dispatch_v_pip(Interp *interpreter,
  +              PMC *left, INTVAL right, PMC *dest, INTVAL function)>
  +
  +Like above, right argument is a native INTVAL.
  +
   =cut
   
   */
   
   void
  -mmd_dispatch_pmc(Interp *interpreter,
  +mmd_dispatch_v_ppp(Interp *interpreter,
                 PMC *left, PMC *right, PMC *dest, INTVAL function)
   {
  -    pmc_mmd_f real_function;
  +    mmd_f_v_ppp real_function;
       PMC *sub;
       int is_pmc;
   
  -    real_function = (pmc_mmd_f)get_mmd_dispatcher(interpreter,
  +    real_function = (mmd_f_v_ppp)get_mmd_dispatcher(interpreter,
               left, right, function, &is_pmc);
   
       if (is_pmc) {
  @@ -199,115 +204,55 @@
       }
   }
   
  -/*
  -
  -=item C<STRING *
  -mmd_dispatch_string(Interp *interpreter,
  -              PMC *left, PMC *right, INTVAL function)>
  -
  -Dispatch to a multimethod that returns a string. left and right are PMC
  -pointers, while C<func_num> is the MMD table that should be used to do the
  -dispatching. The function is responsible for creating the returned
  -string.
  -
  -=cut
  -
  -*/
  -
  -STRING *
  -mmd_dispatch_string(Interp *interpreter,
  -              PMC *left, PMC *right, INTVAL function)
  +void
  +mmd_dispatch_v_pip(Interp *interpreter,
  +              PMC *left, INTVAL right, PMC *dest, INTVAL function)
   {
  -    string_mmd_f real_function;
  +    mmd_f_v_pip real_function;
       PMC *sub;
       int is_pmc;
  -    STRING *ret;
  -    /*
  -     * XXX actually we don't have a MMD function matching this signature
  -     * -leo
  -     */
  -
  -    real_function = (string_mmd_f)get_mmd_dispatcher(interpreter,
  -            left, right, function, &is_pmc);
  +    UINTVAL left_type;
   
  +    left_type = left->vtable->base_type;
  +    real_function = (mmd_f_v_pip)get_mmd_dispatch_type(interpreter,
  +            left_type, 0, function, &is_pmc);
       if (is_pmc) {
           sub = (PMC*)real_function;
  -        ret = Parrot_runops_fromc_args_save(interpreter, sub, "SPP",
  -                left, right);
  +        Parrot_runops_fromc_args_save(interpreter, sub, "vPIP",
  +                left, right, dest);
       }
       else {
  -        ret = (*real_function)(interpreter, left, right);
  +        (*real_function)(interpreter, left, right, dest);
       }
  -    return ret;
   }
   
   /*
   
   =item C<INTVAL
  -mmd_dispatch_intval(Interp *interpreter,
  +mmd_dispatch_i_pp(Interp *interpreter,
                 PMC *left, PMC *right, INTVAL function)>
   
  -Like C<mmd_dispatch_string()>, only it returns an C<INTVAL>.
  +Like C<mmd_dispatch_v_ppp()>, only it returns an C<INTVAL>.
   
   =cut
   
   */
   
   INTVAL
  -mmd_dispatch_intval(Interp *interpreter,
  +mmd_dispatch_i_pp(Interp *interpreter,
                 PMC *left, PMC *right, INTVAL function)
   {
  -    intval_mmd_f real_function;
  +    mmd_f_i_pp real_function;
       PMC *sub;
       int is_pmc;
       INTVAL ret;
   
  -    real_function = (intval_mmd_f)get_mmd_dispatcher(interpreter,
  +    real_function = (mmd_f_i_pp)get_mmd_dispatcher(interpreter,
               left, right, function, &is_pmc);
   
       if (is_pmc) {
           sub = (PMC*)real_function;
           ret = Parrot_runops_fromc_args_save_reti(interpreter, sub, "IPP",
  -                left, right);
  -    }
  -    else {
  -        ret = (*real_function)(interpreter, left, right);
  -    }
  -    return ret;
  -}
  -
  -/*
  -
  -=item C<FLOATVAL
  -mmd_dispatch_floatval(Interp *interpreter,
  -              PMC *left, PMC *right, INTVAL function)>
  -
  -Like C<mmd_dispatch_string()>, only it returns a C<FLOATVAL>.
  -
  -=cut
  -
  -*/
  -
  -FLOATVAL
  -mmd_dispatch_floatval(Interp *interpreter,
  -              PMC *left, PMC *right, INTVAL function)
  -{
  -
  -    floatval_mmd_f real_function;
  -    PMC *sub;
  -    int is_pmc;
  -    FLOATVAL ret;
  -
  -    /*
  -     * XXX actually we don't have a MMD function matching this signature
  -     * -leo
  -     */
  -    real_function = (floatval_mmd_f)get_mmd_dispatcher(interpreter,
  -            left, right, function, &is_pmc);
  -
  -    if (is_pmc) {
  -        sub = (PMC*)real_function;
  -        ret = Parrot_runops_fromc_args_save_reti(interpreter, sub, "NPP",
                   left, right);
       }
       else {
  
  
  
  1.3       +21 -2     parrot/src/mmd_fallback.c
  
  Index: mmd_fallback.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/mmd_fallback.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -w -r1.2 -r1.3
  --- mmd_fallback.c    10 May 2004 08:27:48 -0000      1.2
  +++ mmd_fallback.c    10 May 2004 10:18:54 -0000      1.3
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2003 The Perl Foundation.  All Rights Reserved.
  -$Id: mmd_fallback.c,v 1.2 2004/05/10 08:27:48 leo Exp $
  +$Id: mmd_fallback.c,v 1.3 2004/05/10 10:18:54 leo Exp $
   
   =head1 NAME
   
  @@ -203,7 +203,10 @@
   /*
   
   =item C<void
  -mmd_fallback_bxor_pmc(Parrot_Interp interp, PMC *left, PMC *right, PMC *dest)>
  +mmd_fallback_bxor_pmc(Parrot_Interp, PMC *left, PMC *right, PMC *dest)>
  +
  +=item C<void
  +mmd_fallback_bxor_int(Parrot_Interp, PMC *left, INTVAL right, PMC *dest)>
   
   Gets integers from C<left> and C<right>, performs a binary C<xor> and
   sets the result as an integer in C<dest>.
  @@ -220,6 +223,13 @@
                                 VTABLE_get_integer(interp, right));
   }
   
  +static void
  +mmd_fallback_bxor_int(Parrot_Interp interp, PMC *left, INTVAL right, PMC *dest)
  +{
  +    VTABLE_set_integer_native(interp, dest,
  +                              VTABLE_get_integer(interp, left) ^
  +                              right);
  +}
   /*
   
   =item C<void
  @@ -394,6 +404,9 @@
   =item C<INTVAL
   mmd_fallback_numeq_pmc(Parrot_Interp interp, PMC *left, PMC *right)>
   
  +=item C<INTVAL
  +mmd_fallback_eq_pmc(Parrot_Interp interp, PMC *left, PMC *right)>
  +
   Gets numbers from C<left> and C<right>, performs a numeric equals
   and sets the result as an string in C<dest>.
   
  @@ -439,6 +452,9 @@
   =item C<INTVAL
   mmd_fallback_numcmp_pmc(Parrot_Interp interp, PMC *left, PMC *right)>
   
  +=item C<INTVAL
  +mmd_fallback_cmp_pmc(Parrot_Interp interp, PMC *left, PMC *right)>
  +
   Gets numbers from C<left> and C<right>, performs a numeric comparison
   and sets the result as an string in C<dest>.
   
  @@ -570,6 +586,7 @@
       mmd_add_function(interp, MMD_BAND, (funcptr_t)mmd_fallback_band_pmc);
       mmd_add_function(interp, MMD_BOR, (funcptr_t)mmd_fallback_bor_pmc);
       mmd_add_function(interp, MMD_BXOR, (funcptr_t)mmd_fallback_bxor_pmc);
  +    mmd_add_function(interp, MMD_BXOR_INT, (funcptr_t)mmd_fallback_bxor_int);
       mmd_add_function(interp, MMD_BSL, (funcptr_t)mmd_fallback_bsl_pmc);
       mmd_add_function(interp, MMD_BSR, (funcptr_t)mmd_fallback_bsr_pmc);
       mmd_add_function(interp, MMD_CONCAT, (funcptr_t)mmd_fallback_concat_pmc);
  @@ -577,8 +594,10 @@
       mmd_add_function(interp, MMD_LOR, (funcptr_t)mmd_fallback_lor_pmc);
       mmd_add_function(interp, MMD_LXOR, (funcptr_t)mmd_fallback_lxor_pmc);
       mmd_add_function(interp, MMD_REPEAT, (funcptr_t)mmd_fallback_repeat_pmc);
  +    mmd_add_function(interp, MMD_EQ, (funcptr_t)mmd_fallback_numeq_pmc);
       mmd_add_function(interp, MMD_NUMEQ, (funcptr_t)mmd_fallback_numeq_pmc);
       mmd_add_function(interp, MMD_STREQ, (funcptr_t)mmd_fallback_streq_pmc);
  +    mmd_add_function(interp, MMD_CMP, (funcptr_t)mmd_fallback_numcmp_pmc);
       mmd_add_function(interp, MMD_NUMCMP, (funcptr_t)mmd_fallback_numcmp_pmc);
       mmd_add_function(interp, MMD_STRCMP, (funcptr_t)mmd_fallback_strcmp_pmc);
       mmd_add_function(interp, MMD_SOR, (funcptr_t)mmd_fallback_stringor_pmc);
  
  
  
  1.9       +46 -3     parrot/t/pmc/mmd.t
  
  Index: mmd.t
  ===================================================================
  RCS file: /cvs/public/parrot/t/pmc/mmd.t,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -w -r1.8 -r1.9
  --- mmd.t     5 May 2004 10:14:57 -0000       1.8
  +++ mmd.t     10 May 2004 10:18:58 -0000      1.9
  @@ -1,6 +1,6 @@
   #! perl -w
   # Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -# $Id: mmd.t,v 1.8 2004/05/05 10:14:57 leo Exp $
  +# $Id: mmd.t,v 1.9 2004/05/10 10:18:58 leo Exp $
   
   =head1 NAME
   
  @@ -16,7 +16,7 @@
   
   =cut
   
  -use Parrot::Test tests => 8;
  +use Parrot::Test tests => 10;
   
   output_is(<<'CODE', <<'OUTPUT', "built in");
       new P0, .Integer
  @@ -144,7 +144,7 @@
   
       .local pmc comp
       comp = global "Float_cmp_Integer"
  -    mmdvtregister .MMD_NUMCMP, .Float, .Integer, comp
  +    mmdvtregister .MMD_CMP, .Float, .Integer, comp
   
       $P1 = new Float
       $P2 = new Integer
  @@ -279,4 +279,47 @@
   
   CODE
   42
  +OUTPUT
  +
  +output_is(<<'CODE', <<'OUTPUT', "built in INTVAL");
  +    new P0, .Integer
  +    new P1, .Integer
  +    set P1, 3
  +    bxor P0, P1, 2
  +    print P0
  +    print "\n"
  +    end
  +CODE
  +1
  +OUTPUT
  +
  +output_is(<<'CODE', <<'OUTPUT', "PASM INTVAL");
  +.include "pmctypes.pasm"
  +.include "mmd.pasm"
  +    find_global P10, "Integer_bxor_Intval"
  +    mmdvtregister .MMD_BXOR_INT, .Integer, 0, P10
  +
  +    new P0, .Integer
  +    new P1, .Integer
  +    set P1, 3
  +    bxor P0, P1, 2
  +    print P0
  +    print "\n"
  +    new P0, .PerlInt
  +    new P1, .PerlInt
  +    set P1, 5
  +    bxor P0, P1, 2   # should call PerlInts builtin
  +    print P0
  +    print "\n"
  +    end
  +.pcc_sub Integer_bxor_Intval:
  +    print "ok\n"
  +    set I10, P5
  +    bxor I11, I10, I5
  +    set P6, I11
  +    invoke P1
  +CODE
  +ok
  +1
  +7
   OUTPUT
  
  
  
  1.59      +7 -5      parrot/vtable.tbl
  
  Index: vtable.tbl
  ===================================================================
  RCS file: /cvs/public/parrot/vtable.tbl,v
  retrieving revision 1.58
  retrieving revision 1.59
  diff -u -w -r1.58 -r1.59
  --- vtable.tbl        30 Apr 2004 08:43:53 -0000      1.58
  +++ vtable.tbl        10 May 2004 10:19:02 -0000      1.59
  @@ -1,4 +1,4 @@
  -# $Id: vtable.tbl,v 1.58 2004/04/30 08:43:53 leo Exp $
  +# $Id: vtable.tbl,v 1.59 2004/05/10 10:19:02 leo Exp $
   # [MAIN] #default section name
   
   void init()
  @@ -182,7 +182,7 @@
   void bitwise_and_int(INTVAL value, PMC* dest)
   
   void bitwise_xor(PMC* value, PMC* dest)      MMD_BXOR
  -void bitwise_xor_int(INTVAL value, PMC* dest)
  +void bitwise_xor_int(INTVAL value, PMC* dest) MMD_BXOR_INT
   
   void bitwise_ors(PMC* value, PMC* dest)      MMD_SOR
   void bitwise_ors_str(STRING* value, PMC* dest)
  @@ -208,11 +208,13 @@
   void concatenate_native(STRING* value, PMC* dest)
   
   [CMP]
  -INTVAL is_equal(PMC* value)                  MMD_NUMEQ
  +INTVAL is_equal(PMC* value)                  MMD_EQ
  +INTVAL is_equal_num(PMC* value)              MMD_NUMEQ
  +INTVAL is_equal_str(PMC* value)              MMD_STREQ
   
   INTVAL is_same(PMC* value)
   
  -INTVAL cmp(PMC* value)                       MMD_NUMCMP
  +INTVAL cmp(PMC* value)                       MMD_CMP
   INTVAL cmp_num(PMC* value)                   MMD_NUMCMP
   INTVAL cmp_string(PMC* value)                MMD_STRCMP
   
  
  
  

Reply via email to