[#5524] Division weirdness in 1.9 — "Florian Frank" <flori@...>
Hi,
[#5536] bug in variable assignment — Mauricio Fern疣dez <mfp@...>
Hi,
On Mon, Aug 08, 2005 at 11:36:22AM +0900, nobuyoshi nakada wrote:
hi,
Hi,
[#5552] Exceptions in threads all get converted to a TypeError — Paul van Tilburg <paul@...>
Hey all,
[#5563] Non-overridable and non-redefinable methods — Eric Mahurin <eric_mahurin@...>
Lately, I've been thinking about the future of ruby
On 8/19/05, Eric Mahurin <eric_mahurin@yahoo.com> wrote:
--- Austin Ziegler <halostatue@gmail.com> wrote:
Just wanted to add a few things.
On 8/19/05, TRANS <transfire@gmail.com> wrote:
Hi --
--- "David A. Black" <dblack@wobblini.net> wrote:
On 8/20/05, Eric Mahurin <eric_mahurin@yahoo.com> wrote:
On 8/20/05, TRANS <transfire@gmail.com> wrote:
On 8/19/05, Eric Mahurin <eric_mahurin@yahoo.com> wrote:
--- Austin Ziegler <halostatue@gmail.com> wrote:
On 20 Aug 2005, at 02:05, Eric Mahurin wrote:
Eric Hodel wrote:
Eric Mahurin wrote:
Hi,
--- SASADA Koichi <ko1@atdot.net> wrote:
Hi,
--- SASADA Koichi <ko1@atdot.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
Evan Webb wrote:
In article <43094510.6090406@magical-cat.org>,
[#5651] File.extname edge case bug? — Daniel Berger <Daniel.Berger@...>
Hi all,
[#5662] Postgrey — Shugo Maeda <shugo@...>
Hi,
[#5676] uri test failures. (Re: [ruby-cvs] ruby/lib, ruby/lib/uri: Lovely RDOC patches from mathew (metaATpoboxDOTcom) on URI/* and getoptlong.rb) — Tanaka Akira <akr@...17n.org>
In article <20050824050801.5B4E0C671F@lithium.ruby-lang.org>,
[#5680] Problem with mkmf and spaces in directory names? — noreply@...
Bugs item #2308, was opened at 2005-08-25 13:42
[#5685] Wilderness Project — "Charles E. Thornton" <ruby-core@...>
OK - I see where ELTS_SHARED is used to implement COPY-ON-WRITE
Re: Non-overridable and non-redefinable methods
--- SASADA Koichi <ko1@atdot.net> wrote:
> Hi,
>
> Eric Mahurin wrote:
> > What I'm talking about above (inlining certain methods in
> > Object tagged as non-overridable) wouldn't require any
> static
> > analysis because these methods would be independent of
> class.
For this case, let's say Object#nil? is non-overridable.
Whenever you have obj.nil?, it would be equivalent to:
obj.__id__==nil.__id__
well, that is if __id__ was also nonoverridable and Fixnum#==
wasn't redefined. No method calls needed after this is
inlined. This could be done independent of the class of obj.
> > It is unfortunate that you've abandoned static analysis. I
> > think you could see huge performance improvements if you
> went
> > that route. I believe you could approach C/C++ performance
> -
> > like Java is on every release. To really go down this
> path,
> > you would have to recompile a method for each set of
> classes it
> > is called with (recursively). So for one method in ruby,
> it
> > might be compiled into many methods statically typed and
> > possibly some partially or not static typed. And you could
> > also in-line in the right places easily - because you know
> the
> > class. Of course the big problem to all of this is
> redefinable
> > methods.
>
> I can't understand what you proposing (because of my English
> skills and
> Programming skills). Can I get some example (pseudo code)
> for
> translation? I think inlining a Ruby method is quite
> difficult.
Here is an example:
module ComparableSequence
def compare(seq)
i=0
loop {
a = self[i]
b = seq[i]
a && a==b or return i,a,b
i += 1
}
end
end
class String;include ComparableSequence;end
class Array;include ComparableSequence;end
"hi".compare("hi")
"hi".compare([?h,?i])
[?h,?i].compare("hi")
[?h,?i].compare([?h,?i])
I'm suggesting that in the above, the method compare would be
split by the compiler/VM into 4 optimized versions - one for
each set of classes for self and seq. Every call could of a
method could end up referring to a different version. For
example in the String#compare(aString) version, you could do
these things:
- determine that i is a Fixnum (or at least an Integer). It
should stay in the Fixnum range because String#[aBignum] should
cause an exception. I'm not going to say this is easy.
- determine that a and b are always Fixnum's because
String#[anInteger] always returns a Fixnum
- a==b can become Fixnum#==(aFixnum) which can be in-lined
- i + 1 can become Integer#+(aFixnum) or possibly
Fixnum#+(aFixnum). Maybe even optimize the += completely to
become something like ++i in C.
When optimizing the Array#compare(anArray) method, you won't be
able to do all of these optimizations so easily since it isn't
know that a and b are Fixnum's. It would be nice if you could
potentially statically track what could be in an Array also,
but that would quite difficult.
Again, the problem with all of the above is the redefinability
of the methods. Where the programmer wants these
optimizations, the klass.freeze method could be used as
suggested earlier. You'd only inline instance methods from
classes that are frozen.
____________________________________________________
Start your day with Yahoo! - make it your home page
http://www.yahoo.com/r/hs