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

  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.     using System.Collections;
  22.    
  23.     internal sealed class ObjectLiteral : AST
  24.     {
  25.         internal AST[] keys;
  26.         internal AST[] values;
  27.        
  28.         internal ObjectLiteral(Context context, ASTList propertyList) : base(context)
  29.         {
  30.             int n = propertyList.count;
  31.             this.keys = new AST[n];
  32.             this.values = new AST[n];
  33.             for (int i = 0; i < n; i++) {
  34.                 ASTList pair = (ASTList)propertyList[i];
  35.                 this.keys[i] = pair[0];
  36.                 this.values[i] = pair[1];
  37.             }
  38.         }
  39.        
  40.         internal override void CheckIfOKToUseInSuperConstructorCall()
  41.         {
  42.             for (int i = 0int n = this.values.Length; i < n; i++)
  43.                 this.values[i].CheckIfOKToUseInSuperConstructorCall();
  44.         }
  45.        
  46.         internal override object Evaluate()
  47.         {
  48.             JSObject result = this.Engine.GetOriginalObjectConstructor().ConstructObject();
  49.             for (int i = 0int n = this.keys.Length; i < n; i++)
  50.                 result.SetMemberValue(this.keys[i].Evaluate().ToString(), this.values[i].Evaluate());
  51.             return result;
  52.         }
  53.        
  54.         internal override AST PartiallyEvaluate()
  55.         {
  56.             int n = this.keys.Length;
  57.             for (int i = 0; i < n; i++) {
  58.                 this.keys[i] = this.keys[i].PartiallyEvaluate();
  59.                 this.values[i] = this.values[i].PartiallyEvaluate();
  60.             }
  61.             return this;
  62.         }
  63.        
  64.         internal override void TranslateToIL(ILGenerator il, Type rtype)
  65.         {
  66.             int n = this.keys.Length;
  67.             this.EmitILToLoadEngine(il);
  68.             il.Emit(OpCodes.Call, CompilerGlobals.getOriginalObjectConstructorMethod);
  69.             il.Emit(OpCodes.Call, CompilerGlobals.constructObjectMethod);
  70.             for (int i = 0; i < n; i++) {
  71.                 il.Emit(OpCodes.Dup);
  72.                 this.keys[i].TranslateToIL(il, Typeob.String);
  73.                 this.values[i].TranslateToIL(il, Typeob.Object);
  74.                 il.Emit(OpCodes.Call, CompilerGlobals.setMemberValue2Method);
  75.             }
  76.             Convert.Emit(this, il, Typeob.Object, rtype);
  77.         }
  78.        
  79.         internal override void TranslateToILInitializer(ILGenerator il)
  80.         {
  81.             for (int i = 0int n = this.keys.Length; i < n; i++) {
  82.                 this.keys[i].TranslateToILInitializer(il);
  83.                 this.values[i].TranslateToILInitializer(il);
  84.             }
  85.         }
  86.     }
  87. }

Developer Fusion