Beispiel #1
0
        //needs retesting
        public override object Call1(Class last_class, object recv, Frame caller, Proc block, object arg)
        {
             if (arg is Array)
            {
                ArgList argv = new ArgList(block, new object[] { recv });
                argv.AddRange((Array)arg);
                return rb_f_sprintf.singleton.Calln(last_class, null, caller, argv);
            }

            return rb_f_sprintf.singleton.Call2(last_class, null, caller, block, recv, arg);
        }
Beispiel #2
0
        internal static object method_missing(object recv, Frame caller, string methodId, ArgList args) {
            ArgList newargs = new ArgList(args.block);
            newargs.Add(new Symbol(methodId));
            newargs.AddRange(args);

            Class origin;
            RubyMethod method = FindPrivateMethod(recv, caller, "method_missing", out origin);
            if (method != null)
                return method.body.Calln(origin, recv, caller, newargs);
            else
                throw new NoMethodError("method_missing method missing").raise(caller);
        }
Beispiel #3
0
        public override object Call(Class last_class, object recv, Frame caller, Proc block, Array rest)
        {
            Class klass0 = Class.CLASS_OF(recv).class_real();
            object members = klass0.instance_variable_get("__members__");

            if (!(members is Array))
                throw new TypeError("members field of struct is not an Array").raise(caller);

            Array values = new Array();

            if (((Array)members).Count > 0)
            {
                foreach (object m in (Array)members)
                {
                    string id = Symbol.rb_to_id(caller, m);
                    values.Add(((Object)recv).instance_variable_get(id));
                }
            }

            ArgList args = new ArgList();
            args.AddRange(rest.value);
            return rb_ary_values_at.singleton.Calln(last_class, values, caller, args);
        }