Beispiel #1
0
 public override void Visit(WriteIndexerExpression node)
 {
   Visit((Indexer)node);
   VisitNode(node.Value);
 }
Beispiel #2
0
      public override void Visit(WriteIndexerExpression node)
      {
        PushLocation(node);

        var stackState = _localVars.GetTemporaryStackState();

        VisitNode(node.Container);
        AsDObject();
        var objType = _result.ValueType;
        var obj = _localVars.PushTemporary(objType);
        _ilGen.Dup();
        _ilGen.Stloc(obj);

        VisitNode(node.Index);
        var indexType = _result.ValueType;
        var index = _localVars.PushTemporary(indexType);
        _ilGen.Dup();
        _ilGen.Stloc(index);

        VisitNode(node.Value);
        var valueType = _result.ValueType;
        var value = _localVars.PushTemporary(valueType);
        _ilGen.Stloc(value);
        _ilGen.Pop();
        _ilGen.Pop();

        if (objType == mdr.ValueTypes.Array &&
          indexType == mdr.ValueTypes.Int32)
        {
          var slowPath = _ilGen.DefineLabel();
          var exitPath = _ilGen.DefineLabel();
          _ilGen.Ldloc(index);
          _ilGen.Ldc_I4_0();
          _ilGen.Blt(slowPath);
          _ilGen.Ldloc(index);
          _ilGen.Ldloc(obj);
          _ilGen.Ldfld(Types.DArray.ElementsLength);
          _ilGen.Bge(slowPath);

          _ilGen.Ldloc(obj);
          _ilGen.Ldfld(Types.DArray.Elements);
          _ilGen.Ldloc(index);
          _ilGen.Ldelema(Types.DValue.TypeOf);
          _ilGen.Ldloc(value);
          _ilGen.Call(Types.DValue.Set.Get(valueType));
          _ilGen.Br(exitPath);

          _ilGen.MarkLabel(slowPath);
          _ilGen.Ldloc(obj);
          _ilGen.Ldloc(index);
          _ilGen.Callvirt(Types.DObject.AddPropertyDescriptor.Get(indexType));
          _ilGen.Ldloc(obj);
          _ilGen.Ldloc(value);
          //_ilGen.Call(Types.PropertyDescriptor.Set.Get(objType, valueType));
          Debug.Assert(mdr.ValueTypesHelper.IsObject(objType), "Invalid situation, expexted object value type here");
          _ilGen.Call(Types.PropertyDescriptor.Set.Get(mdr.ValueTypes.Object, valueType));

          _ilGen.MarkLabel(exitPath);
        }
        else
        {
          _ilGen.Ldloc(obj);
          _ilGen.Ldloc(index);
          _ilGen.Callvirt(Types.DObject.AddPropertyDescriptor.Get(indexType));
          _ilGen.Ldloc(obj);
          _ilGen.Ldloc(value);
          //_ilGen.Call(Types.PropertyDescriptor.Set.Get(objType, valueType));
          Debug.Assert(mdr.ValueTypesHelper.IsObject(objType), "Invalid situation, expexted object value type here");
          _ilGen.Call(Types.PropertyDescriptor.Set.Get(mdr.ValueTypes.Object, valueType));
          //_ilGen.Call(Types.DObject.SetField(indexType, valueType));
        }
        _localVars.PopTemporariesAfter(stackState);
        _localVars.PushTemporary(value); //We just release all vars, but need to make sure we put back the value variable for later use

        _ilGen.Ldloc(value);
        _result.ValueType = valueType;

        PopLocation();
      }
Beispiel #3
0
 internal static mdr.ValueTypes GetType(WriteIndexerExpression expression) { return expression.Value.ValueType; }
Beispiel #4
0
 public override void Visit(WriteIndexerExpression node) { base.Visit(node); node.ValueType = GetType(node); }
      public override void Visit(WriteIndexerExpression node)
      {
        PushLocation(node);

        VisitNode(node.Container);
        VisitNode(node.Index);
        VisitNode(node.Value);

        _stackModel.Pop(3);

        BeginICMethod(node);
        _ilGen.Ldarg_CallFrame();
        _ilGen.Ldc_I4(_stackModel.StackPointer);
        _ilGen.Call(Types.Operations.ICMethods.WriteIndexer);
        EndICMethod();

        _stackModel.Push(1);

        PopLocation();
      }
Beispiel #6
0
 public override void Visit(WriteIndexerExpression node)
 {
     Visit((Indexer)node);
 }
Beispiel #7
0
 public abstract void Visit(WriteIndexerExpression node);
Beispiel #8
0
      public override void Visit(WriteIndexerExpression node)
      {
        PushLocation(node);
        var pushBackResult = true;
        VisitNode(node.Container);
        VisitNode(node.Index);
        VisitNode(node.Value);

        _ilGen.Ldc_I4(pushBackResult);
        Call(Types.Operations.Stack.StoreField, 3, pushBackResult ? 1 : 0);
        PopLocation();
      }
 public override void Visit(WriteIndexerExpression node) { AssignToImplicitReturn(node); }