internal DelegateInfo(LanguageContext context, Type returnType, ParameterInfo[] parameters) { Assert.NotNull(returnType); Assert.NotNullItems(parameters); _returnType = returnType; _parameters = parameters; PerfTrack.NoteEvent(PerfTrack.Categories.DelegateCreate, ToString()); if (_returnType != typeof(void)) { _convertBinder = context.CreateConvertBinder(_returnType, true); } _invokeBinder = context.CreateInvokeBinder(new CallInfo(_parameters.Length)); Type[] delegateParams = new Type[_parameters.Length]; for (int i = 0; i < _parameters.Length; i++) { delegateParams[i] = _parameters[i].ParameterType; } // Create the method with a special name so the langauge compiler knows that method's stack frame is not visible DynamicILGen cg = Snippets.Shared.CreateDynamicMethod("_Scripting_", _returnType, ArrayUtils.Insert(typeof(object[]), delegateParams), false); // Emit the stub _constants = EmitClrCallStub(cg); _method = cg.Finish(); }
private void EmitClrCallStub(Type returnType, Type[] parameterTypes, out MethodInfo method) { // Create the method with a special name so the langauge compiler knows that method's stack frame is not visible DynamicILGen cg = Snippets.Shared.CreateDynamicMethod("_Scripting_", returnType, parameterTypes, false); EmitClrCallStub(cg); method = cg.Finish(); }
/// <summary> /// The core of the interpreter, calling back onto itself via delegates. /// </summary> private static MethodInfo CreateDelegateForInterpreter(Type type) { Debug.Assert(type != typeof(Delegate) && typeof(Delegate).IsAssignableFrom(type)); // // Get the desired signature // MethodInfo invoke = type.GetMethod("Invoke"); ParameterInfo[] parameters = invoke.GetParameters(); string name = "Interpreted_" + Interlocked.Increment(ref _DelegateCounter); Type[] signature = CreateInterpreterSignature(parameters); DynamicILGen il = Snippets.Shared.CreateDynamicMethod(name, invoke.ReturnType, signature, false); // Collect all arguments received by the delegate into an array // and pass them to the Interpreter along with the LambdaInvoker // LambdaInvoker il.EmitLoadArg(0); int count = parameters.Length; // Create the array il.EmitInt(count); il.Emit(OpCodes.Newarr, typeof(object)); for (int i = 0; i < count; i++) { il.Emit(OpCodes.Dup); il.EmitInt(i); il.EmitLoadArg(i + 1); EmitExplicitCast(il, parameters[i].ParameterType, typeof(object)); il.EmitStoreElement(typeof(object)); } // Call back to interpreter il.EmitCall(LambdaInvoker.GetInvokeMethod()); // Cast back to the delegate return type EmitExplicitCast(il, typeof(object), invoke.ReturnType); // And return whatever the result was. il.Emit(OpCodes.Ret); // // We are done (for now), finish the MethodInfo // return(il.Finish()); }
internal DelegateInfo GenerateDelegateStub() { PerfTrack.NoteEvent(PerfTrack.Categories.DelegateCreate, ToString()); Type[] delegateParams = new Type[_parameters.Length]; for (int i = 0; i < _parameters.Length; i++) { delegateParams[i] = _parameters[i].ParameterType; } // Create the method DynamicILGen cg = Snippets.Shared.CreateDynamicMethod(ToString(), _returnType, ArrayUtils.Insert(typeof(object[]), delegateParams), false); // Emit the stub object[] constants = EmitClrCallStub(cg); // Save the constants in the delegate info class return(new DelegateInfo(cg.Finish(), constants)); }