Esempio n. 1
0
        private bool performPatternReplacing()
        {
            bool result = false;

            foreach (BasicBlock block in blockList)
            {
                NodeArray body = block.Body;

                bool flag = true;
                while (flag)
                {
                    flag = false;
                    for (int i = 0; i < body.Count-1 && ! flag; i++)
                    {
                        Node n1 = body[i];

                        if (n1 is Branch && (n1 as Branch).Next == (n1 as Branch).Alt)
                        {
                            result = flag = true;
                            Node n = newRemoveStackTop(block);
                            body[i] = n;
                            n1.ReplaceByNode(n);
                            n.Next = n1.Next;
                            n1.RemoveFromGraph();
                        }
                        else
                        {
                            Node n2 = body[i+1];

                            if (n1 is StoreVar && n2 is LoadVar &&
                                (n1 as ManageVar).Var == (n2 as ManageVar).Var)
                            {
                                result = flag = true;
                                Node n = newDuplicateStackTop(block);
                                body[i] = n;
                                body[i+1] = n1;
                                n1.ReplaceByNode(n);
                                n.Next = n1;
                                n1.Next = n2.Next;
                                n2.RemoveFromGraph();
                            }
                            else if (detectedDoubleLoading(n1,n2))
                            {
                                result = flag = true;
                                Node n = newDuplicateStackTop(block);
                                body[i+1] = n;
                                n2.ReplaceByNode(n);
                                n.Next = n2.Next;
                                n2.RemoveFromGraph();
                            }
                            else if (detectedDoubleCasting(n1,n2))
                            {
                                result = flag = true;
                                body.RemoveAt(i+1);
                                n1.Next = n2.Next;
                                n2.RemoveFromGraph();
                            }
                            else if (n1 is StoreVar && n2 is Leave &&
                                n2.Parent is MethodBodyBlock)
                            {
                                result = flag = true;
                                Node n = newRemoveStackTop(block);
                                body[i] = n;
                                n1.ReplaceByNode(n);
                                n1.RemoveFromGraph();
                                n.Next = n2;
                            }
                            else if (detectedReplacementByPop(n1,n2))
                            {
                                result = flag = true;
                                Node n = newRemoveStackTop(block);
                                body.RemoveAt(i+1);
                                body[i] = n;
                                n1.ReplaceByNode(n);
                                n1.RemoveFromGraph();
                                n.Next = n2.Next;
                                n2.RemoveFromGraph();
                            }
                            else if (detectedReplacementByDoublePop(n1,n2))
                            {
                                result = flag = true;
                                Node new1 = newRemoveStackTop(block),
                                    new2 = newRemoveStackTop(block);
                                body[i] = new1;
                                body[i+1] = new2;
                                n1.ReplaceByNode(new1);
                                n1.RemoveFromGraph();
                                new1.Next = new2;
                                new2.Next = n2.Next;
                                n2.RemoveFromGraph();
                            }
                            else if (detectedRemoval(n1,n2))
                            {
                                result = flag = true;
                                body.RemoveAt(i+1);
                                body.RemoveAt(i);
                                n1.ReplaceByNode(n2.Next);
                                n1.RemoveFromGraph();
                                n2.RemoveFromGraph();
                            }
                            else if (detectedInitValueReplacement(n1,n2))
                            {
                                result = flag = true;
                                Variable var = (n1 as LoadVarAddr).Var;
                                Type type = (n2 as InitValue).Type;

                                object constant = null;
                                if (type == typeof(Int64))
                                    constant = (Int64)0;
                                else if (type == typeof(Single) || type == typeof(Double))
                                    constant = (Double)0;
                                else
                                    constant = (Int32)0;

                                Node new1 = new LoadConst(constant),
                                    new2 = new StoreVar(var);
                                new1.Options[BasicBlock.BASIC_BLOCK_OPTION] = block;
                                new2.Options[BasicBlock.BASIC_BLOCK_OPTION] = block;

                                body[i] = new1;
                                body[i+1] = new2;
                                n1.ReplaceByNode(new1);
                                n1.RemoveFromGraph();
                                new1.Next = new2;
                                new2.Next = n2.Next;
                                n2.RemoveFromGraph();
                            }
                            else if (i < body.Count-2)
                            {
                                Node n3 = body[i+2];

                                if (i < body.Count-3)
                                {
                                    Node n4 = body[i+3];

                                    if (detectedOperandExchange(n1,n2,n3,n4))
                                    {
                                        result = flag = true;
                                        Node n = newDuplicateStackTop(block);
                                        body[i] = n;
                                        body[i+1] = n1;
                                        body[i+2] = n2;
                                        body[i+3] = n4;
                                        n3.RemoveFromGraph();
                                        n1.ReplaceByNode(n);
                                        n.Next = n1;
                                        n2.Next = n4;
                                    }
                                    else if (detectedQuadruple1(n1,n2,n3,n4))
                                    {
                                        result = flag = true;
                                        Node n = newDuplicateStackTop(block);
                                        body[i] = n;
                                        body[i+1] = n1;
                                        body[i+2] = n2;
                                        body[i+3] = n3;
                                        n1.ReplaceByNode(n);
                                        n.Next = n1;
                                        n3.Next = n4.Next;
                                        n4.RemoveFromGraph();
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return result;
        }
Esempio n. 2
0
 protected internal override void VisitLoadConst(LoadConst node, object data)
 {
     StackTypes stack = data as StackTypes;
     if(node.Constant == null)
       stack.Push(null);
     else
       stack.Push(node.Constant.GetType());
     AddTask(node.Next,stack);
 }
Esempio n. 3
0
 protected internal virtual void VisitLoadConst(LoadConst node, object data)
 {
     throw new NodeNotSupportedException(node);
 }
Esempio n. 4
0
 protected override void VisitLoadConst(LoadConst upNode, object o)
 {
     State state = o as State;
     BTValue val = new PrimitiveBTValue(BTType.Static);
     state.Stack.Push(val);
     Annotation.SetNodeBTType(upNode, BTType.Static);
 }
Esempio n. 5
0
 protected override void VisitLoadConst(LoadConst upNode, object o)
 {
     DepthContainer cnt = o as DepthContainer;
     cnt.Depth -= 1;
 }
Esempio n. 6
0
 protected internal override void VisitLoadConst(LoadConst node, object data)
 {
     if(node.Constant == null)
       generator.Emit(OpCodes.Ldnull);
     else if(node.Constant is string )
         generator.Emit(OpCodes.Ldstr, node.Constant as string);
     else if(node.Constant is RuntimeTypeHandle)
         generator.Emit(OpCodes.Ldtoken,  Type.GetTypeFromHandle((RuntimeTypeHandle)(node.Constant)));
     else if(node.Constant is RuntimeMethodHandle)
         generator.Emit(OpCodes.Ldtoken, MethodBase.GetMethodFromHandle((RuntimeMethodHandle)(node.Constant)) as MethodInfo);
         //Andrew: Zlp!
     else if(node.Constant is RuntimeFieldHandle)
         generator.Emit(OpCodes.Ldtoken, FieldInfo.GetFieldFromHandle((RuntimeFieldHandle)(node.Constant)));
     else if(node.Constant is IntPtr)
         generator.Emit(OpCodes.Ldc_I4, (int)(IntPtr)(node.Constant)); //Andrew!!
     else if(node.Constant is int)
         generator.Emit(OpCodes.Ldc_I4, (int)(node.Constant));
     else if(node.Constant is long)
         generator.Emit(OpCodes.Ldc_I8, (long)(node.Constant));
     else if(node.Constant is float)
         generator.Emit(OpCodes.Ldc_R4, (float)(node.Constant));
     else if(node.Constant is double)
         generator.Emit(OpCodes.Ldc_R8, (double)(node.Constant));
     else
         throw new EmissionException();
     AddTask(node.Next,null);
 }