[svn:parrot] r40789 - in trunk: src src/pmc t/pmc
pmichaud at svn.parrot.org
pmichaud at svn.parrot.org
Tue Aug 25 18:50:13 UTC 2009
Author: pmichaud
Date: Tue Aug 25 18:50:11 2009
New Revision: 40789
URL: https://trac.parrot.org/parrot/changeset/40789
Log:
[oo] Remove the use of string name comparisons in VTABLE_isa_pmc checks.
This results in a ~4.5% overall speed improvement for Rakudo's spectests.
In the process we also eliminate the creation of bogus PMCProxy objects
for instances of the Class PMC. This commit also marks one test as "todo"
that likely wasn't working properly to begin with.
Modified:
trunk/src/oo.c
trunk/src/pmc/class.pmc
trunk/t/pmc/threads.t
Modified: trunk/src/oo.c
==============================================================================
--- trunk/src/oo.c Tue Aug 25 17:50:03 2009 (r40788)
+++ trunk/src/oo.c Tue Aug 25 18:50:11 2009 (r40789)
@@ -372,11 +372,18 @@
static PMC *
get_pmc_proxy(PARROT_INTERP, INTVAL type)
{
+ PMC * type_class;
ASSERT_ARGS(get_pmc_proxy)
/* Check if not a PMC or invalid type number */
if (type > interp->n_vtable_max || type <= 0)
return PMCNULL;
+
+ type_class = interp->vtables[type]->pmc_class;
+ if (type != enum_class_Class
+ && type_class->vtable->base_type == enum_class_Class) {
+ return type_class;
+ }
else {
PMC * const parrot_hll = Parrot_get_namespace_keyed_str(interp, interp->root_namespace, CONST_STRING(interp, "parrot"));
PMC * const pmc_ns =
Modified: trunk/src/pmc/class.pmc
==============================================================================
--- trunk/src/pmc/class.pmc Tue Aug 25 17:50:03 2009 (r40788)
+++ trunk/src/pmc/class.pmc Tue Aug 25 18:50:11 2009 (r40789)
@@ -1292,21 +1292,6 @@
/* Check if the class object is the same as self's class object */
if (VTABLE_is_same(interp, SELF, classobj))
return 1;
- else {
- STRING * const classname = VTABLE_get_string(interp, classobj);
- const INTVAL is_proxy = (SELF->vtable->base_type == enum_class_PMCProxy);
-
- /* avoid the expensive string copy, if possible */
- STRING * const self_name = is_proxy
- ? VTABLE_get_string(interp, SELF)
- : make_class_name(interp, SELF);
-
- /* Check if the passed name is the same as the stored short name. */
- const INTVAL name_match = Parrot_str_equal(interp, classname, self_name);
-
- if (name_match)
- return 1;
- }
/* Iterate over all the parents and check if they respond true
* for 'isa' on the original comparison. */
Modified: trunk/t/pmc/threads.t
==============================================================================
--- trunk/t/pmc/threads.t Tue Aug 25 17:50:03 2009 (r40788)
+++ trunk/t/pmc/threads.t Tue Aug 25 18:50:11 2009 (r40789)
@@ -535,7 +535,7 @@
OUTPUT
}
-pir_output_is( <<'CODE', <<'OUTPUT', "CLONE_CODE | CLONE_CLASSES; superclass built-in" );
+pir_output_is( <<'CODE', <<'OUTPUT', "CLONE_CODE | CLONE_CLASSES; superclass built-in", todo => 'likely incorrect test');
.namespace [ 'Foo' ]
.sub foometh :method
More information about the parrot-commits
mailing list