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); } }
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)); } }
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); }