Good catch on thread-safety. This delegate is actually experimental (demo-ware
:)) so it doesn''t matter so much. I''ll add a comment that
thread-safety needs to be considered.
Tomas
-----Original Message-----
From: Curt Hagenlocher
Sent: Friday, June 05, 2009 8:43 AM
To: Tomas Matousek; IronRuby External Code Reviewers; Rowan Code Reviewers
Cc: ironruby-core at rubyforge.org
Subject: RE: Code Review: LazyMethods
Looks good overall.
Should RubyContext.CallSiteCreated be ThreadLocal? If not, its use by
CallSiteTracer looks not-entirely-safe.
The variable name "parantScope" in RubyOps.CreateMethodScope is
typoed.
-----Original Message-----
From: Tomas Matousek
Sent: Thursday, June 04, 2009 3:32 PM
To: IronRuby External Code Reviewers; Rowan Code Reviewers
Cc: ironruby-core at rubyforge.org
Subject: Code Review: LazyMethods
tfpt review "/shelveset:LazyMethods;REDMOND\tomat"
A simple change in DLR.
Ruby:
Implements lazy method transformation. Previously a method was transformed to
DLR AST as soon as it was defined (def foo; ...; end). We can postpone the
transformation until the method is called for the first time. This significantly
improves startup time. For example (not NGEN''d):
require ''benchmark''
Benchmark.bm { |x| x.report { require ''rubygems'' } }
user system total real
eager transformation
1.622410 0.031200 1.653611 ( 1.581316)
lazy transformation
1.170008 0.031200 1.201208 ( 1.099220)
Although Ruby methods (unlike block) don''t close over variables we
still need 2 closure variables: the parent lexical runtime scope and the module
that the method is declared in (for implementation of super). These were
previously DLR closure variables. They are live constants now. Ruby method
pre-compilation would require additional work, so we don''t support it
for now.
Tomas