public override void Visit(ReadIndexerExpression node) { var clone = new ReadIndexerExpression(GetCloneOf(node.Container), GetCloneOf(node.Index)); clone.ProfileIndex = node.ProfileIndex; //TODO: should this be moved to Indexer? unfinishedClone = clone; base.Visit(node); }
public void CreateNewProfile(ReadIndexerExpression node, mdr.PropertyMap map, mdr.PropertyDescriptor pd) { MapNodeProfile prof = new MapNodeProfile(map, pd); if (node.ProfileIndex == -1) { node.ProfileIndex = MapProfileData.Count; MapProfileData.Add(prof); jsMD.MapProfileSize++; } else { _resizeProfileData <MapNodeProfile>(MapProfileData, node.ProfileIndex + 1, null); MapProfileData[node.ProfileIndex] = prof; } HasMaps = true; }
public override void Visit(ReadIndexerExpression node) { /*var nodeProfile = _currProfiler.GetNodeProfile(node); * * if (_currFuncMetadata.EnableInlineCache * && nodeProfile != null * && nodeProfile.Map != null * && nodeProfile.PD == JSRuntime.Instance.GetArrayItemAccessor()) * { * PushLocation(node); * var value = _localVars.PushTemporary(Types.DValue.TypeOf); * * var stackState = _localVars.GetTemporaryStackState(); * * VisitNode(node.Container); * AsDObject(); * var objType = _result.ValueType; * var obj = _localVars.PushTemporary(objType); * * _ilGen.Stloc(obj); * _ilGen.Ldloc(obj); * * //TODO: we need to insert the inline cache here * VisitNode(node.Index); * * var indexType = _result.ValueType; * if (indexType != mdr.ValueTypes.Int32) * { * AsInt32(); * } * PerformLookup(node, obj, mdr.ValueTypes.Array, mdr.ValueTypes.Int32, value); * * _localVars.PopTemporariesAfter(stackState); * * _ilGen.Ldloca(value); * _result.ValueType = mdr.ValueTypes.DValueRef; * * PopLocation(); * } * else*/ base.Visit(node); }
public int GetMapNodeIndex(ReadIndexerExpression node) { //Debug.Assert(node.ProfileIndex <= MapProfileData.Count, "Assignment happens in codegen time"); if (node.ProfileIndex == -1) { node.ProfileIndex = MapProfilerCounter; int index = node.ProfileIndex; if (index >= MapProfileData.Count) { _resizeProfileData <MapNodeProfile>(MapProfileData, index + 1, null); MapProfileData[index] = new MapNodeProfile(null, null); } MapProfilerCounter++; if (MapProfilerCounter > jsMD.MapProfileSize) { jsMD.MapProfileSize = MapProfilerCounter; } } return(node.ProfileIndex); }
protected override void PerformLookup(ReadIndexerExpression node, LocalBuilder obj, mdr.ValueTypes objType, mdr.ValueTypes indexType, LocalBuilder value) { if (objType == mdr.ValueTypes.Array && indexType == mdr.ValueTypes.Int32) { base.PerformLookup(node, obj, objType, indexType, value); } else { _ilGen.Callvirt(Types.DObject.GetPropertyDescriptor.Get(_result.ValueType)); //_ilGen.Callvirt(Types.DObject.GetField(_result.ValueType)); int profIndex = _currFuncMetadata.GetProfileIndex(node); _ilGen.Ldloc(_profiler); _ilGen.Ldc_I4(profIndex); _ilGen.Ldloc(obj); _ilGen.Call(Types.DObject.GetMap); _ilGen.Call(Types.Operations.Internals.UpdateMapProfile); _ilGen.Ldloc(obj); _ilGen.Ldloca(value); _ilGen.Callvirt(Types.PropertyDescriptor.Get_DObject_DValueRef); } }
public override void Visit(ReadIndexerExpression node) { Visit((Indexer)node); }
public override void Visit(ReadIndexerExpression node) { UpdateType(node, TypeCalculator.GetType(node)); }
public override void Visit(ReadIndexerExpression node) { AssignToImplicitReturn(node); }
public override void Visit(ReadIndexerExpression node) { throw new NotImplementedException(); }