[#5563] Non-overridable and non-redefinable methods — Eric Mahurin <eric_mahurin@...>

Lately, I've been thinking about the future of ruby

44 messages 2005/08/19
[#5564] Re: Non-overridable and non-redefinable methods — Austin Ziegler <halostatue@...> 2005/08/19

On 8/19/05, Eric Mahurin <eric_mahurin@yahoo.com> wrote:

[#5571] Re: Non-overridable and non-redefinable methods — Eric Mahurin <eric_mahurin@...> 2005/08/19

--- Austin Ziegler <halostatue@gmail.com> wrote:

[#5574] Re: Non-overridable and non-redefinable methods — TRANS <transfire@...> 2005/08/20

Just wanted to add a few things.

[#5581] Re: Non-overridable and non-redefinable methods — Austin Ziegler <halostatue@...> 2005/08/20

On 8/19/05, TRANS <transfire@gmail.com> wrote:

[#5583] Re: Non-overridable and non-redefinable methods — "David A. Black" <dblack@...> 2005/08/20

Hi --

[#5585] Re: Non-overridable and non-redefinable methods — Eric Mahurin <eric_mahurin@...> 2005/08/20

--- "David A. Black" <dblack@wobblini.net> wrote:

[#5609] Pathname#walk for traversing path nodes (patch) — ES <ruby-ml@...>

Here is a small addition to Pathname against 1.9, probably suited

20 messages 2005/08/22

Re: Non-overridable and non-redefinable methods

From: SASADA Koichi <ko1@...>
Date: 2005-08-20 23:33:05 UTC
List: ruby-core #5591
Hi,

Florian Growrote:
> I'd propose doing it similar to YARV. Optimize 1 + 2, but only if you 
> clearly see a Fixnum.freeze at the beginning of the file.

YARV doesn't inline Fixnum#+.  If Fixnum#+ is redefined, YARV invoke 
redefined function (same as current Ruby interpreter).   ... In the 
future version.  I have already inserted redefine check code, but not 
write redefine notify code (in rb_define_method()).


pseudo instruction code of current YARV:

instruction opt_plus(recv, obj){
   if(FIXNUM_P(recv) && FIXNUM_P(obj) &&
      !REDEFINED(FIXNUM, +)){
     /* in real code, you must check overflow */
     return INT2FIX(FIX2INT(recv)+FIX2INT(obj));
   }
   else if(...){
     ...
   }
   else{
     return recv.__send__(:+, obj);
   }
}

This optimization makss good performance.

===============================================
Another idea:

fixnum_plus(recv, obj){
   if(FIXNUM_P(recv) && FIXNUM_P(obj)){
     return INT2FIX(FIX2INT(recv) + FIX2INT(obj));
   }
   else{
     vm->plus_func = search_plus_func(recv, obj);
     return vm->plus_func(recv, obj);
   }
}

search_plus_func(recv, obj){
   if(FIXNUM_P(recv) && FIXNUM_P(obj) && !redefine(Fixnum#+)){
     return fixnum_plus;
   }
   else if(CLASS_OF(recv) == String && CLASS_OF(obj) == String
           && !redefine(String#+)){
     return string_plus;
   }
   ...
   return normal_dispatch;
}

vm->plus_func = fixnum_plus;

define_method(klass, id, body){
   ...
   if(klass == Fixnum && id == :+){
     vm->plus_func = normal_dispatch;
   }
   ...
}

instruction opt_plus(recv, obj){
   func = vm->plus_func;
   return func(recv, obj);
}


* good:
   * flexibile replacement of inlining code with context

* bad:
   * C function call overhead
   * design "normal_dispatch" is difficult


===============================================

Re-compile inlining code if someone redefines some special methods, has 
some difficulty.  If re-compiled function was already called, you must 
replace return address of method like "on stack replacement".


===============================================


BTW, I hate redefinable method for VM performance (of course!).  But 
redefine method is power of language (flexibility, refrectionability). 
IMO, if you restrict Ruby's language specification, it will be Ruby--. 
I'm trying to beet this "bad specification for performance" with VM 
implementation technique (not change specification).

(But current ruby interpreter inlinie "/foo/ =~ expr" ...)

Of course, I want to add restriction to Ruby's specification :) 
Especially Evil Eval!


Excume me my poor English.
Regards,
-- 
SASADA Koichi at atdot dot net

In This Thread