Inheritance: MethodReference, IMemberDefinition, ISecurityDeclarationProvider
Exemplo n.º 1
0
 private ObjectInstance InterpretMethodBody(MethodDefinition methDef, bool directCall, IList<ObjectInstance> args, object stubContext)
 {
     for (var doJmpCall = true; doJmpCall; )
     {
         var retVal = ExecuteMethodWrapper(_classLoader, methDef, directCall, args, stubContext, out doJmpCall);
         if (!doJmpCall)
         {
             return retVal;
         }
     }
     throw ThrowHelper.NotImplementedYet;
 }
Exemplo n.º 2
0
        public PetitClrInterpreter(ClassLoader classLoader, MethodDefinition methodDef, bool directCall, IList<ObjectInstance> args, object stubContext)
        {
            _classLoader = classLoader;
            _methInfo2 = methodDef;
            _directCall = directCall;
            _args = args;
            _stubContext = stubContext;

            _instructions = methodDef.Body.Instructions.ToArray();
            _instructionPtr = 0;
            _opStack = new Stack<ObjectInstance>();
            _localSlot = new ObjectInstance[methodDef.Body.Variables.Count];
        }
Exemplo n.º 3
0
 public MethodDesc LookupMethodDescFromMethodDef(MethodDefinition methodDef)
 {
     return _methodDescByMethodDef.ContainsKey(methodDef) ? _methodDescByMethodDef[methodDef] : null;
 }
Exemplo n.º 4
0
 public void RegisterMethodDesc(MethodDefinition methodDef, MethodDesc methodDesc)
 {
     _methodDescByMethodDef[methodDef] = methodDesc;
 }
Exemplo n.º 5
0
		public void RemoveOverrideMapping (MethodDefinition method)
		{
			Overrides.Remove (method.token.RID);
		}
Exemplo n.º 6
0
		public bool TryGetOverrideMapping (MethodDefinition method, out MetadataToken [] mapping)
		{
			return Overrides.TryGetValue (method.token.RID, out mapping);
		}
Exemplo n.º 7
0
		public void AddMethodDefinition (MethodDefinition method)
		{
			Methods [method.token.RID - 1] = method;
		}
Exemplo n.º 8
0
        public static ObjectInstance ExecuteMethodWrapper(ClassLoader classLoader, MethodDefinition methDef, bool directCall, IList<ObjectInstance> args,
            object stubContext, out bool doJmpCall)
        {
            var interp = new PetitClrInterpreter(classLoader, methDef, directCall, args, stubContext);
            var interpFrame = new InterpreterFrame(interp);

            ObjectInstance retVal;
            MemberReference jmpCallToken;
            interp.ExecuteMethod(out retVal, out doJmpCall, out jmpCallToken);

            if (doJmpCall)
            {
                throw ThrowHelper.NotImplementedYet;
            }

            interpFrame.Pop();
            return retVal;
        }
Exemplo n.º 9
0
        private void InvokeInternalCall(MethodDefinition methDef)
        {
            object retVal;
            var args = new object[methDef.Parameters.Count];
            for (var i = args.Length - 1; i >= 0; i--)
            {
                args[i] = _opStack.Pop().ToClrObject();
            }

            if (PetitClrRuntime.Current.InternalCallMethods.ContainsKey(methDef.ToString()))
            {
                var func = PetitClrRuntime.Current.InternalCallMethods[methDef.ToString()];
                retVal = func(_callThisArg, PetitClrThread.CurrentThread.Frame, args);
            }
            else
            {
                var realType = Type.GetType(methDef.DeclaringType.FullName.Replace("Inazuma.PetitClr.PetitCorlib.", ""));
                var realMethod = realType.GetMethod(methDef.Name, BindingFlags.Static | BindingFlags.Public, null, methDef.Parameters.Select(x => Type.GetType(x.ParameterType.FullName)).ToArray(), null);
                if (realMethod == null)
                {
                    throw new InazumaExecutionException("Could not find the internal method: " + methDef.FullName);
                }

                retVal = realMethod.Invoke(null, args);
            }

            if (methDef.ReturnType.FullName != "System.Void") // TODO: should refer typevalue
            {
                _opStack.Push(ObjectInstance.FromClrObject(retVal));
            }
        }
Exemplo n.º 10
0
		static Collection<ParameterDefinition> MirrorParameters (MethodDefinition method, int bound)
		{
			var parameters = new Collection<ParameterDefinition> ();
			if (!method.HasParameters)
				return parameters;

			var original_parameters = method.Parameters;
			var end = original_parameters.Count - bound;

			for (int i = 0; i < end; i++)
				parameters.Add (original_parameters [i]);

			return parameters;
		}