} // 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
} // 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