コード例 #1
0
            } // 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
コード例 #2
0
            } // 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
コード例 #3
0
        }         // 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