Пример #1
0
 private void Reset()
 {
     EIP = 0;
     TempPool.Clear();
     RuntimeStack.Clear();
     VarSeg      = Generator.VarSeg;
     DataSegment = new int[Generator.VarSeg.Count];
     Initialized = new bool[Generator.VarSeg.Count];
     for (int i = 0; i < DataSegment.Length; ++i)
     {
         DataSegment[i] = 0;
         Initialized[i] = false;
     }
 }
Пример #2
0
        public object Invoke(RuntimeMethod method, object instance, object[] parameters)
        {
            try
            {
                var env      = environment;
                var mObjects = stack.ManagedObjects;
                var esp      = stack.StackBase;

                //push this
                if (method.HasThis)
                {
                    StackObject.PushObject(esp, mObjects, instance);
                    esp++;
                }

                //check parameters count
                if (method.ParametersCount != parameters.Length)
                {
                    throw new ILInvokeException("invoke method {0} parameters count mismatch expected={1} actual={2}", method.Name, method.ParametersCount, parameters.Length);
                }

                //push parameters
                foreach (var parameter in parameters)
                {
                    StackObject.PushObject(esp, mObjects, parameter);
                    esp++;
                }

                bool unhandledException;
                esp = Execute(method, esp, out unhandledException);

                if (method.ReturnType == env.Void)
                {
                    return(null);
                }

                return(StackObject.ToObject(esp, env, mObjects));
            }
            finally
            {
                stack.Clear();
            }
        }