示例#1
0
        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());
        }
示例#2
0
 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));
     }
 }
示例#3
0
 public override PExpr Visit(IAccessorFrame frame)
 {
     if (frame.Expr.IsMember("Message"))
     {
         return(frame.SetResult(StringObj.Create(Message)));
     }
     return(frame.SetError());
 }
示例#4
0
 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));
     }
 }
示例#5
0
 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));
            }
示例#7
0
            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));
            }
示例#8
0
 public override PExpr Visit( IAccessorFrame frame )
 {
     if( frame.Expr.IsMember( "message" ) ) return frame.SetResult( frame.Global.CreateString( Message ) );
     return frame.SetError();
 }