Example #1
0
        }         // func ConvertObjectExpression

        private static Expression ConvertExpression(Lua runtime, Token tokenStart, Expression expr, Type toType)
        {
            // dynamic convert
            if (LuaEmit.TryConvert(expr, expr.Type, toType, runtime.GetConvertBinder, out var result))
            {
                return((Expression)result);
            }
            else
            {
                throw ParseError(tokenStart, ((LuaEmitException)result).Message);
            }
        }         // func ConvertExpression
Example #2
0
            } // ctor

            public override DynamicMetaObject FallbackConvert(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
            {
                if (!target.HasValue)
                {
                    return(Defer(target));
                }

                if (target.Value == null)                 // get the default value
                {
                    Expression expr;
                    var        restrictions = target.Restrictions.Merge(BindingRestrictions.GetInstanceRestriction(target.Expression, null));

                    if (Type == typeof(LuaResult))                     // replace null with empty LuaResult
                    {
                        expr = Expression.Property(null, Lua.ResultEmptyPropertyInfo);
                    }
                    else if (Type == typeof(string))                     // replace null with empty String
                    {
                        expr = Expression.Field(null, Lua.StringEmptyFieldInfo);
                    }
                    else
                    {
                        expr = Expression.Default(Type);
                    }

                    return(new DynamicMetaObject(Lua.EnsureType(expr, ReturnType), restrictions));
                }
                else                 // convert the value
                {
                    var    restrictions = target.Restrictions.Merge(BindingRestrictions.GetTypeRestriction(target.Expression, target.LimitType));
                    object result;
                    if (LuaEmit.TryConvert(target.Expression, target.LimitType, Type, null, out result))
                    {
                        return(new DynamicMetaObject(Lua.EnsureType((Expression)result, ReturnType), restrictions));
                    }
                    else if (errorSuggestion == null)
                    {
                        if (result == null)
                        {
                            throw new ArgumentNullException("expr", "LuaEmit.TryConvert does not return a expression.");
                        }
                        return(new DynamicMetaObject(ThrowExpression(((LuaEmitException)result).Message, ReturnType), restrictions));
                    }
                    else
                    {
                        return(errorSuggestion);
                    }
                }
            } // func FallbackConvert