edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/CallBuilder.cs;C429806
File: CallBuilder.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/CallBuilder.cs;C429806  (server)    6/2/2008 5:28 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/CallBuilder.cs;Symbols
@@ -57,7 +57,7 @@
             _args.Insert(index, new KeyValuePair<MSA.Expression, MSA.ArgumentKind>(expression, kind));
         }
 
-        public MSA.Expression/*!*/ MakeInvokeAction(SymbolId name) {
+        public MSA.Expression/*!*/ MakeInvokeAction(string/*!*/ name) {
             return Ast.Action.InvokeMember(_gen.Binder, name, typeof(object), new CallSignature(ArgumentKinds), GetExpressions());
         }
 
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Assignments/MemberAssignmentExpression.cs;C456173
File: MemberAssignmentExpression.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Assignments/MemberAssignmentExpression.cs;C456173  (server)    6/2/2008 5:31 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Assignments/MemberAssignmentExpression.cs;Symbols
@@ -55,7 +55,9 @@
         }
 
         internal override MSA.Expression/*!*/ TransformRead(AstGenerator/*!*/ gen) {
-            SymbolId setterName = SymbolTable.StringToId(SymbolTable.IdToString(_memberName) + "=");
+            string memberName = SymbolTable.IdToString(_memberName);
+            string operation = SymbolTable.IdToString(Operation);
+            string setterName = memberName + "=";
 
             MSA.Expression transformedLeftTarget = _leftTarget.TransformRead(gen);
             MSA.Expression transformedRight = _right.TransformRead(gen);
@@ -65,7 +67,7 @@
             // lhs &&= rhs  -->  left.member && (left.member = rhs)
             // lhs ||= rhs  -->  left.member || (left.member = rhs)
             if (Operation == Symbols.And || Operation == Symbols.Or) {
-                MSA.Expression leftMemberRead = MethodCall.TransformRead(gen, _memberName, Ast.Assign(leftTemp, transformedLeftTarget), null, null, null);
+                MSA.Expression leftMemberRead = MethodCall.TransformRead(gen, memberName, Ast.Assign(leftTemp, transformedLeftTarget), null, null, null);
                 MSA.Expression transformedWrite = MethodCall.TransformRead(gen, setterName, leftTemp, null, null, transformedRight);
 
                 if (Operation == Symbols.And) {
@@ -75,8 +77,8 @@
                 }
             } else {
                 // left.member= left.member().op(right)
-                MSA.Expression leftMemberRead = MethodCall.TransformRead(gen, _memberName, leftTemp, null, null, null);
-                MSA.Expression operationCall = MethodCall.TransformRead(gen, Operation, leftMemberRead, null, transformedRight, null);
+                MSA.Expression leftMemberRead = MethodCall.TransformRead(gen, memberName, leftTemp, null, null, null);
+                MSA.Expression operationCall = MethodCall.TransformRead(gen, operation, leftMemberRead, null, transformedRight, null);
                 MSA.Expression transformedWrite = MethodCall.TransformRead(gen, setterName, Ast.Assign(leftTemp, transformedLeftTarget), null, null, operationCall);
                 return transformedWrite;
             }
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Assignments/SimpleAssignmentExpression.cs;C456173
File: SimpleAssignmentExpression.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Assignments/SimpleAssignmentExpression.cs;C456173  (server)    6/2/2008 6:31 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Assignments/SimpleAssignmentExpression.cs;Symbols
@@ -83,7 +83,8 @@
                 // lhs op= rhs  -->  lhs = lhs op rhs
                 if (_operation != SymbolId.Empty) {
                     MSA.Expression transformedLeftRead = _left.TransformRead(gen, leftTargetTemp, false);
-                    transformedRight = MethodCall.TransformRead(gen, _operation, transformedLeftRead, null, transformedRight, null);
+                    string operation = SymbolTable.IdToString(_operation);
+                    transformedRight = MethodCall.TransformRead(gen, operation, transformedLeftRead, null, transformedRight, null);
                 }
 
                 // transform lhs write assigning lhs-target temp:
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Expressions/CaseExpression.cs;C456173
File: CaseExpression.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Expressions/CaseExpression.cs;C456173  (server)    6/2/2008 5:28 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Expressions/CaseExpression.cs;Symbols
@@ -80,7 +80,7 @@
         private static MSA.Expression/*!*/ MakeTest(AstGenerator/*!*/ gen, MSA.Expression/*!*/ expr, MSA.Expression/*!*/ value) {
             if (value != null) {
                 // InvokeMember("===", <expr>, <value>)
-                expr = Ast.Action.InvokeMember(gen.Binder, Symbols.StrictEqual, typeof(object),
+                expr = Ast.Action.InvokeMember(gen.Binder, "===", typeof(object),
                     new CallSignature(MSA.ArgumentKind.Instance, MSA.ArgumentKind.Simple),
                     Ast.CodeContext(),
                     expr,
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Expressions/ForLoopExpression.cs;C456173
File: ForLoopExpression.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Expressions/ForLoopExpression.cs;C456173  (server)    6/2/2008 5:27 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Expressions/ForLoopExpression.cs;Symbols
@@ -57,7 +57,7 @@
 
             MSA.Expression blockArgVariable = gen.CurrentCodeBlock.CreateTemporaryVariable("#forloop-block", typeof(Proc));
 
-            MSA.Expression result = Ast.Action.InvokeMember(gen.Binder, Symbols.Each, typeof(object),
+            MSA.Expression result = Ast.Action.InvokeMember(gen.Binder, "each", typeof(object),
                 new CallSignature( 
                     new ArgumentInfo(MSA.ArgumentKind.Instance), 
                     new ArgumentInfo(MSA.ArgumentKind.Block) 
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Expressions/MethodCall.cs;C456173
File: MethodCall.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Expressions/MethodCall.cs;C456173  (server)    6/2/2008 5:29 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/Expressions/MethodCall.cs;Symbols
@@ -49,10 +49,10 @@
         }
         
         internal override MSA.Expression/*!*/ TransformRead(AstGenerator/*!*/ gen) {
-            return TransformRead(gen, _methodName, _target, Arguments, null, null);
+            return TransformRead(gen, SymbolTable.IdToString(_methodName), _target, Arguments, null, null);
         }
 
-        internal static MSA.Expression/*!*/ TransformRead(AstGenerator/*!*/ gen, SymbolId methodName, Expression target,
+        internal static MSA.Expression/*!*/ TransformRead(AstGenerator/*!*/ gen, string/*!*/ methodName, Expression target,
             Arguments arguments, MSA.Expression singleArgument, MSA.Expression rhsArgument) {
             
             MSA.Expression transformedTarget = (target != null) ? target.TransformRead(gen) : gen.CurrentSelfVariable;
@@ -62,11 +62,13 @@
         // arguments: complex arguments (expressions, maplets, splat, block) 
         // singleArgument: siple argument (complex are not used)
         // assignmentRhsArgument: rhs of the assignment: target.method=(rhs)
-        internal static MSA.Expression/*!*/ TransformRead(AstGenerator/*!*/ gen, SymbolId methodName, MSA.Expression/*!*/ transformedTarget,
+        internal static MSA.Expression/*!*/ TransformRead(AstGenerator/*!*/ gen, string/*!*/ methodName, MSA.Expression/*!*/ transformedTarget,
             Arguments arguments, MSA.Expression singleArgument, MSA.Expression assignmentRhsArgument) {
+
             bool isCallWithBlock = arguments != null && arguments.Block != null;
             Debug.Assert(assignmentRhsArgument == null || !isCallWithBlock, "Block not allowed in assignment");
             Debug.Assert(singleArgument == null || arguments == null && assignmentRhsArgument == null);
+            Assert.NotNull(gen, methodName, transformedTarget);
 
             // Pass args in this order:
             // 1. instance
@@ -100,12 +102,12 @@
 
             MSA.Expression result = gen.DebugMark(
                 callBuilder.MakeInvokeAction(methodName),
-                SymbolTable.IdToString(methodName)
+                methodName
             );
 
             if (isCallWithBlock) {
-                result = gen.DebugMark(MakeCallWithBlockRetryable(gen, result, blockArgVariable, transformedBlock, arguments.Block.IsDefinition), 
-                    "#RB: method call with a block ('" + SymbolTable.IdToString(methodName) + "')");
+                result = gen.DebugMark(MakeCallWithBlockRetryable(gen, result, blockArgVariable, transformedBlock, arguments.Block.IsDefinition),
+                    "#RB: method call with a block ('" + methodName + "')");
             }
 
             if (assignmentRhsArgument != null) {
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/LeftValues/ArrayItemAccess.cs;C440810
File: ArrayItemAccess.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/LeftValues/ArrayItemAccess.cs;C440810  (server)    6/2/2008 5:32 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/LeftValues/ArrayItemAccess.cs;Symbols
@@ -54,12 +54,12 @@
 
         internal override MSA.Expression/*!*/ TransformRead(AstGenerator/*!*/ gen, MSA.Expression targetValue, bool tryRead) {
             Assert.NotNull(gen, targetValue);
-            return MethodCall.TransformRead(gen, Symbols.ArrayItemRead, targetValue, _arguments, null, null);
+            return MethodCall.TransformRead(gen, "[]", targetValue, _arguments, null, null);
         }
 
         internal override MSA.Expression/*!*/ TransformWrite(AstGenerator/*!*/ gen, MSA.Expression target, MSA.Expression/*!*/ rightValue) {
             Assert.NotNull(target);
-            return MethodCall.TransformRead(gen, Symbols.ArrayItemWrite, target, _arguments, null, rightValue);
+            return MethodCall.TransformRead(gen, "[]=", target, _arguments, null, rightValue);
         }
     }
 
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/LeftValues/AttributeAccess.cs;C440810
File: AttributeAccess.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/LeftValues/AttributeAccess.cs;C440810  (server)    6/2/2008 5:32 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Ast/LeftValues/AttributeAccess.cs;Symbols
@@ -65,7 +65,8 @@
 
         internal override MSA.Expression/*!*/ TransformWrite(AstGenerator/*!*/ gen, MSA.Expression/*!*/ targetValue, MSA.Expression/*!*/ rightValue) {
             Assert.NotNull(gen, targetValue, rightValue);
-            return MethodCall.TransformRead(gen, _name, targetValue, null, null, rightValue);
+            string name = SymbolTable.IdToString(_name);
+            return MethodCall.TransformRead(gen, name, targetValue, null, null, rightValue);
         }        
     }
 }
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/Loader.cs;C456173
File: Loader.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/Loader.cs;C456173  (server)    5/22/2008 6:15 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/Loader.cs;Symbols
@@ -79,7 +79,12 @@
         // counters:
         private int _cacheHitCount;
         private int _compiledFileCount;
+        private Stopwatch _totalILGenerationTime = new Stopwatch();
+        private Stopwatch _totalAstGenerationTime = new Stopwatch();
 
+        internal Stopwatch TotalILGenerationTime { get { return _totalILGenerationTime; } }
+        internal Stopwatch TotalAstGenerationTime { get { return _totalAstGenerationTime; } }
+
         /// <summary>
         /// TODO: Thread safety: the user of this object is responsible for locking it.
         /// </summary>
@@ -310,8 +315,11 @@
                 RubyCompilerOptions options = new RubyCompilerOptions();
                 options.IsIncluded = true;
                 options.IsWrapped = (flags & LoadFlags.LoadIsolated) != 0;
+
+                _totalAstGenerationTime.Start();
                 compiledCode = sourceUnit.Compile(options, _executionContext.RuntimeErrorSink);
-
+                _totalAstGenerationTime.Stop();
+                
                 if (_executionContext.Context.EngineOptions.SaveToDisk) {
                     _compiledFiles[fullPath] = new CompiledFile(compiledCode);
                 }
@@ -320,11 +328,15 @@
             RunScriptCode(context, compiledCode, false);
         }
 
-        internal static object RunScriptCode(CodeContext context, ScriptCode code, bool tryEvaluate) {
+        internal object RunScriptCode(CodeContext context, ScriptCode code, bool tryEvaluate) {
             if (tryEvaluate) {
                 return Microsoft.Scripting.Interpretation.Interpreter.TopLevelExecute(code.Lambda, context);
             }
 
+            _totalILGenerationTime.Start();
+            code.EnsureCompiled();
+            _totalILGenerationTime.Stop();
+
             return code.Run(context);
         }
 
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyContext.cs;C456173
File: RubyContext.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyContext.cs;C456173  (server)    5/22/2008 6:23 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyContext.cs;Symbols
@@ -29,6 +29,7 @@
 using Ruby.Compiler;
 using Ruby.Compiler.Ast;
 using Ruby.Runtime.Calls;
+using System.Diagnostics;
 
 namespace Ruby.Runtime {
 
@@ -50,6 +51,8 @@
         private readonly CodeContext/*!*/ _emptyContext;
         private RubyEngineOptions/*!*/ _engineOptions;
 
+        private readonly Stopwatch _upTime;
+
         public override EngineOptions Options {
             get { return _engineOptions; }
         }
@@ -84,6 +87,10 @@
 
         public RubyContext(ScriptDomainManager/*!*/ manager) : base(manager) {
             ContractUtils.RequiresNotNull(manager, "manager");
+            
+            _upTime = new Stopwatch();
+            _upTime.Start();
+
             _engineOptions = new RubyEngineOptions();
 
             InitializeExecutionContext();
@@ -201,6 +208,18 @@
         static DynamicSite<BlockParam, object>/*!*/ _AtExitSite;
 
         public override void Shutdown() {
+            _upTime.Stop();
+            Debug.WriteLine(String.Format(@"
+  total: {0}
+  il:    {1}
+  ast:   {2}
+", 
+                    _upTime.Elapsed, 
+                    _executionContext.Loader.TotalILGenerationTime.Elapsed, 
+                    _executionContext.Loader.TotalAstGenerationTime.Elapsed),
+                    "SHUTDOWN"
+);
+
             _executionContext.Loader.SaveCompiledCode();
 
             List<BlockParam> handlers = new List<BlockParam>();
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Specs/mini_rspec.rb;C417565
File: mini_rspec.rb
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Specs/mini_rspec.rb;C417565  (server)    5/22/2008 7:02 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Specs/mini_rspec.rb;Symbols
@@ -492,8 +492,8 @@
 at_exit do
   @runner.reporter.summary
   if @runner.reporter.is_a? CoverageReporter #|| @runner.reporter.is_a? GenerateExcludesReporter
-    exit!(0)
+    exit(0)
   else
-    exit!(@runner.reporter.failures)
+    exit(@runner.reporter.failures)
   end
 end
===================================================================
