コード例 #1
0
        private void Visit(AssignmentExpression assignmentExpression)
        {
            if (currentAssignmentOperatorStatus != AssignmentOperatorStatus.Read)
            {
                errorWarningLog.Error(XenkoMessageCode.ErrorNestedAssignment, assignmentExpression.Span, assignmentExpression, shaderName);
            }

            var prevStreamUsage = currentStreamUsage;

            currentStreamUsage              = StreamUsage.Read;
            assignmentExpression.Value      = (Expression)VisitDynamic(assignmentExpression.Value);
            currentAssignmentOperatorStatus = (assignmentExpression.Operator != AssignmentOperator.Default) ? AssignmentOperatorStatus.ReadWrite : AssignmentOperatorStatus.Write;

            currentStreamUsage          = StreamUsage.Write;
            assignmentExpression.Target = (Expression)VisitDynamic(assignmentExpression.Target);

            currentAssignmentOperatorStatus = AssignmentOperatorStatus.Read;
            currentStreamUsage = prevStreamUsage;

            var parentBlock = this.NodeStack.OfType <StatementList>().LastOrDefault();

            if (assignmentExpression.Operator == AssignmentOperator.Default && parentBlock != null)
            {
                if (assignmentExpression.Target is VariableReferenceExpression && (assignmentExpression.Target as VariableReferenceExpression).Name == StreamsType.ThisStreams.Name) // "streams = ...;"
                {
                    StreamAssignations.Add(assignmentExpression, parentBlock);
                }
                else if (assignmentExpression.Value is VariableReferenceExpression && (assignmentExpression.Value as VariableReferenceExpression).Name == StreamsType.ThisStreams.Name) // "... = streams;"
                {
                    AssignationsToStream.Add(assignmentExpression, parentBlock);
                }
            }
        }
コード例 #2
0
        private void Visit(AssignmentExpression assignmentExpression)
        {
            if (currentAssignmentOperatorStatus != AssignmentOperatorStatus.Read)
            {
                errorWarningLog.Error(ParadoxMessageCode.ErrorNestedAssignment, assignmentExpression.Span, assignmentExpression, shaderName);
            }

            var prevStreamUsage = currentStreamUsage;

            currentStreamUsage              = StreamUsage.Read;
            assignmentExpression.Value      = (Expression)VisitDynamic(assignmentExpression.Value);
            currentAssignmentOperatorStatus = (assignmentExpression.Operator != AssignmentOperator.Default) ? AssignmentOperatorStatus.ReadWrite : AssignmentOperatorStatus.Write;

            currentStreamUsage          = StreamUsage.Write;
            assignmentExpression.Target = (Expression)VisitDynamic(assignmentExpression.Target);

            currentAssignmentOperatorStatus = AssignmentOperatorStatus.Read;
            currentStreamUsage = prevStreamUsage;

            if (assignmentExpression.Operator == AssignmentOperator.Default)
            {
                if (assignmentExpression.Target is VariableReferenceExpression && (assignmentExpression.Target as VariableReferenceExpression).Name.Text == "streams") // "streams = ...;"
                {
                    StreamAssignations.Add(assignmentExpression);
                }
                else if (assignmentExpression.Value is VariableReferenceExpression && (assignmentExpression.Value as VariableReferenceExpression).Name.Text == "streams") // "... = streams;"
                {
                    AssignationsToStream.Add(assignmentExpression);
                }
            }
        }
コード例 #3
0
        protected void Visit(UnaryExpression expression)
        {
            var prevStreamUsage = currentStreamUsage;

            currentStreamUsage = StreamUsage.Read;
            Visit((Node)expression);
            currentStreamUsage = prevStreamUsage;
        }
コード例 #4
0
        public override void Visit(UnaryExpression expression)
        {
            var prevStreamUsage = currentStreamUsage;

            currentStreamUsage = StreamUsage.Read;
            base.Visit(expression);
            currentStreamUsage = prevStreamUsage;
        }
コード例 #5
0
        protected void Visit(MemberReferenceExpression memberReferenceExpression)
        {
            var usageCopy = currentStreamUsage;

            currentStreamUsage |= StreamUsage.Partial;
            Visit((Node)memberReferenceExpression);
            currentStreamUsage = usageCopy;

            // check if it is a stream
            if (IsStreamMember(memberReferenceExpression))
            {
                AddStreamUsage(memberReferenceExpression.TypeInference.Declaration as Variable, memberReferenceExpression, currentStreamUsage);
            }
        }
コード例 #6
0
 /// <summary>
 /// Adds a stream usage to the current method
 /// </summary>
 /// <param name="variable">the stream Variable</param>
 /// <param name="expression">the calling expression</param>
 /// <param name="usage">the encountered usage</param>
 private void AddStreamUsage(Variable variable, SiliconStudio.Shaders.Ast.Expression expression, StreamUsage usage)
 {
     currentStreamUsageList.Add(new StreamUsageInfo {
         CallType = StreamCallType.Member, Variable = variable, Expression = expression, Usage = usage
     });
 }
コード例 #7
0
 /// <summary>
 /// Adds a stream usage to the current method
 /// </summary>
 /// <param name="variable">the stream Variable</param>
 /// <param name="expression">the calling expression</param>
 /// <param name="usage">the encountered usage</param>
 private void AddStreamUsage(Variable variable, SiliconStudio.Shaders.Ast.Expression expression, StreamUsage usage)
 {
     currentStreamUsageList.Add(new StreamUsageInfo { CallType = StreamCallType.Member, Variable = variable, Expression = expression, Usage = usage });
 }
コード例 #8
0
        /// <summary>
        /// Analyse the AssignmentExpression to correctly infer the potential stream usage
        /// </summary>
        /// <param name="assignmentExpression">the AssignmentExpression</param>
        public override void Visit(AssignmentExpression assignmentExpression)
        {
            if (currentAssignmentOperatorStatus != AssignmentOperatorStatus.Read)
                errorWarningLog.Error(XenkoMessageCode.ErrorNestedAssignment, assignmentExpression.Span, assignmentExpression, shaderName);

            var prevStreamUsage = currentStreamUsage;
            currentStreamUsage = StreamUsage.Read;
            assignmentExpression.Value = (Expression)VisitDynamic(assignmentExpression.Value);
            currentAssignmentOperatorStatus = (assignmentExpression.Operator != AssignmentOperator.Default) ? AssignmentOperatorStatus.ReadWrite : AssignmentOperatorStatus.Write;

            currentStreamUsage = StreamUsage.Write;
            assignmentExpression.Target = (Expression)VisitDynamic(assignmentExpression.Target);

            currentAssignmentOperatorStatus = AssignmentOperatorStatus.Read;
            currentStreamUsage = prevStreamUsage;

            var parentBlock = this.NodeStack.OfType<StatementList>().LastOrDefault();

            if (assignmentExpression.Operator == AssignmentOperator.Default && parentBlock != null)
            {
                if (assignmentExpression.Target is VariableReferenceExpression && (assignmentExpression.Target as VariableReferenceExpression).Name == StreamsType.ThisStreams.Name) // "streams = ...;"
                    StreamAssignations.Add(assignmentExpression, parentBlock);
                else if (assignmentExpression.Value is VariableReferenceExpression && (assignmentExpression.Value as VariableReferenceExpression).Name == StreamsType.ThisStreams.Name) // "... = streams;"
                    AssignationsToStream.Add(assignmentExpression, parentBlock);
            }
        }
コード例 #9
0
 public override void Visit(UnaryExpression expression)
 {
     var prevStreamUsage = currentStreamUsage;
     currentStreamUsage = StreamUsage.Read;
     base.Visit(expression);
     currentStreamUsage = prevStreamUsage;
 }
コード例 #10
0
        public override void Visit(MemberReferenceExpression memberReferenceExpression)
        {
            var usageCopy = currentStreamUsage;
            currentStreamUsage |= StreamUsage.Partial;
            base.Visit(memberReferenceExpression);
            currentStreamUsage = usageCopy;

            // check if it is a stream
            if (IsStreamMember(memberReferenceExpression))
                AddStreamUsage(memberReferenceExpression.TypeInference.Declaration as Variable, memberReferenceExpression, currentStreamUsage);
        }
コード例 #11
0
 public static bool IsPartial(this StreamUsage usage)
 {
     return((usage & StreamUsage.Partial) != 0);
 }
コード例 #12
0
 public static bool IsWrite(this StreamUsage usage)
 {
     return((usage & StreamUsage.Write) != 0);
 }
コード例 #13
0
 public static bool IsRead(this StreamUsage usage)
 {
     return((usage & StreamUsage.Read) != 0);
 }
コード例 #14
0
ファイル: XenkoStreamAnalyzer.cs プロジェクト: cg123/xenko
 protected void Visit(UnaryExpression expression)
 {
     var prevStreamUsage = currentStreamUsage;
     currentStreamUsage = StreamUsage.Read;
     Visit((Node)expression);
     currentStreamUsage = prevStreamUsage;
 }