cvsuser 05/04/03 03:14:42
Modified: include/parrot mmd.h
lib/Parrot Vtable.pm
src mmd.c mmd_fallback.c objects.c
Log:
MMD 13 - create MMD method names
Revision Changes Path
1.25 +5 -65 parrot/include/parrot/mmd.h
Index: mmd.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/mmd.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- mmd.h 2 Apr 2005 16:54:52 -0000 1.24
+++ mmd.h 3 Apr 2005 10:14:39 -0000 1.25
@@ -49,71 +49,11 @@
in question */
} MMD_table;
-/* Need this for add, subtract, multiply, divide, mod, cmod, bitwise
- (and, or, xor, lshift, rshift), concat, logical (and, or, xor),
- repeat, eq, cmp */
-
-/* &gen_from_enum(mmd.pasm) */
-
-typedef enum {
- MMD_ADD,
- MMD_ADD_INT,
- MMD_ADD_FLOAT,
- MMD_SUBTRACT,
- MMD_SUBTRACT_INT,
- MMD_SUBTRACT_FLOAT,
- MMD_MULTIPLY,
- MMD_MULTIPLY_INT,
- MMD_MULTIPLY_FLOAT,
- MMD_DIVIDE,
- MMD_DIVIDE_INT,
- MMD_DIVIDE_FLOAT,
- MMD_FLOOR_DIVIDE,
- MMD_FLOOR_DIVIDE_INT,
- MMD_FLOOR_DIVIDE_FLOAT,
- MMD_MOD,
- MMD_MOD_INT,
- MMD_MOD_FLOAT,
- MMD_CMOD,
- MMD_CMOD_INT,
- MMD_CMOD_FLOAT,
- MMD_POW,
- MMD_POW_FLOAT,
- MMD_POW_INT,
- 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_SOR_STR,
- MMD_SAND,
- MMD_SAND_STR,
- MMD_SXOR,
- MMD_SXOR_STR, /* must be last due to init sequence */
-
- MMD_USER_FIRST
-} parrot_mmd_func_enum;
+/*
+ * in src/objects.c :
+ */
+const char* Parrot_MMD_methode_name(Interp* i, INTVAL idx);
-/* &end_gen */
#endif /* PARROT_MMD_H_GUARD */
/*
1.43 +38 -2 parrot/lib/Parrot/Vtable.pm
Index: Vtable.pm
===================================================================
RCS file: /cvs/public/parrot/lib/Parrot/Vtable.pm,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- Vtable.pm 9 Mar 2005 14:52:00 -0000 1.42
+++ Vtable.pm 3 Apr 2005 10:14:41 -0000 1.43
@@ -233,8 +233,44 @@
$macros .= <<"EOM";
NULL
};
-#endif
+#endif /* PARROT_IN_OBJECTS_C */
+
+/* Need this for add, subtract, multiply, divide, mod, cmod, bitwise
+ (and, or, xor, lshift, rshift), concat, logical (and, or, xor),
+ repeat, eq, cmp */
+
+/* &gen_from_enum(mmd.pasm) */
+
+typedef enum {
+EOM
+ for my $entry (@{$vtable}) {
+ next unless ($entry->[4] =~ /MMD_/);
+ $macros .= <<"EOM";
+ $entry->[4],
+EOM
+ }
+ $macros .=<<"EOM";
+ MMD_USER_FIRST
+} parrot_mmd_func_enum;
+
+/* &end_gen */
+
+#ifdef PARROT_IN_OBJECTS_C
+static const char * const Parrot_mmd_func_names[] = {
+EOM
+
+ for my $entry (@{$vtable}) {
+ next unless ($entry->[4] =~ /MMD_/);
+ $macros .= <<"EOM";
+ \"__$entry->[1]\",
+EOM
+ }
+ $macros .= <<"EOM";
+ NULL
+};
+
+#endif
EOM
$macros;
1.59 +13 -1 parrot/src/mmd.c
Index: mmd.c
===================================================================
RCS file: /cvs/public/parrot/src/mmd.c,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- mmd.c 2 Apr 2005 16:54:54 -0000 1.58
+++ mmd.c 3 Apr 2005 10:14:42 -0000 1.59
@@ -1339,6 +1339,18 @@
const MMD_init *mmd_table, INTVAL n)
{
INTVAL i;
+ MMD_table *table;
+
+ table = interpreter->binop_mmd_funcs;
+ if (table->x < type && type < enum_class_core_max) {
+ /*
+ * pre-alloacte the function table
+ */
+ for (i = 0; i < MMD_USER_FIRST; ++i) {
+ mmd_register(interpreter, i, enum_class_core_max - 1,
+ enum_class_core_max - 1, NULL);
+ }
+ }
/*
* register default mmds for this type
*/
1.7 +19 -3 parrot/src/mmd_fallback.c
Index: mmd_fallback.c
===================================================================
RCS file: /cvs/public/parrot/src/mmd_fallback.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- mmd_fallback.c 27 Jun 2004 15:29:55 -0000 1.6
+++ mmd_fallback.c 3 Apr 2005 10:14:42 -0000 1.7
@@ -543,6 +543,16 @@
string_repeat(interp, base, count, NULL));
}
+static void
+mmd_fallback_repeat_int(Parrot_Interp interp, PMC *left, INTVAL count, PMC
*dest)
+{
+ STRING *base;
+
+ base = VTABLE_get_string(interp, left);
+
+ VTABLE_set_string_native(interp, dest,
+ string_repeat(interp, base, count, NULL));
+}
/*
=item C<INTVAL
@@ -744,10 +754,14 @@
void
register_fallback_methods(Parrot_Interp interp) {
+ INTVAL i;
+
/* Yeah, this first one's out of order logically, but it means
the table doesn't have to keep being re-malloc'd */
- mmd_add_function(interp, MMD_SXOR_STR,
- (funcptr_t)mmd_fallback_stringxor_str);
+ assert(MMD_REPEAT_INT == MMD_USER_FIRST - 1);
+ mmd_add_function(interp, MMD_REPEAT_INT,
+ (funcptr_t)mmd_fallback_repeat_int);
+
mmd_add_function(interp, MMD_ADD, (funcptr_t)mmd_fallback_add_pmc);
mmd_add_function(interp, MMD_ADD_INT, (funcptr_t)mmd_fallback_add_int);
mmd_add_function(interp, MMD_SUBTRACT,
@@ -803,6 +817,8 @@
mmd_add_function(interp, MMD_SAND_STR,
(funcptr_t)mmd_fallback_stringand_str);
mmd_add_function(interp, MMD_SXOR,
(funcptr_t)mmd_fallback_stringxor_pmc);
+ mmd_add_function(interp, MMD_SXOR_STR,
+ (funcptr_t)mmd_fallback_stringxor_str);
}
/*
1.138 +20 -1 parrot/src/objects.c
Index: objects.c
===================================================================
RCS file: /cvs/public/parrot/src/objects.c,v
retrieving revision 1.137
retrieving revision 1.138
diff -u -r1.137 -r1.138
--- objects.c 10 Mar 2005 17:10:14 -0000 1.137
+++ objects.c 3 Apr 2005 10:14:42 -0000 1.138
@@ -242,6 +242,25 @@
/*
+=item C<const char* Parrot_MMD_methode_name(Interp*, INTVAL)>
+
+Return the method name for the given MMD enum.
+
+=cut
+
+*/
+const char*
+Parrot_MMD_methode_name(Interp* interpreter, INTVAL idx)
+{
+ assert(idx >= 0);
+
+ if (idx >= MMD_USER_FIRST)
+ return NULL;
+ return Parrot_mmd_func_names[idx];
+}
+
+/*
+
=item C<PMC *
Parrot_single_subclass(Parrot_Interp ointerpreter, PMC *base_class,
STRING *child_class_name)>