Пример #1
0
        public void VisitNode(JSWriteThroughReferenceExpression wtre)
        {
            var rightType = wtre.GetActualType(TypeSystem);
            GenericParameter relevantParameter;

            if (
                IsStructOrGenericParameter(rightType) &&
                IsCopyNeeded(wtre.Right, out relevantParameter)
                )
            {
                if (TraceInsertedCopies)
                {
                    Console.WriteLine(String.Format("struct copy introduced for write-through-reference rhs {0}", wtre));
                }

                var replacement = new JSWriteThroughReferenceExpression(
                    (JSVariable)wtre.Left, MakeCopyForExpression(wtre.Right, relevantParameter)
                    );
                ParentNode.ReplaceChild(wtre, replacement);
                VisitReplacement(replacement);
            }
            else
            {
                VisitChildren(wtre);
            }
        }
Пример #2
0
        public void VisitNode(JSWriteThroughReferenceExpression wtre)
        {
            var rightType = wtre.GetActualType(TypeSystem);
            GenericParameter relevantParameter;

            if (
                IsStructOrGenericParameter(rightType) &&
                IsCopyNeeded(wtre.Right, out relevantParameter)
                )
            {
                var replacement = new JSWriteThroughReferenceExpression(
                    (JSVariable)wtre.Left, MakeCopyForExpression(wtre.Right, relevantParameter)
                    );
                ParentNode.ReplaceChild(wtre, replacement);
                VisitReplacement(replacement);
            }
            else
            {
                VisitChildren(wtre);
            }
        }
Пример #3
0
        public void VisitNode (JSWriteThroughReferenceExpression wtre) {
            var rightType = wtre.GetActualType(TypeSystem);
            GenericParameter relevantParameter;

            if (
                IsStructOrGenericParameter(rightType) &&
                IsCopyNeeded(wtre.Right, out relevantParameter)
            ) {
                bool rightVarIsEffectivelyConstantHere =
                    IsVarEffectivelyConstantHere(wtre.Right as JSVariable);

                if (rightVarIsEffectivelyConstantHere) {
                    if (TraceElidedCopies)
                        Console.WriteLine("struct copy elided for write-through-reference rhs {0} (rhs is effectively constant)", wtre);
                } else {
                    if (TraceInsertedCopies)
                        Console.WriteLine("struct copy introduced for write-through-reference rhs {0}", wtre);

                    var replacement = new JSWriteThroughReferenceExpression(
                        (JSVariable)wtre.Left, MakeCopyForExpression(wtre.Right, relevantParameter)
                    );
                    ParentNode.ReplaceChild(wtre, replacement);
                    VisitReplacement(replacement);
                }
            } else {
                VisitChildren(wtre);
            }
        }