internal override Expression UpdateFromReturn(MethodBinderContext context, Expression[] parameters) {
     return Ast.Call(
         typeof(BinderOps).GetMethod("UpdateBox").MakeGenericMethod(_elementType),
         Ast.Convert(parameters[Index], BoxType),
         Ast.Read(_tmp)
     );
 }
示例#2
0
        internal override Expression ToReturnExpression(MethodBinderContext context) {
            if (_isRef) {
                return Ast.Read(_tmp);
            }

            return GetDefaultValue();
        }
        internal override Expression ToExpression(MethodBinderContext context, IList<ArgBuilder> args, IList<Expression> parameters, Expression ret)
        {
            List<Expression> sets = new List<Expression>();

            Variable tmp = null;// context.GetTemporary(ret.Type, "val");

            for (int i = 0; i < _indexesUsed.Length; i++) {
                Expression value = parameters[parameters.Count - _kwArgCount + _indexesUsed[i]];
                switch(_membersSet[i].MemberType) {
                    case MemberTypes.Field:
                        FieldInfo fi = (FieldInfo)_membersSet[i];
                        if (!fi.IsLiteral && !fi.IsInitOnly) {
                            sets.Add(Ast.AssignField(Ast.Read(tmp), fi, Ast.ConvertHelper(value, fi.FieldType)));
                        } else {
                            // call a helper which throws the error but "returns object"
                            sets.Add(
                                Ast.Convert(
                                    Ast.Call(
                                        typeof(RuntimeHelpers).GetMethod("ReadOnlyAssignError"),
                                        Ast.Constant(true),
                                        Ast.Constant(fi.Name)
                                    ),
                                    fi.FieldType
                                )
                            );
                        }
                        break;
                    case MemberTypes.Property:
                        PropertyInfo pi = (PropertyInfo)_membersSet[i];
                        if (pi.GetSetMethod(ScriptDomainManager.Options.PrivateBinding) != null) {
                            sets.Add(Ast.AssignProperty(Ast.Read(tmp), pi, Ast.ConvertHelper(value, pi.PropertyType)));
                        } else {
                            // call a helper which throws the error but "returns object"
                            sets.Add(
                                Ast.Convert(
                                    Ast.Call(
                                        typeof(RuntimeHelpers).GetMethod("ReadOnlyAssignError"),
                                        Ast.Constant(false),
                                        Ast.Constant(pi.Name)
                                    ),
                                    pi.PropertyType
                                )
                            );
                        }
                        break;
                }
            }

            Expression newCall = Ast.Comma(
                0,
                ArrayUtils.Insert<Expression>(
                    Ast.Assign(tmp, ret),
                    sets.ToArray()
                )
            );

            return _builder.ToExpression(context, args, parameters, newCall);
        }
        internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters) {
            Expression res = Ast.Call(
                typeof(BinderOps).GetMethod("MakeSymbolDictionary"),
                Ast.NewArray(typeof(SymbolId[]), ConstantNames()),
                Ast.NewArrayHelper(typeof(object[]), GetParameters(parameters))
            );

            return res;
        }
        internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters)
        {

#if FULL
            if (_tmp == null) {
                _tmp = context.GetTemporary(Type, "outParam");
            } 
#endif


          return Ast.Comma(Ast.Assign(_tmp, base.ToExpression(context, parameters)), Ast.Read(_tmp));
        }
示例#6
0
        internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters)
        {

#if FULL
            if (_isRef) {
                if (_tmp == null) {
                    _tmp = context.GetTemporary(_parameterType, "outParam");
                }
                return Ast.Read(_tmp);
            } 
#endif


          return GetDefaultValue();
        }
        internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters)
        {

#if FULL
            if (_tmp == null) {
                _tmp = context.GetTemporary(_elementType, "outParam");
            } 
#endif


          // Ideally we'd pass in Ast.ReadField(parameters[Index], "Value") but due to
            // a bug in partial trust we can't access the generic field.

            // arg is boxType ? &_tmp : throw new ArgumentTypeException()
            //   IncorrectBoxType throws the exception to avoid stack imbalance issues.
            return Ast.Condition(
                Ast.TypeIs(parameters[Index], BoxType),
                Ast.Comma(
                    Ast.Assign(
                        _tmp,
                        Ast.Call(
                            typeof(BinderOps).GetMethod("GetBox").MakeGenericMethod(_elementType),
                            Ast.ConvertHelper(parameters[Index], typeof(StrongBox<>).MakeGenericType(_elementType))
                        )
                    ),
                    Ast.Read(_tmp)
                ),
                // Condition requires types of both expressions to be identical.
                // Putting the cast here is a temporary workaround until the
                // emit address and reference argument passing is finished.
                Ast.Convert(
                    Ast.Call(
                        typeof(BinderOps).GetMethod("IncorrectBoxType"),
                        Ast.Constant(BoxType),
                        Ast.ConvertHelper(parameters[Index], typeof(object))
                    ),
                    _elementType
                )
            );
        }
示例#8
0
        internal override Expression ToExpression(MethodBinderContext context, IList<ArgBuilder> args, IList<Expression> parameters, Expression ret)
        {
            if (_returnArgs.Count == 1) {
                if (_returnArgs[0] == -1) {
                    return ret;
                }
                return Ast.Comma(ret, args[_returnArgs[0]].ToReturnExpression(context));
            }

            Expression[] retValues = new Expression[_returnArgs.Count];
            int rIndex = 0;
            bool usesRet = false;
            foreach (int index in _returnArgs) {
                if (index == -1) {
                    usesRet = true;
                    retValues[rIndex++] = ret;
                } else {
                    retValues[rIndex++] = args[index].ToReturnExpression(context);
                }
            }

            Expression retArray = Ast.NewArrayHelper(typeof(object[]), retValues);
            if (!usesRet) {
                retArray = Ast.Comma(ret, retArray);
            }

            return Ast.Call(
                Ast.ReadProperty(
                    Ast.ReadProperty(
                        Ast.CodeContext(),
                        typeof(CodeContext).GetProperty("LanguageContext")
                    ),
                    typeof(LanguageContext).GetProperty("Binder")
                ),
                typeof(ActionBinder).GetMethod("GetByRefArray"),
                retArray
            );
        }
示例#9
0
 /// <summary>
 /// Provides an Expression which will update the provided value after a call to the method.  May
 /// return null if no update is required.
 /// </summary>
 internal virtual Expression UpdateFromReturn(MethodBinderContext context, Expression[] parameters)
 {
     return(null);
 }
 internal override Expression ToReturnExpression(MethodBinderContext context)
 {
     return(Ast.Read(_tmp));
 }
示例#11
0
 internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters)
 {
     Debug.Assert(_index < parameters.Length);
     Debug.Assert(parameters[_index] != null);
     return(context.ConvertExpression(parameters[_index], _parameterType));
 }
示例#12
0
 /// <summary>
 /// If the argument produces a return value (e.g. a ref or out value) this provides
 /// the additional value to be returned.
 /// </summary>
 internal virtual Expression ToReturnExpression(MethodBinderContext context) {
     throw new InvalidOperationException();
 }
示例#13
0
 internal override Expression CheckExpression(MethodBinderContext context, Expression[] parameters)
 {
     return context.CheckExpression(parameters[_index], _parameterType);
 }
示例#14
0
 internal override Expression CheckExpression(MethodBinderContext context, Expression[] parameters)
 {
     return(null);
 }
 internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters)
 {
     return Ast.Comma(Ast.Assign(_tmp, base.ToExpression(context, parameters)), Ast.Read(_tmp));
 }
示例#16
0
 internal override Expression UpdateFromReturn(MethodBinderContext context, Expression[] parameters)
 {
     return _builder.UpdateFromReturn(context, new Expression[] { parameters[GetKeywordIndex(parameters.Length)] });
 }
示例#17
0
 internal override Expression ToReturnExpression(MethodBinderContext context)
 {
     return _builder.ToReturnExpression(context);
 }
示例#18
0
        public Expression MakeExpression(ActionBinder binder, StandardRule rule, Expression[] parameters)
        {
            MethodBinderContext context = new MethodBinderContext(binder, rule);

            Expression check = Ast.True();

            if (_binder.IsBinaryOperator)
            {
                // TODO: only if we have a narrowing level

                // need to emit check to see if args are convertible...
                for (int i = 0; i < _argBuilders.Count; i++)
                {
                    Expression checkedExpr = _argBuilders[i].CheckExpression(context, parameters);
                    if (checkedExpr != null)
                    {
                        check = Ast.AndAlso(check, checkedExpr);
                    }
                }
            }

            Expression[] args = new Expression[_argBuilders.Count];
            for (int i = 0; i < _argBuilders.Count; i++)
            {
                args[i] = _argBuilders[i].ToExpression(context, parameters);
            }

            MethodInfo mi = Method as MethodInfo;
            Expression ret, call;

            if (!Method.IsPublic || !Method.DeclaringType.IsVisible)
            {
                if (mi != null)
                {
                    mi = CompilerHelpers.GetCallableMethod(mi);
                }
            }

            if (Method.IsPublic && Method.DeclaringType.IsVisible)
            {
                // public method
                if (mi != null)
                {
                    Expression instance = mi.IsStatic ? null : _instanceBuilder.ToExpression(context, parameters);
                    call = Ast.SimpleCallHelper(instance, mi, args);
                }
                else
                {
                    call = Ast.SimpleNewHelper((ConstructorInfo)Method, args);
                }
            }
            else
            {
                // Private binding, invoke via reflection
                if (mi != null)
                {
                    Expression instance = mi.IsStatic ? null : _instanceBuilder.ToExpression(context, parameters);
                    call = Ast.Call(
                        Ast.RuntimeConstant(mi),
                        typeof(MethodInfo).GetMethod("Invoke", new Type[] { typeof(object), typeof(object[]) }),
                        Ast.ConvertHelper(instance, typeof(object)),
                        Ast.NewArrayHelper(typeof(object[]), args)
                        );
                }
                else
                {
                    call = Ast.Call(
                        Ast.RuntimeConstant((ConstructorInfo)Method),
                        typeof(ConstructorInfo).GetMethod("Invoke", new Type[] { typeof(object[]) }),
                        Ast.NewArrayHelper(typeof(object[]), args)
                        );
                }
            }

            ret = _returnBuilder.ToExpression(context, _argBuilders, parameters, call);

            List <Expression> updates = null;

            for (int i = 0; i < _argBuilders.Count; i++)
            {
                Expression next = _argBuilders[i].UpdateFromReturn(context, parameters);
                if (next != null)
                {
                    if (updates == null)
                    {
                        updates = new List <Expression>();
                    }
                    updates.Add(next);
                }
            }

            if (updates != null)
            {
                updates.Insert(0, ret);
                ret = Ast.Comma(0, updates.ToArray());
            }

            if (!check.IsConstant(true))
            {
                ret = Ast.Condition(
                    check,
                    Ast.ConvertHelper(ret, typeof(object)),
                    GetNotImplemented()
                    );
            }
            return(ret);
        }
示例#19
0
 internal virtual Expression ToExpression(MethodBinderContext context, IList <ArgBuilder> args, IList <Expression> parameters, Expression ret)
 {
     return(ret);
 }
示例#20
0
 internal override Expression CheckExpression(MethodBinderContext context, Expression[] parameters)
 {
     return(context.CheckExpression(parameters[_index], _parameterType));
 }
 internal override Expression ToReturnExpression(MethodBinderContext context) {
     return Ast.Read(_tmp);
 }
示例#22
0
        internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters) {
            object val = _defaultValue;
            if(val is Missing) {
                val = CompilerHelpers.GetMissingValue(_argumentType);
            }


#if FULL
            if (_argumentType.IsByRef) {
                Variable tmp = context.GetTemporary(_argumentType.GetElementType(), "optRef");
                return Ast.Comma(
                    Ast.Assign(
                        tmp,
                        Ast.Convert(Ast.Constant(val), tmp.Type)
                    ),
                    Ast.Read(tmp)
                );
            } 
#endif


            return context.ConvertExpression(Ast.Constant(val), _argumentType);            
        }
示例#23
0
 internal virtual Expression ToExpression(MethodBinderContext context, IList<ArgBuilder> args, IList<Expression> parameters, Expression ret)
 {
     return ret;
 }
示例#24
0
 /// <summary>
 /// Provides an Expression which returns a Boolean determining whether or not the parameter is convertible
 /// to the receiving arguments type.  This is currently only used for a MethodBinder of BinderType.BinaryOperator.
 ///
 /// This function should be removed when BinaryOperator support is removed.
 /// </summary>
 internal abstract Expression CheckExpression(MethodBinderContext context, Expression[] parameters);
示例#25
0
 internal override Expression CheckExpression(MethodBinderContext context, Expression[] parameters) {
     return null;
 }
示例#26
0
 internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters)
 {
     return(GetDefaultValue());
 }
示例#27
0
 /// <summary>
 /// Provides an Expression which will update the provided value after a call to the method.  May
 /// return null if no update is required.
 /// </summary>
 internal virtual Expression UpdateFromReturn(MethodBinderContext context, Expression[] parameters) {
     return null;
 }
示例#28
0
 internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters)
 {
     Debug.Assert(_index < parameters.Length);
     Debug.Assert(parameters[_index] != null);
     return context.ConvertExpression(parameters[_index], _parameterType);
 }
示例#29
0
public Expression MakeExpression(ActionBinder binder, StandardRule rule, Expression[] parameters) {
            MethodBinderContext context = new MethodBinderContext(binder, rule);

            Expression check = Ast.True();
            if (_binder.IsBinaryOperator) {
                // TODO: only if we have a narrowing level

                // need to emit check to see if args are convertible...
                for (int i = 0; i < _argBuilders.Count; i++) {
                    Expression checkedExpr = _argBuilders[i].CheckExpression(context, parameters);
                    if(checkedExpr != null) {
                        check = Ast.AndAlso(check, checkedExpr);
                    }
                }
            }

            Expression[] args = new Expression[_argBuilders.Count];
            for (int i = 0; i < _argBuilders.Count; i++) {
                args[i] = _argBuilders[i].ToExpression(context, parameters);
            }

            MethodInfo mi = Method as MethodInfo;
            Expression ret, call;
            if (!Method.IsPublic || !Method.DeclaringType.IsVisible) {
                if (mi != null) {
                    mi = CompilerHelpers.GetCallableMethod(mi);
                }
            }

            if (Method.IsPublic && Method.DeclaringType.IsVisible) {
                // public method
                if (mi != null) {
                    Expression instance = mi.IsStatic ? null : _instanceBuilder.ToExpression(context, parameters);
                    call = Ast.SimpleCallHelper(instance, mi, args);
                } else {
                    call = Ast.SimpleNewHelper((ConstructorInfo)Method, args);
                }
            } else {
                // Private binding, invoke via reflection
                if (mi != null) {
                    Expression instance = mi.IsStatic ? null : _instanceBuilder.ToExpression(context, parameters);
                    call = Ast.Call(
                        Ast.RuntimeConstant(mi),
                        typeof(MethodInfo).GetMethod("Invoke", new Type[] { typeof(object), typeof(object[]) }),
                        Ast.ConvertHelper(instance, typeof(object)),
                        Ast.NewArrayHelper(typeof(object[]), args)
                    );
                } else {
                    call = Ast.Call(
                        Ast.RuntimeConstant((ConstructorInfo)Method),
                        typeof(ConstructorInfo).GetMethod("Invoke", new Type[] { typeof(object[]) }), 
                        Ast.NewArrayHelper(typeof(object[]), args)
                    ); 
                }
            }

            ret = _returnBuilder.ToExpression(context, _argBuilders, parameters, call);

            List<Expression> updates = null;
            for (int i = 0; i < _argBuilders.Count; i++) {                
                Expression next = _argBuilders[i].UpdateFromReturn(context, parameters);
                if (next != null) {
                    if (updates == null) updates = new List<Expression>();
                    updates.Add(next);
                }
            }

            if (updates != null) {
                updates.Insert(0, ret);
                ret = Ast.Comma(0, updates.ToArray());
            }

            if (!check.IsConstant(true)) {
                ret = Ast.Condition(
                    check,
                    Ast.ConvertHelper(ret, typeof(object)),
                    GetNotImplemented()
                );
            }
            return ret;
      } 
 internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters)
 {
     return(Ast.Comma(Ast.Assign(_tmp, base.ToExpression(context, parameters)), Ast.Read(_tmp)));
 }
示例#31
0
 /// <summary>
 /// If the argument produces a return value (e.g. a ref or out value) this provides
 /// the additional value to be returned.
 /// </summary>
 internal virtual Expression ToReturnExpression(MethodBinderContext context)
 {
     throw new InvalidOperationException();
 }
示例#32
0
        internal override Expression ToExpression(MethodBinderContext context, Expression[] parameters)
        {
            object val = _defaultValue;
            if(val is Missing) {
                val = CompilerHelpers.GetMissingValue(_argumentType);
            }

            return context.ConvertExpression(Ast.Constant(val), _argumentType);
        }
示例#33
0
 /// <summary>
 /// Provides an Expression which returns a Boolean determining whether or not the parameter is convertible
 /// to the receiving arguments type.  This is currently only used for a MethodBinder of BinderType.BinaryOperator.
 /// 
 /// This function should be removed when BinaryOperator support is removed.
 /// </summary>
 internal abstract Expression CheckExpression(MethodBinderContext context, Expression[] parameters);