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