public override void EmitUnboxed(RHC rhc, ObjExpr objx, CljILGen ilg) { // See MethodExpr.EmitComplexCall to see why this is so complicated // Build the parameter list List <ParameterExpression> paramExprs = new List <ParameterExpression>(); List <Type> paramTypes = new List <Type>(); Type paramType = _target.HasClrType && _target.ClrType != null && _target.ClrType.IsPrimitive ? _target.ClrType : typeof(object); ParameterExpression param = Expression.Parameter(paramType); paramExprs.Add(param); paramTypes.Add(paramType); // Build dynamic call and lambda Type returnType = HasClrType ? ClrType : typeof(object); GetMemberBinder binder = new ClojureGetZeroArityMemberBinder(ClojureContext.Default, _memberName, false); DynamicExpression dyn = Expression.Dynamic(binder, returnType, paramExprs); LambdaExpression lambda; Type delType; MethodBuilder mbLambda; MethodExpr.EmitDynamicCallPreamble(dyn, _spanMap, "__interop_" + _memberName + RT.nextID(), returnType, paramExprs, paramTypes.ToArray(), ilg, out lambda, out delType, out mbLambda); // Emit target + args (no args, actually) _target.Emit(RHC.Expression, objx, ilg); MethodExpr.EmitDynamicCallPostlude(lambda, delType, mbLambda, ilg); }
public override Expression GenCodeUnboxed(RHC rhc, ObjExpr objx, GenContext context) { Expression target = _target.GenCode(RHC.Expression, objx, context); Type returnType = HasClrType ? ClrType : typeof(object); // TODO: Get rid of Default GetMemberBinder binder = new ClojureGetZeroArityMemberBinder(ClojureContext.Default, _memberName, false); DynamicExpression dyn = Expression.Dynamic(binder, returnType, new Expression[] { target }); Expression call = dyn; if (context.DynInitHelper != null) { call = context.DynInitHelper.ReduceDyn(dyn); } call = Compiler.MaybeAddDebugInfo(call, _spanMap, context.IsDebuggable); return(call); }