public override void Visit(WriteIndexerExpression node) { Visit((Indexer)node); VisitNode(node.Value); }
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(); }
internal static mdr.ValueTypes GetType(WriteIndexerExpression expression) { return expression.Value.ValueType; }
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(); }
public override void Visit(WriteIndexerExpression node) { Visit((Indexer)node); }
public abstract void Visit(WriteIndexerExpression node);
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); }