On Thursday 19 June 2008 07:28:55 [EMAIL PROTECTED] wrote: > Log: > [rakudo] Implement basic use of does operator for mixing in a role to an > existing object at runtime. This was most neatly done with a dynop, so this > check-in also adds a dynops file for Rakudo. make makefile will be required > to build after this check-in.
> Added: trunk/languages/perl6/src/ops/perl6.ops > =========================================================================== >=== --- (empty file) > +++ trunk/languages/perl6/src/ops/perl6.ops Thu Jun 19 07:28:54 2008 > @@ -0,0 +1,77 @@ > +/* > + * $Id:$ > + * Copyright (C) 2008, The Perl Foundation. > + */ > + > +#include "parrot/dynext.h" > +#include "../../../../src/pmc/pmc_object.h" > +VERSION = PARROT_VERSION; > + > +/* */ > +inline op rebless_subclass(in PMC, in PMC) :base_core { > + PMC *current_class; > + PMC *parent_list; > + PMC *value; > + int i, num_parents, in_parents, new_attribs; > + > + /* First verify that the object's class is a superclass of the one > we're + * to re-bless it into. While we're at it, count the number of > attributes + * the current class has that the parent class does not. */ > + current_class = VTABLE_get_class(interp, $1); > + parent_list = VTABLE_inspect_str(interp, $2, > string_from_literal(interp, "all_parents")); > + num_parents = VTABLE_elements(interp, parent_list); > + in_parents = 0; > + new_attribs = 0; The initializations and declarations can go on the same lines. I'd like to replace all of the string_from_literal with const_string. While the former calculates the string length at compile time (and saves a very short strlen call at runtime), const_string uses a cache of constant string headers, trading a lookup cost to retrieve or store a singletone string header for not allocating a new non-constant string header on each invocation. We'll already have "Mutable" and "attributes" in the cache, so this is effectively a free optimization. -- c