BaseAction is an abstract class that serves as a base for all Action classes resembling swf bytecode instructions
Beispiel #1
0
 /// <summary>constructor</summary> 
 public ActionContainer(BaseAction[] aList)
     : base(ActionCode.Container)
 {
     actionList = aList;
     byteCount = 0;
     pushCount = 0;
     popCount = 0;
     foreach (BaseAction a in aList) {
         byteCount+=a.ByteCount;
         pushCount+=a.PushCount;
         popCount+=a.PopCount;
     }
 }
        /// <summary>
        /// Examine byte code action at index in action record.
        /// </summary>
        public void Examine(int index,BaseAction a)
        {
            ActionPush p;
            int args;
            CodeTraverser trav;

            switch ( a.Code ) {

                case (int)ActionCode.StackSwap:
                    object o1 = stack.Pop();
                    object o2 = stack.Pop();
                    stack.Push(o1);
                    stack.Push(o2);
                    break;

                case (int)ActionCode.PushDuplicate:
                    stack.Push(stack.Peek());
                    break;

                case (int)ActionCode.Push:
                    stack.Push(a);
                    break;

                // --------------------------------------

                case (int)ActionCode.CallMethod:

                    ActionCallMethod cm = a as ActionCallMethod;

                    stack.Pop(); // name
                    stack.Pop(); // script object

                    p = stack.Pop() as ActionPush;
                    args = p.GetIntValue();
                    for (int i=0; i<args; i++) {
                        stack.Pop();
                    }
                    if (args>-1) cm.NumArgs = args;
                    stack.Push(null);
                    break;

                case (int)ActionCode.CallFunction:

                    ActionCallFunction cf = a as ActionCallFunction;
                    stack.Pop(); // name
                    p = stack.Pop() as ActionPush;
                    args = p.GetIntValue();
                    for (int i=0; i<args; i++) {
                        stack.Pop();
                    }
                    if (args>-1) cf.NumArgs = args;
                    stack.Push(null);
                    break;

                // --------------------------------------

                case (int)ActionCode.InitArray:

                    ActionInitArray ia = a as ActionInitArray;
                    p = stack.Pop() as ActionPush;
                    args = p.GetIntValue();
                    for (int i=0; i<args; i++) {
                        stack.Pop();
                    }

                    ia.NumValues = args;
                    stack.Push(null);
                    break;

                case (int)ActionCode.InitObject:

                    ActionInitObject io = a as ActionInitObject;
                    p = stack.Pop() as ActionPush;
                    args = p.GetIntValue();
                    for (int i=0; i<args; i++) {
                        stack.Pop();
                        stack.Pop();
                    }
                    io.NumProps = args;
                    stack.Push(null);
                    break;

                case (int)ActionCode.NewObject:

                    ActionNewObject n = a as ActionNewObject;
                    stack.Pop();
                    p = stack.Pop() as ActionPush;
                    args = p.GetIntValue();
                    for (int i=0; i<args; i++) {
                        stack.Pop();
                    }
                    n.NumArgs = args;
                    stack.Push(null);
                    break;

                case (int)ActionCode.NewMethod:
                    ActionNewMethod nm = a as ActionNewMethod;
                    stack.Pop();
                    stack.Pop();
                    p = stack.Pop() as ActionPush;
                    args = p.GetIntValue();
                    for (int i=0; i<args; i++) {
                        stack.Pop();
                    }
                    nm.NumArgs = args;
                    stack.Push(null);
                    break;

                case (int)ActionCode.Implements:

                    ActionImplements aimpl = a as ActionImplements;
                    stack.Pop(); // constructor function

                    // interface count
                    p = stack.Pop() as ActionPush;
                    args = p.GetIntValue();

                    // pop interfaces
                    for (int i=0; i<args; i++) {
                        stack.Pop();
                    }
                    aimpl.NumInterfaces = args;
                    break;

                // --------------------------------------

                case (int)ActionCode.DefineFunction:
                    ActionDefineFunction f = a as ActionDefineFunction;
                    trav = new CodeTraverser(f.ActionRecord);
                    trav.Traverse(new InvocationExaminer());
                    stack.Push(null);
                    break;

                case (int)ActionCode.DefineFunction2:
                    ActionDefineFunction2 f2 = a as ActionDefineFunction2;
                    trav = new CodeTraverser(f2.ActionRecord);
                    trav.Traverse(new InvocationExaminer());
                    stack.Push(null);
                    break;

                // --------------------------------------

                default:
                    try {
                        for (int i=0; i<a.PopCount; i++) {
                            stack.Pop();
                        }
                        for (int i=0; i<a.PushCount; i++) {
                            stack.Push(null);
                        }
                    }
                    // stack empty
                    catch (InvalidOperationException e) {
                        if (e!=null) {}
                     	stack.Clear();
                    }
                    break;
            }
        }