示例#1
0
        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);
        }
示例#2
0
        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);
 }
示例#4
0
 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);
 }
示例#5
0
            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);
                }
            }
示例#6
0
 public override void Visit(ReadIndexerExpression node)
 {
     Visit((Indexer)node);
 }
示例#7
0
 public override void Visit(ReadIndexerExpression node)
 {
     UpdateType(node, TypeCalculator.GetType(node));
 }
示例#8
0
 public override void Visit(ReadIndexerExpression node)
 {
     AssignToImplicitReturn(node);
 }
示例#9
0
 public override void Visit(ReadIndexerExpression node)
 {
     throw new NotImplementedException();
 }