public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            try
            {
                var propIdx = _context.FindProperty(binder.Name);
                if (!_context.IsPropReadable(propIdx))
                {
                    result = null;
                    return(false);
                }

                result = CustomMarshaller.ConvertToDynamicCLRObject(_context.GetPropValue(propIdx));
                return(true);
            }
            catch (PropertyAccessException)
            {
                result = null;
                return(false);
            }
            catch (ValueMarshallingException)
            {
                result = null;
                return(false);
            }
        }
Ejemplo n.º 2
0
        public ScriptedController(ControllerContext context, LoadedModuleHandle module) : base(module, true)
        {
            _ctx         = context;
            HttpRequest  = new HttpRequestImpl(_ctx.HttpContext.Request);
            HttpResponse = new HttpResponseImpl(_ctx.HttpContext.Response);

            if (_ctx.RouteData != null)
            {
                RouteValues = new MapImpl();
                foreach (var routeData in _ctx.RouteData.Values)
                {
                    var rv = RouteValues.AsObject();
                    rv.SetIndexedValue(
                        ValueFactory.Create(routeData.Key),
                        CustomMarshaller.ConvertToIValueSafe(routeData.Value, routeData.Value.GetType())
                        );
                }
            }
            else
            {
                RouteValues = ValueFactory.Create();
            }

            var typeClr = (Type)context.ActionDescriptor.Properties["type"];
            var type    = TypeManager.RegisterType(typeClr.Name, typeof(ScriptedController));

            DefineType(type);
            InitOwnData();
        }
        public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
        {
            if (!_context.IsIndexed)
            {
                return(false);
            }

            var index = CustomMarshaller.ConvertReturnValue(indexes[0], indexes[0].GetType());

            _context.SetIndexedValue(index, CustomMarshaller.ConvertReturnValue(value, value.GetType()));
            return(true);
        }
        public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
        {
            if (!_context.IsIndexed)
            {
                result = null;
                return(false);
            }

            var index = CustomMarshaller.ConvertReturnValue(indexes[0], indexes[0].GetType());

            result = CustomMarshaller.ConvertToDynamicCLRObject(_context.GetIndexedValue(index));
            return(true);
        }
        public IEnumerator GetEnumerator()
        {
            if (!(_context is IEnumerable <IValue>))
            {
                throw RuntimeException.IteratorIsNotDefined();
            }

            var enumer = (IEnumerable <IValue>)_context;

            foreach (var iValue in enumer)
            {
                yield return(CustomMarshaller.ConvertToDynamicCLRObject(iValue));
            }
        }
Ejemplo n.º 6
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            int methIdx;

            try
            {
                methIdx = _context.FindMethod(binder.Name);
            }
            catch (MethodAccessException)
            {
                result = null;
                return(false);
            }

            var    valueArgs = args.Select(x => CustomMarshaller.ConvertReturnValue(x, x.GetType())).ToArray();
            IValue methResult;

            _context.CallAsFunction(methIdx, valueArgs, out methResult);
            result = CustomMarshaller.ConvertToDynamicCLRObject(methResult);

            return(true);
        }
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            try
            {
                var propIdx = _context.FindProperty(binder.Name);
                if (!_context.IsPropWritable(propIdx))
                {
                    return(false);
                }

                _context.SetPropValue(propIdx, CustomMarshaller.ConvertReturnValue(value, value.GetType()));

                return(true);
            }
            catch (PropertyAccessException)
            {
                return(false);
            }
            catch (NotSupportedException)
            {
                return(false);
            }
        }
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            int methIdx;

            try
            {
                methIdx = _context.FindMethod(binder.Name);
            }
            catch (MethodAccessException)
            {
                result = null;
                return(false);
            }

            var methInfo   = _context.GetMethodInfo(methIdx);
            var valueArgs  = new IValue[methInfo.Params.Length];
            var passedArgs = args.Select(x => CustomMarshaller.ConvertReturnValue(x, x.GetType())).ToArray();

            for (int i = 0; i < valueArgs.Length; i++)
            {
                if (i < passedArgs.Length)
                {
                    valueArgs[i] = passedArgs[i];
                }
                else
                {
                    valueArgs[i] = ValueFactory.CreateInvalidValueMarker();
                }
            }

            IValue methResult;

            _context.CallAsFunction(methIdx, valueArgs, out methResult);
            result = methResult == null? null : CustomMarshaller.ConvertToDynamicCLRObject(methResult);

            return(true);
        }