private PExpr FindOrCreateMethod(IAccessorFrame frame, string name, out ExternalTypeHandler.IHandler handler) { handler = null; foreach (var m in _methods) { if (m.Name == name) { return(frame.SetResult(m)); } } ExternalTypeHandler type = _context.FindType(_o.GetType()); if (type == null) { return(frame.SetError($"Unhandled type '{_o.GetType().FullName}'.")); } handler = type.GetHandler(name); if (handler == null) { return(frame.SetError($"Missing member {name} on '{_o.GetType().FullName}'.")); } if (handler.PropertyGetter == null) { var meth = new Method(this, handler); _methods.Add(meth); return(frame.SetResult(meth)); } return(new PExpr()); }
PExpr DoCall(IAccessorFrame frame, IReadOnlyList <RuntimeObj> parameters) { try { object[] p = MapCallParameters(frame.Global, parameters, _parameters); object result = _function.DynamicInvoke(p); return(_function.GetMethodInfo().ReturnType == typeof(void) ? frame.SetResult(RuntimeObj.Undefined) : frame.SetResult(frame.Global.Create(result))); } catch (Exception ex) { return(frame.SetError(ex.Message)); } }
public override PExpr Visit(IAccessorFrame frame) { if (frame.Expr.IsMember("Message")) { return(frame.SetResult(StringObj.Create(Message))); } return(frame.SetError()); }
internal PExpr Read(IAccessorFrame frame) { try { object[] index = null; object val = _handler.PropertyGetter(_eo._o, index); RuntimeObj obj = val == _eo ? _eo : frame.Global.Create(val); if (_handler.PropertySetter != null) { base.SetValue(frame.Expr, obj); return(frame.SetResult(this)); } return(frame.SetResult(obj)); } catch (Exception ex) { return(frame.SetError(ex.Message)); } }
PExpr DoCall(IAccessorFrame frame, IReadOnlyList <RuntimeObj> parameters) { try { var m = _handler.FindMethod(_eo._context, parameters); if (m.Method == null) { return(frame.SetError($"Method {_handler.Name} can not be called with {parameters.Count} parameters.")); } object result = m.Method.Invoke(_eo._o, m.Parameters); return(m.Method.ReturnType == typeof(void) ? frame.SetResult(RuntimeObj.Undefined) : frame.SetResult(_eo._context.Create(result))); } catch (Exception ex) { return(frame.SetError(ex.Message)); } }
public override PExpr SetResult(RuntimeObj result) { IAccessorFrame p = PrevAccessor; if (p != null && !p.IsResolved) { p.SetResult(result); } return(base.SetResult(result)); }
public override PExpr SetResult(RuntimeObj result) { // NextFrame is actually the PreviousAccessor IAccessorFrame p = NextFrame as IAccessorFrame; if (p != null && !p.IsResolved) { p.SetResult(result); } return(base.SetResult(result)); }
public override PExpr Visit( IAccessorFrame frame ) { if( frame.Expr.IsMember( "message" ) ) return frame.SetResult( frame.Global.CreateString( Message ) ); return frame.SetError(); }