} // ctor public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { // defer the target, to get the type if (!target.HasValue) { return(Defer(target)); } if (target.Value == null) { return(errorSuggestion ?? new DynamicMetaObject( ThrowExpression(Properties.Resources.rsNullReference, ReturnType), target.Restrictions.Merge(BindingRestrictions.GetInstanceRestriction(target.Expression, null)) )); } else { // try to bind the member Expression expr; try { expr = EnsureType(LuaEmit.GetMember(lua, target.Expression, target.LimitType, Name, IgnoreCase, false), ReturnType); /* * Fallback-Calls * first it get calls with no error suggestion -> return the default value * second call is to create a bind expression again, with the default value suggest * Example: DynamicObject - creates something like * * fallback(TryGetMember(binder, out result) ? result : fallback(null)); * */ if (expr.NodeType == ExpressionType.Default && errorSuggestion != null) { return(errorSuggestion); } } catch (LuaEmitException e) { if (errorSuggestion != null) { return(errorSuggestion); } expr = ThrowExpression(e.Message, ReturnType); } // restrictions var restrictions = target.Restrictions.Merge(BindingRestrictions.GetTypeRestriction(target.Expression, target.LimitType)); return(new DynamicMetaObject(expr, restrictions)); } } // func FallbackGetMember
} // ctor public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { // defer the target, to get the type if (!target.HasValue) { return(Defer(target)); } if (target.Value == null) { return(errorSuggestion ?? new DynamicMetaObject( ThrowExpression(Properties.Resources.rsNullReference, ReturnType), target.Restrictions.Merge(BindingRestrictions.GetInstanceRestriction(target.Expression, null)) )); } else { // try to bind the member Expression expr; try { expr = EnsureType(LuaEmit.GetMember(lua, target.Expression, target.LimitType, Name, IgnoreCase, false), ReturnType); } catch (LuaEmitException e) { if (errorSuggestion != null) { return(errorSuggestion); } expr = ThrowExpression(e.Message, ReturnType); } // restrictions var restrictions = target.Restrictions.Merge(BindingRestrictions.GetTypeRestriction(target.Expression, target.LimitType)); return(new DynamicMetaObject(expr, restrictions)); } } // func FallbackGetMember
} // func MemberGetSandbox private static Expression MemberGetExpression(Scope scope, Token tStart, Expression instance, string sMember) { return(MemberGetSandbox(scope, SafeExpression(() => LuaEmit.GetMember(scope.Runtime, instance, instance.Type, sMember, false, true), tStart), instance, sMember)); } // func MemberGetExpression