protected override object DoExecute(CodeContext context) { _expression.Evaluate(context); return(NextStatement); }
protected override object DoEvaluate(CodeContext context) { object instance = null; // Evaluate the instance first (if the method is non-static) if (!Method.IsStatic) { instance = EvaluateInstance(context); } object[] parameters = new object[_parameterInfos.Length]; EvaluationAddress[] paramAddrs = new EvaluationAddress[_parameterInfos.Length]; if (_parameterInfos.Length > 0) { int last = parameters.Length; for (int i = 0; i < last; i++) { ParameterInfo pi = _parameterInfos[i]; if (pi.ParameterType.IsByRef) { paramAddrs[i] = _arguments[i].EvaluateAddress(context); object value = paramAddrs[i].GetValue(context, !IsInputParameter(i)); if (IsInputParameter(i)) { parameters[i] = context.LanguageContext.Binder.Convert( value, _parameterInfos[i].ParameterType.GetElementType() ); } } else if (IsInputParameter(i)) { Expression arg = _arguments[i]; parameters[i] = arg != null?arg.Evaluate(context) : null; } } } try { object res; try { // Call the method res = InvokeMethod(instance, parameters); // Return the singleton True or False object if (Type == typeof(Boolean)) { res = RuntimeHelpers.BooleanToObject((bool)res); } } finally { // expose by-ref args for (int i = 0; i < _parameterInfos.Length; i++) { if (_parameterInfos[i].ParameterType.IsByRef) { paramAddrs[i].AssignValue(context, parameters[i]); } } } // back propagate instance on value types if the instance supports it. if (_method.DeclaringType != null && _method.DeclaringType.IsValueType && !_method.IsStatic) { _instance.EvaluateAssign(context, instance); } return(res); } catch (TargetInvocationException e) { // Unwrap the real (inner) exception and raise it throw ExceptionHelpers.UpdateForRethrow(e.InnerException); } }