コード例 #1
0
        public override GraceObject Request(EvaluationContext ctx,
                                            MethodRequest req, GraceObject receiver)
        {
            var part     = req[0];
            var isAssign = false;

            if (req.Count > 1)
            {
                if (req[1].Name == ":=(_)")
                {
                    part     = req[1];
                    isAssign = true;
                }
            }
            object[] args = new object[part.Arguments.Count];
            int      i    = 0;

            foreach (var a in part.Arguments)
            {
                var d = a as DomObject;
                var s = a as GraceString;
                if (d != null)
                {
                    args[i++] = new int[1] {
                        d.key
                    }
                }
                ;
                else if (s != null)
                {
                    args[i++] = s.Value;
                }
                else
                {
                    args[i++] = a;
                }
            }
            // Request names include arities, which
            // the DOM doesn't understand.
            var name = req.Name;
            var idx  = name.IndexOf('(');

            if (idx != -1)
            {
                name = name.Substring(0, idx);
            }
            if (isAssign)
            {
                return(sink.SendRPCNoResult(key, name, args));
            }
            if (ignoredMethodResults != null)
            {
                if (ignoredMethodResults.Contains(name))
                {
                    return(sink.SendRPCNoResult(key, name, args));
                }
            }
            var ret = sink.SendRPC(key, name, args);
            var gfo = ret as GraceForeignObject;

            if (gfo == null)
            {
                return(ret);
            }
            int okey = (int)gfo.IdentifyingData;

            return(new DomObject(okey, sink));
        }