示例#1
0
 public override void Visit(ReadPropertyExpression node)
 {
     Visit((ReadIndexerExpression)node);
 }
示例#2
0
 public override void Visit(ReadPropertyExpression node)
 {
     unfinishedClone = new ReadPropertyExpression(GetCloneOf(node.Container), (StringLiteral)GetCloneOf(node.Index));
     Visit((Indexer)node); //We need to skip ReadIndexerExpression
     // TODO: Why are we visiting Indexer?
 }
示例#3
0
 public override void Visit(ReadPropertyExpression node)
 {
     UpdateType(node, TypeCalculator.GetType(node));
 }
示例#4
0
 public override void Visit(ReadPropertyExpression node)
 {
     AssignToImplicitReturn(node);
 }
            public override void Visit(ReadPropertyExpression node)
            {
                var nodeProfile = _currProfiler.GetNodeProfile(node);

                if (_currFuncMetadata.EnableInlineCache &&
                    nodeProfile != null &&
                    nodeProfile.Map != null &&
                    nodeProfile.PD != null &&
                    nodeProfile.PD.IsDataDescriptor &&
                    !nodeProfile.PD.IsInherited)
                {
                    PushLocation(node);

                    var value      = _localVars.PushTemporary(Types.DValue.TypeOf);
                    var stackState = _localVars.GetTemporaryStackState();

                    VisitNode(node.Container);
                    AsDObject();
                    node.AssignFieldId();
                    _ilGen.Ldc_I4(node.FieldId);
                    _ilGen.Ldloca(value);

                    _ilGen.Ldc_I4(nodeProfile.Map.UniqueId);
                    _ilGen.Ldc_I4(nodeProfile.PD.Index);
                    _ilGen.Call(Types.Operations.Internals.GetFieldUsingIC);

                    _ilGen.Ldloca(value);
                    _result.ValueType = mdr.ValueTypes.DValueRef;

                    PopLocation();
                }
                else if (_currFuncMetadata.EnableInlineCache &&
                         nodeProfile != null &&
                         nodeProfile.Map != null &&
                         nodeProfile.PD != null &&
                         nodeProfile.PD.IsDataDescriptor &&
                         nodeProfile.PD.IsInherited)
                {
                    int inheritCacheIndex = JSRuntime.UpdateInheritPropertyObjectCache(nodeProfile.PD);
                    if (inheritCacheIndex != -1)
                    {
                        PushLocation(node);
                        var value = _localVars.PushTemporary(Types.DValue.TypeOf);
                        VisitNode(node.Container);
                        AsDObject();
                        node.AssignFieldId();
                        _ilGen.Ldc_I4(node.FieldId);

                        _ilGen.Ldloca(value);
                        _ilGen.Ldc_I4(nodeProfile.Map.UniqueId);
                        _ilGen.Ldc_I4(nodeProfile.PD.Index);
                        _ilGen.Ldc_I4(inheritCacheIndex);
                        _ilGen.Call(Types.Operations.Internals.GetInheritFieldUsingIC);
                        _ilGen.Ldloca(value);
                        _result.ValueType = mdr.ValueTypes.DValueRef;
                        PopLocation();
                    }
                    else
                    {
                        base.Visit(node);
                    }
                }
                else
                {
//          if (nodeProfile == null)
//            nodeProfile.PD.HasAttributes(mdr.PropertyDescriptor.Attributes.NotConfigurable))
//            Trace.WriteLine("Missing profile data {0} {1} {2}!", node, node.ProfileIndex, _currFuncMetadata);

                    base.Visit(node);
                }
            }
示例#6
0
 public override void Visit(ReadPropertyExpression node)
 {
     throw new NotImplementedException();
 }