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

  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 Assign : AST
  23.     {
  24.         internal AST lhside;
  25.         internal AST rhside;
  26.        
  27.         internal Assign(Context context, AST lhside, AST rhside) : base(context)
  28.         {
  29.             this.lhside = lhside;
  30.             this.rhside = rhside;
  31.         }
  32.        
  33.         internal override object Evaluate()
  34.         {
  35.             try {
  36.                 if (this.lhside is Call)
  37.                     ((Call)this.lhside).EvaluateIndices();
  38.                 object val = this.rhside.Evaluate();
  39.                 lhside.SetValue(val);
  40.                 return val;
  41.             }
  42.             catch (JScriptException e) {
  43.                 if (e.context == null)
  44.                     e.context = this.context;
  45.                 throw e;
  46.             }
  47.             catch (Exception e) {
  48.                 throw new JScriptException(e, this.context);
  49.             }
  50.             catch {
  51.                 throw new JScriptException(JSError.NonClsException, this.context);
  52.             }
  53.         }
  54.        
  55.         internal override IReflect InferType(JSField inference_target)
  56.         {
  57.             return this.rhside.InferType(inference_target);
  58.         }
  59.        
  60.         internal override AST PartiallyEvaluate()
  61.         {
  62.             AST lhref = this.lhside.PartiallyEvaluateAsReference();
  63.             this.lhside = lhref;
  64.             this.rhside = this.rhside.PartiallyEvaluate();
  65.             lhref.SetPartialValue(this.rhside);
  66.             return this;
  67.         }
  68.        
  69.         internal override void TranslateToIL(ILGenerator il, Type rtype)
  70.         {
  71.             Type lhtype = Convert.ToType(this.lhside.InferType(null));
  72.             this.lhside.TranslateToILPreSet(il);
  73.             if (rtype != Typeob.Void) {
  74.                 Type rhtype = Convert.ToType(this.rhside.InferType(null));
  75.                 this.rhside.TranslateToIL(il, rhtype);
  76.                 LocalBuilder result = il.DeclareLocal(rhtype);
  77.                 il.Emit(OpCodes.Dup);
  78.                 il.Emit(OpCodes.Stloc, result);
  79.                 Convert.Emit(this, il, rhtype, lhtype);
  80.                 this.lhside.TranslateToILSet(il);
  81.                 il.Emit(OpCodes.Ldloc, result);
  82.                 Convert.Emit(this, il, rhtype, rtype);
  83.             }
  84.             else {
  85.                 this.lhside.TranslateToILSet(il, rhside);
  86.             }
  87.         }
  88.        
  89.         internal override void TranslateToILInitializer(ILGenerator il)
  90.         {
  91.             this.lhside.TranslateToILInitializer(il);
  92.             this.rhside.TranslateToILInitializer(il);
  93.         }
  94.        
  95.     }
  96. }

Developer Fusion