The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ Print

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace Microsoft.JScript
  16. {
  17.    
  18.     using System;
  19.     using System.Reflection;
  20.     using System.Reflection.Emit;
  21.    
  22.     internal sealed class Print : AST
  23.     {
  24.         private ASTList operand;
  25.         private Completion completion;
  26.        
  27.         internal Print(Context context, AST operand) : base(context)
  28.         {
  29.             this.operand = (ASTList)operand;
  30.             this.completion = new Completion();
  31.         }
  32.        
  33.         internal override object Evaluate()
  34.         {
  35.             object[] values = this.operand.EvaluateAsArray();
  36.             for (int i = 0; i < values.Length - 1; i++)
  37.                 ScriptStream.Out.Write(Convert.ToString(values[i]));
  38.             if (values.Length > 0) {
  39.                 this.completion.value = Convert.ToString(values[values.Length - 1]);
  40.                 ScriptStream.Out.WriteLine(this.completion.value);
  41.             }
  42.             else {
  43.                 ScriptStream.Out.WriteLine("");
  44.                 this.completion.value = null;
  45.             }
  46.             return this.completion;
  47.         }
  48.        
  49.         internal override AST PartiallyEvaluate()
  50.         {
  51.             this.operand = (ASTList)(this.operand.PartiallyEvaluate());
  52.             return this;
  53.         }
  54.        
  55.         internal override void TranslateToIL(ILGenerator il, Type rtype)
  56.         {
  57.             if (this.context.document.debugOn)
  58.                 il.Emit(OpCodes.Nop);
  59.             ASTList astList = this.operand;
  60.             int n = astList.count;
  61.             for (int i = 0; i < n; i++) {
  62.                 AST ast = astList[i];
  63.                 IReflect ir = ast.InferType(null);
  64.                 if (ir == Typeob.String)
  65.                     ast.TranslateToIL(il, Typeob.String);
  66.                 else {
  67.                     ast.TranslateToIL(il, Typeob.Object);
  68.                     ConstantWrapper.TranslateToILInt(il, 1);
  69.                     il.Emit(OpCodes.Call, CompilerGlobals.toStringMethod);
  70.                 }
  71.                 if (i == n - 1)
  72.                     il.Emit(OpCodes.Call, CompilerGlobals.writeLineMethod);
  73.                 else
  74.                     il.Emit(OpCodes.Call, CompilerGlobals.writeMethod);
  75.             }
  76.             if (n == 0) {
  77.                 il.Emit(OpCodes.Ldstr, "");
  78.                 il.Emit(OpCodes.Call, CompilerGlobals.writeLineMethod);
  79.             }
  80.             if (rtype != Typeob.Void) {
  81.                 il.Emit(OpCodes.Ldsfld, CompilerGlobals.undefinedField);
  82.                 Convert.Emit(this, il, Typeob.Object, rtype);
  83.             }
  84.         }
  85.        
  86.         internal override void TranslateToILInitializer(ILGenerator il)
  87.         {
  88.             ASTList astList = this.operand;
  89.             for (int i = 0; i < astList.count; i++)
  90.                 astList[i].TranslateToILInitializer(il);
  91.         }
  92.        
  93.     }
  94. }

Developer Fusion